위 사진으로 모든것이 설명이 가능합니다.
스프링이나 전자정부에서 자신이 만든 프로젝트의 파일들의 위치를 알려줄 때 <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에 대해서 간단하게 내용을 정리하여 보았습니다.
'Spring framework' 카테고리의 다른 글
Spring RequestBody, RequestParam의 컨트롤러(Controller) (0) | 2020.12.07 |
---|---|
Spring RequestBody RequestParam(스프링 RequestParam RequestBody) (0) | 2020.11.17 |
스프링, 전자정부 프레임워크에서 중복 로그인 확인하기(HttpSessionListener 사용) (0) | 2020.04.29 |
Spring HttpSessionListener를 활용한 세션 중복값 체크(중복 로그인 방지, 전자정부 중복 로그인) (2) | 2020.04.13 |
Mybatis 부등호, Mybatis 비교연산자, 마이바티스 비교, is not correctly spelled (0) | 2020.02.05 |
댓글