티스토리 뷰

스프링에서의 역할 분담, WebApplicationContext와 연관된 글.

그저 좋다는 말에..

한창 스프링을 배우기 시작할 무렵에 복잡한 XML 설정을 자바 애노테이션 기반으로 간단하게 하겠다고 의미도 모른 채 @Autowired, <context:annotation-config /> 같은 태그를 썼던 기억이 난다.
많은 고민 끝에 결과적으로 현재는 주로 <context:component-scan /> 태그를 사용하고 있고, 이 태그를 중심으로 이번 글을 써보려 한다.

이해하기 쉬운 코드로

<context:component-scan /> 태그는 설정 과정이 을 선언하는 방식보다 이해하기 쉽고 직관적이다.
이해하기 쉬운 코드가 되기 위해선 연관이 있는 부분들이 가까워야 한다고 생각하는데, XML 방식으로 하다 보면 빼먹거나 중복되는 설정을 못 보고 지나칠 가능성이 높다.
반면에, @Component를 비롯한 @Repository, @Service, @Controller는 선언하고자 하는 Java 코드에 용도에 맞게 직관적으로 선언을 하기 때문에 알아보기에도, 코드를 이해하기에도 더욱 편하다.

@Component 관계도
위의 그림을 보면 각 애노테이션의 관계를 알 수 있는데, @Component가 포괄적인 선언이라면 @Repository, @Service, @Controller는 각각의 역할에 더욱 집중된 선언이다.

<context:component-scan /> 살펴보기

기본적인 사용법은 WebApplicationContext XML 파일에 아래와 같이 선언한다.

1
<context:component-scan base-package="com.first" />
cs

base-package에 component-scan을 할 패키지 경로를 명시해주면 해당 경로를 포함한 모든 하위 경로에 적용되고, 애노테이션을 명시한 자바 파일들이 Bean으로 동록 되어 사용 가능해진다.
하나 더 나아가서, 지난 글에서 언급한 계층 관계 컨텍스트에도 적용해보도록 하자.

Servlet WebApplicationContext

1
2
3
4
servlet-context.xml
<context:component-scan base-package="com.first" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
cs

앞서 Servlet WebApplicationContext에는 주로 View 자원을 구성한다고 하였는데, 쉽게 말해서 Controller에 관한 설정만 한다고 볼 수 있다.
위의 코드를 살펴보면 context:component-scan 태그에 use-default-filters 속성을 볼 수 있는데, 이름 그대로 해당 패키지에 기본 필터를 적용할지 여부를 설정하는 부분이다.
다음으로, 하위 태그를 살펴보면 context:include-filter 태그가 있는데 이는 context:component-scan에 설정된 기본 필터 이외에 필터를 추가하기 위한 설정 부분이다.

이를 통해 위의 코드를 다시 해석해보면, "com.first"에 해당하는 모든 하위 경로에 component-scan의 기본 필터를 제외하고 annotation 타입의 Controller 필터만 추가한다는 의미이다.

Root WebApplicationContext

1
2
3
4
root-context.xml
<context:component-scan base-package="com.first">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
cs

Root WebApplicationContext에는 View 자원 이외의 자원들을 구성한다고 하였는데, 쉽게 말해서 Controller를 제외한 나머지 설정들을 한다고 볼 수 있다.
위의 코드를 살펴보면 context:component-scan 태그에 use-default-filters 속성의 기본값이 true이기 때문에 따로 명시하지 않아도 된다.
다음으로, 하위 태그를 살펴보면 context:exclude-filter 태그가 있는데 이는 context:component-scan에 포함된 기본 필터 중 특정한 필터를 제외하기 위한 설정 부분이다.

이를 통해 위의 코드를 다시 해석해보면, "com.first"에 해당하는 모든 하위 경로에 component-scan의 기본 필터를 사용하고 annotation 타입의 Controller 필터만 제외한다는 의미이다.

참조

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함