📗 BOOK/스프링 입문을 위한 자바 객체 지향의 원리와 이해

부록 A - 스프링 MVC를 이용한 게시판 구축

미미누 2022. 4. 22. 21:22

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에 있는 정보로 갱신됨