A.1 URL과 @RequestMapping 연결하기
스프링 MVC에서는 @Controller 어노테이션이 붙은 클래스 안에 @RequestMapping 어노테이션이 붙은 메서드에서 클라이언트 요청을 처리하게 된다.
클라이언트가 URL을 입력하고 웹 서버에 서비스를 요청하면 서블릿 컨테이너가 해당 URL의 웹 컨텍스트를 찾고, 해당 웹 컨텍스트는 스프링 ApplicationContext에게 URL 중에 /를 처리할 수 있는 @RequestMapping(value = "/")를 가진 메서드에게 처리를 위임한다.
@ResponseBody는 반환하는 문자열을 그대로 클라이언트, 즉 브라우저에게 전달하라는 뜻이다.
A.4 서비스 구현
DAO는 데이터베이스 테이블당 하나를 만들게 된다. 대부분의 경우 하나의 서비스가 하나의 DAO와 관계를 맺게 된다.
확장성과 유연성을 고려하면 서비스를 작성하는 것이 실보다 득이 더 많음.
MVC에서 모델(Model)은 컨트롤러에서 뷰로 전달해주는 정보이다.
스프링 MVC에서 모델을 생성하는 것은 DispatcherServlet의 역할이다.
DispatcherServlet이 생성한 모델에 대한 참조 변수는 @RequestMapping 어노테이션이 붙은 메서드에서 인자만 선언하기만 하면 자동으로 받을 수 있음.
@RequestMapping(value="/board/list")
public String list(Model model) {
model.addAttribute("boardList", boardService.list());
return "/board/list";
}
A.6 읽기 구현
PathVariable은 @PathVariable 어노테이션을 사용하여 다음과 같이 구할 수 있다.
@RequestMapping(value="/board/read/{seq}")
public String read(Model model, @PathVariable int seq) {
model.addAttribute("boardVO", boardService.read(seq));
return "/board/read";
}
Post 요청을 처리하는 메서드에서는 BindingResult의 인스턴스를 인자로 받고 있다.
BindingResult는 boardVO에 사용자로부터 입력된 값을 바인딩할 때 오류가 발생하는 경우 오류 내용을 자동으로 저장해서 갖고 있게 된다.
자바(JSR-303)이라는 자바 규약에서 지원하는 유효성 검증(Validation)
@RequestMapping(value="/board/write", method=RequestMethod.POST)
public String write(@Valid BoardVO boardVO, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
return "/board/write";
} else {
boardService.write(boardVO);
return "redirect:/board/list";
}
}
POST의 요청을 리디렉션(Redirect)해서 GET 요청으로 보내는 것을 PRG(POST-Redirect-GET) 패턴이라고 한다.
리다이렉트하지 않으면 -> 뷰 힌트가 "/board/list"인 경우 화면 새로 고침을 누르면 POST 요청이 서버로 전송되고, 같은 글이 다시 DB에 저장됨.
@SessionAttributes("BoardVO")
boardVO라는 이름으로 객체가 MVC의 모델에 추가할 때, 세션에도 BoardVO를 저장하라고 지정함.
@ModelAttribute BoardVO boardVO
POST 요청을 처리하는 edit() 메서드의 인자, HttpServletRequest를 이용해 자동으로 바인딩 됨. @SessionAttributes에서 boardVO가 지정된 경우 세션에 의한 바인딩이 먼저 실행되고, HttpServletRequest에 있는 정보로 갱신됨
'📗 BOOK > 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
부록 B - 자바 8 람다와 인터페이스 스펙 변화 (0) | 2022.04.22 |
---|---|
07 스프링 삼각형과 설정 정보 (0) | 2022.04.15 |
06 스프링이 사랑한 디자인 패턴 (0) | 2022.04.08 |
05 객체 지향 설계 원칙 - SOLID (0) | 2022.04.08 |
04 자바가 확장한 객체 지향 (0) | 2022.03.25 |