빠에야는 개발중
스프링 퀵 스타트 : chap 4-1 본문
어노테이션 기반 MVC
스프링은 xml을 통한 설정이 많다. 그래서 xml의 볼륨이 커지기 쉽고 비례적으로 복잡해진다. 따라서 이번에는 어노테이션 설정을 통해서 xml 파일을 날씬하게 만들어본다.
컨트롤러 설정
우선 presentation-layer.xml의 컨트롤러, handler mapping, view resolver 설정을 모두 지우고, 으로 대체한다. 패키지는 com.springbook.view로 설정한다.
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:component-scan base-package="com.springbook.view"></context:component-scan> </beans> | cs |
그 다음 각 컨트롤러들을 하나로 모아서 BoardController로 묶어준 뒤, @Controller 어노테이션을 붙여준다. 이것만으로도 해당 클래스는 스프링 컨테이너에 의해 컨트롤러로 인식된다. @RequestMapping을 사용하여 호출 uri를 지정해줄 수 있다. 이전에 handlerMapping이 하던 일이다.
추가적으로 메소드의 통일성을 위해 getBoard와 getBoardList 메소드의 리턴형을 ModelAndView에서 다른 메소드들과 같은 String으로 해주었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //위 생략 @Controller public class BoardController { @RequestMapping("/insertBoard.do") public String inseretBoard(BoardVO vo, BoardDAO boardDAO) { boardDAO.insertBoard(vo); return "getBoardList.do"; } @RequestMapping("/updateBoard.do") public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO boardDAO) { boardDAO.updateBoard(vo); return "getBoardList.do"; } @RequestMapping("/deleteBoard.do") public String deleteBoard(BoardVO vo, BoardDAO boardDAO) { boardDAO.deleteBoard(vo); return "getBoardList.do"; } @RequestMapping("/getBoard.do") public String getBoard(BoardVO vo, BoardDAO boardDAO, Model model) { model.addAttribute("board", boardDAO.getBoard(vo)); return "getBoard.jsp"; } @RequestMapping("/getBoardList.do") public String getBoardList(BoardDAO boardDAO, Model model) { model.addAttribute("boardList", boardDAO.getBoardList()); return "getBoardList.jsp"; } } | cs |
스프링의 컨트롤러 어노테이션을 사용하게 되면서 Controller 인터페이스를 사용할 필요가 없어졌다. 이에 따라 이전에 사용하던 HttpServletRequest와 HttpServletRequest는 필요가 없어졌고, 대신에 커맨드 객체를 사용한다.
컨트롤러 메소드의 매개변수로 클래스를 넘기면 스프링 컨테이너가 그 클래스의 객체를 생성해서 넘겨준다. 그리고 그 과정에서 사용자가 입력한 값도 세팅된다. 이 때 값이 입력되려면 setter 메소드의 이름과 입력하는 값이 이름이 같아야 한다.
몇 가지 어노테이션들
@RequestParam
@RequestParam은 객체에 포함되지 않은 파라미터 정보도 받을 수 있도록 하는 어노테이션이다.
1 2 3 4 5 6 7 8 9 10 | @RequestMapping("/getBoardList.do") public String getBoardList( @RequestParam(value="searchCondition", defaultValue="", required=false) String condition, @RequestParam(value="searchKeyword", defaultValue="", required=false) String keyword, BoardDAO boardDAO, Model model) { System.out.println("검색 조건 : " + condition); System.out.println("검색 단어 : " + keyword); model.addAttribute("boardList", boardDAO.getBoardList()); return "getBoardList.jsp"; } | cs |
@ModelAttribute
@ModelAttribute를 사용하면 커맨드 객체의 접근 변수명을 설정해줄 수 있다. 기존에는 클래스명에서 맨 앞글자를 소문자로 바꾼 형태였는데 이를 자유자재로 바꿀 수 있는 것이다. 또한 메소드에 설정하면 @RequestMapping이 붙은 메소드 보다 먼저 호출된다는 특징이 있다.
1 2 3 4 5 | @RequestMapping("/updateBoard.do") public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO boardDAO) { boardDAO.updateBoard(vo); return "getBoardList.do"; } | cs |
1 2 3 4 5 6 7 | @ModelAttribute("conditionMap") public Map<String, String> searchConditionMap() { Map<String, String> conditionMap = new HashMap<>(); conditionMap.put("제목", "TITLE"); conditionMap.put("내용", "CONTENT"); return conditionMap; } | cs |
@SessionAttribute
@SessionAttribute는 이름을 지정하여 그 이름을 가진 모델을 발견하면 세션에 그 정보를 저장해두는 어노테이션이다.
기타 추가사항
한 컨트롤러에서 같은 uri를 사용하더라도, http 메소드에 따라 기능을 구분시켜줄 수 있다. 아래 코드는 GET과 POST의 동작을 따로 나눈 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Controller public class LoginController { @RequestMapping(value="/login.do", method=RequestMethod.POST) public String login(UserVO vo, UserDAO userDAO, HttpSession session) { System.out.println("로그인 인증 처리..."); if(userDAO.getUser(vo) != null) { session.setAttribute("userName", userDAO.getUser(vo).getName()); return "getBoardList.do"; } else { return "login.jsp"; } } @RequestMapping(value="/login.do", method=RequestMethod.GET) public String loginView(UserVO vo) { System.out.println("로그인 화면으로 이동"); vo.setId("test"); vo.setPassword("test123"); return "login.jsp"; } } | cs |
'공부 > 스프링' 카테고리의 다른 글
스프링 퀵 스타트 : chap 5-1 (0) | 2018.02.04 |
---|---|
스프링 퀵 스타트 : chap 4-2 (1) | 2018.02.01 |
스프링 퀵 스타트 : chap 3-2 (1) | 2018.01.30 |
스프링 퀵 스타트 : chap 3-1 (379) | 2018.01.29 |
스프링 퀵 스타트 : chap 2-2 (406) | 2018.01.27 |