day4 class01 어노테이션 기반 MVC 개발
스프링은 어노테이션 기반 설정을 제공함으로써 과도한 XML 설정으로 인한 문제를 해결한다. Spring MVC도 스프링 설정파일에 HandlerMapping, Controller, Viewresolver 같은 여러 클래스를 등록해야 하므로 어노테이션 설정을 최대한 활용하여 XML 설정을 최소화할 필요가 있다.
1. 어노테이션 관련 설정
1) presentation-layer.xml에 context 네임스페이스를 추가한다.
2) presentation-layer.xml에 HandlerMapping, Controller, ViewResolver 클래스에 대한 <bean> 등록을 모드 삭제한다.
3) presentation-layer.xml에 view의 Controller 클래스가 스캔 범위(<context:component-scan>)에 포함되도록 한다.
4) getBoard.jsp와 getBoardList.jsp를 src/main/webapp 폴더로 되돌려 놓는다.
1 2 3 4 5 6 7 8 9 10 | <?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 |
2. @Controller 사용하기
- <bean>등록 필요 없이 어노테이션 @Controller을 이용하여 컨트롤러 객체를 자동으로 생성해준다.
> @Controller를 사용하지 않는다면 모든 컨트롤러 클래스는 반드시 스프링에서 제공하는 Controller 인터페이스를 구현해야 한다.(implements Controller) 그리고 handleRequest() 메소드를 재정의하여 DispatcherServlet이 모든 Controller의 handleRequest()메소드를 호출 할 수 있도록 해야한다.
> 이는 스프링 프레임워크가 지향하는 POJO 스타일의 클래스가 아니다. POJO가 아닌 대표적인 예가 자바 서블릿코드를 작성할 때 반드시 HttpServlet을 상속받는 것이다.
3. @RequestMapping 사용하기
- @Controller를 클래스 위에 추가함으로써 InsertBoardController 객체를 생성하고 Controller로 인식하게 할 수는 있지만, 클라이언트의 "/insertBoard.do"요청에 대해서 insertBoard() 메소드가 실행되도록 할 수는 없다.
- value 속성은 생략할 수 있으며 특별한 경우가 아니면 대부분 생략한다.
- @RequestMapping응 이용하여 HandlerMapping 설정을 대체한다.
4. 클라이언트 요청 처리
- 대부분 Controller는 사용자의 입력 정보를 추출하여 VO(value Object) 객체에 저장한다. 그리고 비즈니스 컴포넌트의 메소드를 호출할 대 VO객체를 인자로 전달한다.
- 사용자가 입력하는 정보가 많거나 변경되는 상황에 사용자 입력 정보가 많으면 그만큼의 자바코드가 필요할 것이고, 입력 정보가 변경될 때마다 Controller 클래스는 수정되어야 한다.
- 하지만 Command 객체를 이용하면 해결할 수 있다.
> Command 객체는 Controller 메소드 매개변수로 받은 VO 객체라고 보면된다.
> 스프링 컨테이너가 insertBoard() 메소드를 실행할 때 Command 객체를 생성하여 넘겨준다. 그리고 이때 사용자가 입력한 값들을 Command 객체에 세팅까지 해서 넘겨준다. 결과적으로 사용자 입력 정보 추출과 VO객체 생성, 그리고 값 설정을 모두 컨테이너가 자동으로 처리하는 것이다.
- form 태그 안(insertBoard.jsp)의 파라미터 이름과 Command 객체(BoardVO)의 setter 메소드의 이름이 반드시 일치해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.springbook.view.board; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.springbook.biz.board.BoardVO; import com.springbook.biz.board.impl.BoardDAO; @Controller public class InsertBoardController { @RequestMapping(value="/insertBoard.do") public void insertBoard(BoardVO vo) { System.out.println("글 등록 처리"); BoardDAO boardDAO = new BoardDAO(); boardDAO.insertBoard(vo); } } | cs |