어노테이션을 이용한 MVC
어노테이션을 이용한 MVC
사용이유: 과도한 XML 설정을 방지..
방법:
1. 설정 파일(xml) 문서에 context xml namespace를 추가
2. 설정 파일 내부에 <bean></bean> 으로 등록된 객체들 대신
<context:component-scan base-package=""></context:component-scan> 로 대체하여 지정한 패키지의 하위까지 검색하여 자동으로 객체들을 등록할 수 있도록 설정.
예) <context:component-scan base-package="com.lsj.view"></context:component-scan>
3. 컨트롤러 역학을 담당하는 모든 클래스 선언부 위에 @Controller 어노테이션을 추가하여 DispatcherServlet이 인식할 수 있는 컨트롤러 객체로 만든다.
만약 @Controller 어노테이션을 사용하지 않을 경우,
스프링이 제공하는 Controller 인터페이스를 구현받아야 한다!!
또한 handleRequest() 메서드에 대한 재정의가 필요.
4. 사용자 요청에 따른 자동 호출 메서드 설정
예) "/insertBoard.do" 요청이 들어왔을 때
=> insertBoard() 를 자동 호출 할 수 있도록 설정
@RequestMapping(value="/insertBoard.do")
public void insertBoard(HttpServletRequest request){
~~~
}
@RequestMapping(value="/insertBoard.do")
"/insertBoard.do" 요청이 들어왔을 때 해당 메서드가 호출될 수 있도록 매핑!!
이 때 사용자로부터 입력된 값은 매개 변수인 HttpServletRequest request의 param 영역으로 전달됨!
value 값을 적지 않아도 진행을 잘 되지만,
사용자로부터 "/insertBoard.do"와 같이 요청사항이 전달되면, 스프링 컨테이너는
모든 컨트롤러 객체들의 내부에 @RequestMapping이 설정된 메서드들 중 "insertBoard"와 동일한 메서드를
검색하기 때문에, 검색시간을 최소화하려면 value를 이용하여 명시하는 것이 좋다.
case
일반적으로 사용자의 입력 값이 고정적일 경우에는 VO 객체를 이용하여 DAO와 주고 받지만,
사용자의 입력값이 다양할 경우, VO 객체를 여러가지 선언해야 하는 단점이 발생!!
즉, 사용자 입력값이 4개 일 경우,
request.getParameter()가 4번 호출되어야 하고,
사용자 입력값이 3개 일 경우,
request.getParameter()는 3번 호출되어야 하기 때문에,
사용자 입력값이 변경될 때마다
Controller 클래스의 메서드 코드는 매번 수정되어야 한다.
이 단점을 해결할 수 있도록 제공되는 객체가 Commnad 객체!! ( = VO)
이 단점을 해결하기 위해서는 insertBoard()의 매개변수 타입을 BoardVO 타입으로 변경
=> 스프링 컨테이너가 insertBoard()를 호출할 때 사용자 입력값들을 Command 객체에 넘겨주고
=> 이 Command 객체를 insertBoard(BoardVO vo) 의 매개변수인 vo 변수에게 전달하여
=> 자동매핑 되도록 한다.
* * * * *
이와 같이 사용하려면 반드시 BoardVO 내부의 멤버변수명과
사용자 입력을 받는 <input name=""> 의 name 값이 일치해야 한다..
또한 BoardVO 객체의 멤버변수는 반드시 private이어야 하고,
해당 getter/setter 메서드가 선언되어 있어야 한다!!
서블릿객체의 메서드가 호출되는 과정
요청(파라미터)
=> Spring Container
=> Commnad => 파라미터명을 보유하는 VO 클래스 검색
=> VO 클래스를 이용하여 VO 객체 생성
=> VO객체의 setter 메서드를 이용하여 입력값을 저장
=> VO객체를 해당 메서드의 매개변수에게 전달