본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Spring 컴포넌트 스캔(Spring component scan, RootContext와 ServletContext)에 대한 간단 정리

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 7. 28.

서블릿과 루트 컨텍스트 영역입니다.

 

위 사진으로 모든것이 설명이 가능합니다.

스프링이나 전자정부에서 자신이 만든 프로젝트의 파일들의 위치를 알려줄 때 <context:component-scan /> 테그를 활용 합니다.

만약 서블릿 설정 파일 1곳에서만 모든 내용을 기록하고 작업한다면 위 내용은 굳이 모르고 지나쳐도 상관은 없습니다.

그런데 프로젝트 규모가 커지고 context파일이 많아질 때 컴포넌트 스캔에서의 실수를 종종 하고는 합니다.

 

아래 사진은 전자정부 프레임워크에서 사용되는 샘플 web.xml 파일입니다.

전자정부 프레임워크에서 보이는 샘플입니다.

 

서블릿 파일은 dispatcher-servlet으로 되어있습니다.

그리고 egovframework 디렉토리에 spring 디렉토리에 context로 시작하는 xml 파일이 context param으로 존재 합니다.

context로 시작하는 파일은 일반적으로 aop설정, exception 설정 등 다양한 비지니스로직과 관련된 내용으로 작성되어 있습니다.

 

이처럼 스프링 설정과 관련된 파일 갯수가 많아지게 되면, 컴포넌트 스캔(Component scan)의 위치는 2가지 형태로 나누어서 해 주어야 합니다.

1. 뷰, 컨트롤러, 핸들러와 관련된 패키지 스캔은 서블릿 설정 파일에서

2. 기타 서비스, 저장소 등 비지니스와 관련된 패키지는 컨텍스트 설정 파일에서

 

예를 들어 설정하여보겠습니다.

예) 서블릿 설정 파일 : dispatcher-servlet.xml 

<!-- 컨트롤러 패키지 스캔 -->
<context:component-scan base-package="패키지위치" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>	

<!-- 뷰 설정 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
</bean>

 

그리고 서비스와 저장소 등 비지니스로직을 수행하는 패키지 스캔은 컨텍스트 설정파일 중 1곳에 기록합니다.

예) 컨텍스트 파일 중 1곳 : 내가만든context파일.xml

<context:component-scan base-package="egovframework">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

 

맨 처음 내용은 include를 통해서 컨트롤러와 관련된 내용만 스캔하도록 하였습니다.

다시 말해 서블릿에 설정하는 곳에서는 컴포넌트 스캔(component scan)이 컨트롤러(include Controller)만 포함되게 하였습니다.

컨텍스트 파일 중 1곳에는 컨트롤러만 제외하고(exclude Controller) 컴포넌트 스캔(component scan)을 하였습니다.

이렇게 나누어서 패키지 스캔을 하는 이유는 객체의 중복 생성, bean creationexception과 같은 오류를 방지하기 위해서 입니다.

 

만약 패키지 스캔하는 부분을 여러곳에 설정하면 설정하는 곳의 수 많큼 객체가 생성되게 되므로 주의해야 합니다.

컴포넌트 스캔을 남발(?)하게되면 스케줄러가 2개동작한다, 서비스가 2개다 등의 다소 당황스러운 상황을 만나기도 합니다.

이상으로 Spring component scan에 대해서 간단하게 내용을 정리하여 보았습니다.

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글