2020. 8. 3. 19:32ㆍSpring/Spring
1. 어노테이션 MVC 설정
context 네임스페이스 추가 후 모든 Controller 클래스가 스캔 범위에 포함되도록 설정한다. 그리고 ViewResolver를 위해 변경한 jsp 파일(getBoard.jsp, getBoardList.jsp) 위치를 다시 webapp 폴더 하위로 되돌려 놓는다.
/src/main/webapp/WEB-INF/config/
presentation-layer.xml
2. 어노테이션 MVC 적용 (1)
1) @Controller
스프링 컨테이너가 Controller 클래스를 생성하게 하기 위해서 <bean>등록을 하였지만, 어노테이션을 이용하여 등록할 수 있다. @Component를 상속받은 어노테이션이며 객체를 생성하고 DispatcherServlet이 인식하는 Controller 객체로 만들어준다. 해당 어노테이션을 사용하지 않을 경우 기존 방식과 동일하게 Controller 인터페이스의 handleRequest() 메서드를 구현해주어야 한다.
/src/main/java/
InsertBoardController.java
2) @RequestMapping
@Controller 어노테이션을 이용한 경우 객체를 생성하고 Controller로 인식만 했을 뿐, insertBoard() 메서드가 실행되도록 설정은 못한다. 따라서 기존에는 HandlerMapping을 이용하여 클라이언트 요청에 대해 매핑을 진행을 했지만, HandlerMapping을 @RequestMapping으로 대체한다. value 속성을 이용하여 '/insertBoard.do' 요청이 올 경우 매핑을 한다.
/src/main/java/
InsertBoardController.java
3) 클라이언트 요청 처리
Controller는 사용자의 입력 정보를 추출하여 VO 객체에 저장하고 호출할 때는 VO 객체를 인자로 전달한다. 추출은 HttpServletRequest의 getParameter() 메서드를 이용했지만, 여기서 사용자의 입력정보가 많거나 변경되는 상황일 경우 부담이 되는 문제가 있다. 이러한 문제를 Command 객체를 이용하여 해결을 할 수 있다.
Command 객체는 Controller 매개변수로 받은 VO 객체로 생각하면 된다. 즉, 사용자가 입력한 값을 스프링 컨테이너가 Command 객체를 생성하여 알아서 넘겨주고 세팅해준다.
/src/main/java/
InsertBoardController.java
여기서 중요한 점은 Form 태그 안에 파라미터 이름과 Command 객체의 Setter 메서드 이름이 반드시 일치해야한다.
/src/main/webapp/
insertBoard.jsp
4) 요청 처리 동작 과정
서블릿 컨테이너의 경우 HTTP 요청에 HttpServletRequest 객체를 생성하고 정보를 저장한다. 이 후 DispatcherServlet에서 저장한 객체를 인자로 넣는 방식이라면, 스프링 컨테이너의 경우 사용자의 입력 정보를 추출하여 VO 객체에 Setter 메서드가 호출되면서 값이 저장이되고 생성된 VO 객체를 Controller의 메서드 인자로 전달된다.
3. 어노테이션 MVC 적용 (2)
1) 글 등록 기능
Command 객체로 받기 위한 BoardVO와 데이터베이스 연동을 위한 BoardDAO도 매개변수로 선언했다. Command 객체와 동일하게 데이터베이스 연동을 위한 처리도 스프링 컨테이너에서 객체 생성 후 전달해준다.
/src/main/java/
InsertBoardController.java
2) 글 목록 기능
/src/main/java/
GetBoardListController.java
3) 글 상세 기능
/src/main/java/
GetBoardController.java
4) 글 수정 기능
/src/main/java/
UpdateBoardController.java
5) 글 삭제 기능
/src/main/java/
DeleteBoardController.java
6) 로그인 기능
/src/main/java/
LoginController.java
7) 로그아웃 기능
/src/main/java/
LogoutController.java
8) Controller 통합 및 패키지 파일 정리
/src/main/java/
BoardController.java
4. 요청 방식에 따른 처리 및 어노테이션
1) 로그인 기능
클라이언트가 GET 방식으로 입력을 요청 시 입력 화면을, 입력을 제출 시 POST 방식으로 요청할 때 사용한다.
/src/main/java/
LoginController.java
Command 객체에서 저장된 데이터를 JSP에서 사용하기 위해서 '${...}' 구문을 이용한다. 테스트를 위해 index.jsp 파일을 생성하여 확인해본다. 클라이언트 요청 시 기본적으로 GET 방식으로 진행된다. GET 방식으로 진행될 경우 LoginController의 loginView() 메서드가 동작하는 걸 확인할 수 있다.
/src/main/webapp/
login.jsp, index.jsp
로그인 페이지로 넘어가면서 자동으로 입력란에 값이 들어간다.
구현 화면
2) Servlet API
사용자가 입력한 정보를 추출하기 위해 HttpServletRequest 대신 Command 객체를 사용했다. 하지만 HttpServletRequest 객체는 사용자가 입력한 정보를 추출하는 것 뿐만 아닌, 다양한 메서드를 이용하여 Controller를 구현해야 할 때도 사용한다. 스프링 MVC에서는 Controller 메서드 매개변수로 다양한 Servlet API를 사용할 수 있다.
로그인 성공 시 사용자의 이름을 세션에 저장한고 홤녀에 출력한다.
/src/main/java/
LoginController.java
/src/main/webapp/
getBoardList.jsp
구현 화면
3) Controller 반환 타입
지금까지 ModelAndView 객체로 반환을 하거나 String으로 반환했다. 일반적으로 대부분의 프로젝트는 통일성있는 코드를 중요시 하기 때문에 반환 타입도 동일하게 통일하여 사용한다. 코드의 간결함을 위해 ModelAndView 타입보다는 String 타입으로 반환한다.
ModelAndView에서 Model로 변경하면서 Model에 저장된 데이터는 JSP 화면에서 사용할 수 있다.
/src/main/java/
BoardController.java
4) @RequestParam
Command 객체를 사용하면 클라이언트에서 넘겨준 요청 파라미터 정보를 받아낼 수 있다. 이를 위해 요청 파라미터와 매핑될 변수와 Setter 메서드가 Command 클래스에 선언되어 있어야 한다.
만약 Command 객체에 없는 파라미터를 Controller 클래스에서 사용한다면, @RequestParam 어노테이션을 이용하여 사용할 수 있다. @RequestParam은 Command 클래스에 없는 파라미터 정보를 추출할 수 있다. 더 쉽게 설명하자면, HttpServletRequest의 getParameter() 메서드와 동일한 기능을 하는 어노테이션이라고 생각하면 쉽다.
searchCondition, searchKeyword 변수와 Setter 메서드는 BoardVO 객체에 정의되어있지 않다.
/src/main/webapp/
getBoardList.jsp
@RequestParam의 value 속성은 화면으로 전달될 파라미터 이름, defaultValue 속성은 화면으로 전달될 파라미터가 없을 때 기본값, required 속성은 생략 여부를 뜻한다.
만약, @RequestParam을 사용하기 싫다면, BoardVO 클래스에서 searchCondition, searchKeyword 변수와 Setter 메서드를 설정하면 된다.
/src/main/java/
BoardController.java
5) @ModelAttribute
스프링 컨테이너가 생성하는 Command 객체의 이름은 소문자로 변형된 클래스 이름과 동일한다. 따라서 login.jsp 화면에서 UserVO 객체는 '${userVO.id}' 형태로 사용했다. 만약 Command 객체명을 변경을 하고 싶다면 @ModelAttribute 어노테이션을 사용하여 변경할 수 있다.
/src/main/java/
LoginController.java
/src/main/webapp/
login.jsp
@ModelAttribute 어노테이션은 Command 객체의 이름 변경뿐만이 아닌, View에서 사용할 데이터를 설정하는 용도로도 사용된다. @RequestMapping 어노테이션보다 @ModelAttribute 어노테이션이 설정된 메서드가 먼저 호출되고, 호출된 메서드의 결과로 반환된 객체는 자동으로 Model에 저장된다.
검색 조건을 JSP 파일(<select>, <option> 태그)에서 처리하는 것이 아닌 클래스에서 직접 처리할 수 있다. 클라이언트에서 요청이 들어오면 @ModelAttribute 메서드가 먼저 실행이 되고, 메서드에서 반환한 값을 Model에 저장한 뒤 클라이언트에서 요청한 메서드가 실행이 된다.
/src/main/java/
BoardController.java
/src/main/webapp/
getBoardList.jsp
6) @SessionAttribute
@SessionAttribute 어노테이션은 수정 작업을 할 때 사용한다. 상세 화면에서 게시글을 수정 작업 중, 사용자가 입력한 정보가 제목과 내용만 작성했을 때, 작성자의 정보는 전달되지 않게 된다. 여기서, 작성자의 정보가 전달되지 않을 경우 null로 수정이 된다. 이러한 null값 방지를 위해 @SessionAttribute 어노테이션을 사용한다.
@SessionAttribute 어노테이션은 Model에 'board'라는 이름으로 저장되는 데이터가 있을 경우, 그 데이터를 세션에도 자동으로 저장하도록 하는 설정이다. 즉, 수정하기 위해 글 상세 화면으로 넘어가면서 실행되는 getBoard() 메서드에서, board라는 BoardVO 객체가 저장이 되고, 세션에도 board라는 이름으로 BoardVO 객체가 저장이 되도록 한다. 이 후 updateBoard() 메서드를 호출할 때, 스프링 컨테이너는 @ModelAttribute("board") 설정을 먼저 해석하여 board라는 이름의 저장된 데이터의 존재를 확인하고 있을 경우 vo 변수에 할당하도록 한다.
/src/main/java/
BoardController.java
[참고] 스프링 퀵 스타트
'Spring > Spring' 카테고리의 다른 글
[Spring] 파일 업로드, 예외 처리 (0) | 2020.08.05 |
---|---|
[Spring] 프레젠테이션 레이어와 비즈니스 레이어 통합, 검색 기능 (0) | 2020.08.05 |
[Spring] 스프링 MVC 구조 (0) | 2020.08.03 |
[Spring] EL/JSTL JSP 처리 (0) | 2020.08.02 |