[Hong]Spring에서 Handler

홍석진·2021년 6월 21일
0

Spring

목록 보기
2/6

스프링 MVC 형식으로 코드를 수정하던 중에 핸들러의 개념에 대해서 잘 모르는 것 같아서 찾아보고 정리해보고자 합니다..

Handler

핸들러.. 그냥 직역하면 '처리하는 취급자' 이런느낌입니다. 스프링에서는 뜻 그대로 웹요청을 처리해서 Handler라는 이름이 붙었다고 합니다. 처음에 제가 헷갈렸던 것은 핸들러와 컨트롤러의 개념의 차이를 잘 몰라서 컨트롤러랑 핸들러의 역할을 분간하지 못했던 것 같습니다. 웹요청 처리는 컨트롤러가 한다고 알고 있었고 그럼 핸들러는 뭐지..라고 생각했던 저는 이번 정리를 통해서 컨트롤러는 일종의 핸들러인 셈이고 핸들러는 스프링 MVC에서 웹 요청을 처리하는 객체를 가장 큰 범위에서 부르는 용어라는걸 알게 되었습니다.

HandlerMapping

웹요청 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

  • MultiActionController을 이용하면 디렉토리 단위의 URL을 사용할수 있다.

관련 내용정리가 귀찮아서 괜찮은 사이트 있어서 링크로 대체한다.

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>
profile
질문이나 의견이 있으시면 남겨주세요. 서로의 발전이라고 생각합니다.

0개의 댓글