빠에야는 개발중

스프링 퀵 스타트 : chap 4-1 본문

공부/스프링

스프링 퀵 스타트 : chap 4-1

빠에야좋아 2018. 1. 31. 15:59

어노테이션 기반 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=falseString condition, 
        @RequestParam(value="searchKeyword", defaultValue="", required=falseString 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<StringString> searchConditionMap() {
    Map<StringString> 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
Comments