티스토리 뷰

카테고리 없음

[Spring]Handler Mapping

박강균 IT 2021. 4. 8. 18:08

Dispatcher Servlet이 요청에대한 공통작업을 처리하는 공간이라면 

디스패처가 받은 요청을 Contrller로 보낼때 어떤 룰로 컨트롤로에게 보내는지(매핑하는지)

그 방법을 정해주는 클래스가 바로 Handler입니다. 

만약 어떤 요청이 있고 그것을 url과 연결시켜준다면

핸들러 매핑이 개입했을 확률이 1200%입니다. 

Spring에서 제공해주는 Handler매핑의 종류는 4가지가 있습니다.

- BeanNameUrlHandlerMapping

- ControllerClassNameHandlerMapping

- SimpleUrlHandlerMapping

- DefaultAnnotationHandlerMapping

하나씩 살펴보도록 할게요 

BeanNameUrlHandlerMapping

빈의 이름에 들어 있는 URL을 HTTP 요청의 URL 과 비교해서 일치하는 빈을 찾아 준다.

가장 직관적이고 사용하기 쉬운 핸들러 매핑 전략이다. 

 URL 에는 ANT 패턴이라고 불리는, *나 **, ? 와 같은 와일드 카드를 사용하는 패턴을 넣을 수 있다.

예를 들어 다음 빈 선언은 /s 로 시작하는 /s, /s1, /sabcd 같은 URL 에 매핑된다.

<bean name="/s*" class="com.happyhouse....Controller">


** 는 하나 이상의 경로를 지정할 때 사용한다. 다음 매핑은 /root/sub, /root/a/sub, /root/a/b/c/d/sub 를 모두 매핑해 준다.

<bean name="/root/**/sub" class="com.happyhouse....Controller">


반면에 컨트롤러 개수가 많아지면 URL 정보가 XML 빈 선언이나 클래스의 애노테이션 등에 분산되어 나타나므로 전체적인 매핑구조르르 한눈에 파악하고 관리하기 불편하다. 따라서 복잡한 애플리케이션에서는 잘 사용하지 않는다.

ControllerBeanNameHandlerMapping

ControllerBeanNameHandlerMapping 은 빈의 아이디나 빈 이름을 이용해 매핑해주는 핸들러 매핑 입니다.

 다음과 같이 컨트롤러 빈이 선언되어 있다면, ControllerBeanNameHandlerMapping 은 hello 빈을 /hello URL 에 매핑해 줍니다.

<bean id="hello" class="com.exam....Controller">

다음과 같이 스테레오타입 애노테이션을 이용해 설정해도 /hello 에 매핍이됩니다.

@Component("hello")

public class MyController implements Controller {



        ...

}

 ControllerBeanNameHandlerMapping 은 빈 이름 앞뒤에 붙일 수 있는 prefix, suffix 를 지정할 수 있다. URL 이 모두 /app/sub/로 시작한다면 이를 ControllerBeanNameHandlerMapping 의 prefix 프로퍼티에 아래와 같이 등록해주면 위의 MyController 빈은 /app/sub/hello URL 에 매핑된다.

<bean class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping">

    <property name="urlPrefix" value="/app/sub/"/>

</bean>

이렇게 특정 전략 클래스를 빈으로 등록한 경우에는 디폴트 전략은 모두 무시된다는 점에 주의해야 합니다.

ControllerClassNameHandlerMapping

 ControllerClassNameHandlerMappping 은 빈 이름 대신 클래스 이름을 URL에 매핑해 주는 핸들러 매핑 클래스다.

 다음과 같은 컨트롤러 클래스는 '/hello' URL 에 매핑된다. 기본적으로는 클래스 이름을 모두 URL로 사용하지만 Controller 로 끝날 때는 Controller 를 뺀 나머지 이름을 URL 에 매핑해 준다.

public class HelloController implements Controller{ ... }

 디폴트 전략이 아니므로 ControllerClassNameHandlerMapping 을 빈으로 등록해줘야 한다.

SimpleUrlHandlerMapping

 BeanNameUrlHandlerMapping 은 빈 이름에 매핑정보를 넣기 때문에 매핑정보를 관리하기 불편하다는 단점이 있다. 

SimpleUrlHandlerMapping 은 URL 과 컨트롤러의 매핑정보를 한 곳에 모아 놓을 수 있는 핸들러 매핑 전략이다. 

 매핑정보는 SimpleUrlHandlerMapping 빈의 프로퍼티에 넣어준다.

 디폴트 핸들러 매핑 전략이 아니기도 하고 프로퍼티에 매핑정보를 직접 넣어줘야 하므로 SimpleUrlHandlerMapping 빈을 등록해야 사용할 수 있다.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <property name="mappings">

        <props>

            <prop key="/hello">helloController</prop>

            <prop key="/sub/*">myController</prop>

            <prop key="deep/**/sub">subController</prop>

        </props>

    </property>

</bean>



<bean id="helloController" .../>

<bean id="myController" .../>

<bean id="subController" .../>

 mappings 프로퍼티는 Properties 타입이므로 다음과 같이 프로퍼티 파일 포멧을 이용해 간단히 프로퍼티 값을 지정할 수도 있다.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <property name="mappings">

        <value>

            /hello=helloController

            /sub/*=myController

            deep/**/sub=subController

        </value>

    </property>

</bean>



<bean id="helloController" .../>

<bean id="myController" .../>

<bean id="subController" .../>

 SimpleUrlHandlerMapping 의 장점은 매핑정보가 한 곳에 모여 있기 때문에 URL을 관리하기가 편리하다는 것이다. 그래서 컨트롤러의 개수가 많은 대규모의 프로젝트에서는 SimpleUrlHandlerMapping 을 선호하기도 한다. 단점은 매핑할 컨트롤러 빈의 이름을 직접 넣어줘야 하기 때문에 오타 등의 오류가 발생할 가능성이 있다는 것이다.

최근에 많이 사용되는 애노테이션을 이용한 매핑방식은 매핑정보를 코드에 가깝게 두지만 매핑정보 자체는 흩어져 있다. 어떤 방식이 더 낫다고 말하기는 어렵다. 프로젝트의 규모, 개발생산성, 관리 편의성, 매핑정보 오류검증 편의성 등을 종합적으로 고려해서 선택해야 한다.




참조:springsource.tistory.com/3



 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함