2009년 8월 5일 수요일

Spring에서 일반 방식 과 annotation 방식의 Controller를 동시에 사용하기

스프링에서 URL 맵핑 방식이 메타데이터 설정 측면에서 두가지 (일반 방식,annotation 방식)로 구분됩니다.

첫번째는 일반 방식으로써 BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping를 사용해서 호출 URL 맵핑
관련 빈과 컨트롤러를 XML에 설정 하는 방식 입니다.

두번째 방법은 DefaultAnnotationHandlerMapping을 사용해서 호출 URL 맵핑 관련 빈과 컨트롤러를 어노테이션을
사용해서 설정 하는 방식 입니다.

여기서는 각 빈들의 구체적인 기능에 대한 내용은 생략 하겠습니다.(관련 상세 기능들은 다른 님들의 블로그를 참고 하세요)
기능 보다 두 방식을 실무에서 어떻게 같이 사용할 수 있는지가 오늘의 관전 포인트 입니다.

실무에서 실제 경험한 것 중에서 annotation 기반으로 컨트롤러를 사용하다가 부득이한 문제로 일반 방식을
혼용해서 사용하려고 했습니다. 그런데 같이 사용할 경우 "javax.servlet.ServletException: No adapter for handler " 에러가 발생
했습니다. 그때 당시 시간이 촉박한 상황에서 억지로 dirty coding으로 구현했던 기억이 생각 납니다.
그때 느낀건 같은 목적의 다른기능 셋을 제공하는 기술은 반드시 둘이 같이 사용할수가 있는지 체크해야 한다는 걸 뼈저리게 느꼈습니다.
Anyway! 아래 설정을 통해서 동시 운영 방법을 말씀 드리겠습니다.

<!-- ANNOTATION SCAN-->
<context:annotation-config />
<context:component-scan base-package="com.beyondj2ee.framework>
<context:exclude-filter type="regex"
expression="com\.beyondj2ee\.framework\.core.+" />
</context:component-scan>

<!-- ANNOTATION HANDLE -->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
p:order="0"/>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- GENERAL HANDLE -->
<bean id="defaultControllerURLMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
p:order="1">
<property name="mappings">
<props>
<prop key="/**/*.htm">defaultViewController</prop>
<prop key="/**/*.json">defaultJSONController</prop>
</props>
</property>
</bean>

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

ANNOTATION SCAN 주석 부분은 기본적으로 스프링에서 annotation 방식을 사용하도록 하는 선언 입니다.(기능 설명 생략)
ANNOTATION HANDLE 주석 부분은 annotation 방식의 컨트롤러를 지원하기 위해서 URL 맵핑 부분과 메서드 처리를 담당하는 DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter를 선언 합니다.
GENERAL HANDLE 주석 부분은 일반 방식의 컨트롤러를 지원하기 위한 설정입니다.
여기서 오늘 제일 중요한 설정이 나옵니다. SimpleControllerHandlerAdapter 클래스 설정 입니다.
annotation을 사용하지 않을 때는 기본적으로 Dispatcher 내부적으로 SimpleControllerHandlerAdapter
암시적으로 호출 합니다. 하지만 annotation 방식과 같이 사용할 경우는 반드시 명시적으로 빈을 설정 해야 합니다.그렇지 않을 경우 에러가 발생 합니다.

각 Mapping Handler에 order 속성을 설정한건 URL 찾는 순서 입니다. 즉 저는 기본적으로 annotation
방식을 사용하고 정보가 없으면 일반 방식을 사용하란 뜻 입니다.

annotation을 사용할지 말지에 대한 논의는 여러 군데서 볼 수있습니다. "Pro Spring"에서는
annotation 방식을 지양하고 있습니다. 실제 xml 설정을 했을 경우 공수 차이가 이틀 정도
밖에 안난다고 합니다. 운영 하는데 있어서도 설정 정보가 한눈에 안보이겠죠
하지만 장점 또한 있습니다. 이렇게 둘 방식을 혼용해서 서로 장단점을 보완하면
좀더 괜찮은 프레임웍이 될것 같습니다.



댓글 없음:

댓글 쓰기