스프링 MVC 형식으로 코드를 수정하던 중에 핸들러의 개념에 대해서 잘 모르는 것 같아서 찾아보고 정리해보고자 합니다..
핸들러.. 그냥 직역하면 '처리하는 취급자' 이런느낌입니다. 스프링에서는 뜻 그대로 웹요청을 처리해서 Handler라는 이름이 붙었다고 합니다. 처음에 제가 헷갈렸던 것은 핸들러와 컨트롤러의 개념의 차이를 잘 몰라서 컨트롤러랑 핸들러의 역할을 분간하지 못했던 것 같습니다. 웹요청 처리는 컨트롤러가 한다고 알고 있었고 그럼 핸들러는 뭐지..라고 생각했던 저는 이번 정리를 통해서 컨트롤러는 일종의 핸들러인 셈이고 핸들러는 스프링 MVC에서 웹 요청을 처리하는 객체를 가장 큰 범위에서 부르는 용어라는걸 알게 되었습니다.
웹요청 Url과 Controller를 연결해주는 설정으로 DispatcherServlet에게 리턴을 해줘서 응답을 할수있게 해줍니다. HandlerMapping의 종류와 역할은 링크텍스트를 읽어보고 잘 정리가 되어있어서 옮겨보았습니다.
1) SimpleUrlHandlerMapping
URL과 Controller을 직접 맵핑해준다.
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
<property name="mappings">
<props>
<prop key="/index.do">mainController</prop>
<prop key="/test/**/*">testController</prop>
</props>
</property>
</bean>
<bean name="mainController" class="com.mungchung.MainController" />
<bean name="testController" class="com.mungchung.TestController" />
2) BeanNameUrlHandlerMapping
URL과 Bean이름을 가지고 Controller 맵핑한다.
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
</bean>
<!-- index.do URL요청은 mainController 컨트롤러 이용함 -->
<bean name="index.do" class="com.mungchung.MainController"/>
<!-- test 디렉토리(하위 디렉토리 포함)의 모든 파일은 아래 컨트롤러 이용함 -->
<bean name="/test/**/*" class="com.mungchung.TestController" />
3) ControllerBeanNameHandlerMapping
빈의 아이디나 이름을 이용해 맵핑한다.
<bean id="test" class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping"/>
@Component("test")
public class TestController implements Controller {
...
}
위와 같이 선언하면 /test URL에 맵핑해준다.
4) ControllerClassNameHandlerMapping
URL과 Controller 명을 일정한 규칙으로 맵핑함
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean class="com.mungchung.MainController" />
<bean class="com.mungchung.TestHelloController" />
위와 같이 설정하면
/main* 의 요청은 MainController에서 처리
/testHello* 의 요청은 TestHelloController에서 처리
예를 들자면 MainController에서 처리하는 URL의 예제는 아래와 같다.
/main.do
/maintest.do
/MAIN1234.html
위의 예제를 보면 알겠듯이 대소문자 구별 안하고 URL 맵핑처리 하는데 대소문자 구분이 필요하면
caseSensitive 속성을 정의해준다.
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
<property name="caseSensitive" value="true" />
</bean>
만약 URL에 특정 Path를 통해서 접속하게 하려면 pathPrefix 설정하면 된다.
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
<property name="caseSensitive" value="true" />
<property name="pathPrefix" value="/test" />
</bean>
이와 같이 하면 위에서 예시든 URL들이 아래와 같이 바뀐다.
/test/main.do
/test/maintest.do
/test/main1234.html
관련 내용정리가 귀찮아서 괜찮은 사이트 있어서 링크로 대체한다.
http://www.mkyong.com/spring-mvc/spring-mvc-multiactioncontroller-example/
4) DefaultAnnotaitonHandlerMapping
@RequestMapping 어노테이션을 이용하여 요청을 처리할 컨트롤러를 구현한다.(현재 프로젝트 이 방법 사용중...) 이방법은 POJO기반으로 작성이 되어집니다.
POJO기반이란.. (Plain Old Java Object)의 약자로 다른 클래스나 인터페이스를 상속/implements 받아 메서드가 추가된 클래스가 아닌 일반적으로 우리가 알고 있는 getter, setter 같이 기본적인 기능만 가진 자바 객체를 말합니다.
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
@Controller
@RequestMapping("/main.do")
public class AnnotationSimpleFormController {
@RequestMapping(method = RequestMethod.GET)
public String doGet(ModelMap map) {
...
}
@RequestMapping(method = RequestMethod.POST)
public String doPost(HttpServletRequest request, BindingResult errors, ModelMap map) {
...
}
}
참고!!! HandlerMapping은 서로 섞어서 사용할수 있고 이 경우 우선순위를 줄 수 있다.
<bean id="handlerMapping1" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="1"/>
</bean>
<bean id="handlerMapping2" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="2"/>
</bean>