인프런 커뮤니티 질문&답변

namhkim님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

@ComponentScan

작성

·

526

1

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
컴포넌트 단원의 @ComponentScan에 관한 질문입니다
 
package hello.core;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@Configuration
//ComponentSacn은 Spring빈을 전부 검색해서 담는 과정을 수행함, 정확히는 @Componet가 붙은 녀석들을 전부 담아줌
@ComponentScan(
        //AppConfig에 등록한 Configuration을 제외해주는 과정ㅇ
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)

위의 코드는 예제 AutoAppConfig.java 파일안의 코드입니다. 이렇게 하면 AppCongif, TestConfig에서 주가되는 Bean을 예외로 하는것은 이해했습니다. 여기서 궁금증이 생기는데 자기 자신에도 @Configuration이 추가 되어있는데 자기 자신의 @Configuaration은 예외 처리를 안해주는것인가요?

질문을 정리하면 @ComponentScan을 통한 예외처리를 진행할 때 자기 자신의 클래스는 제외하고 예외처리를 진행하는것인지 궁금합니다.

답변 2

3

먼저, 제가 착각한 부분이 있어 원 답변을 수정했습니다. 참고 부탁드립니다.

 

1. @Configuration이 붙은 클래스가 제외처리 됩니다. 그런데 제외시킨 이유가 수동으로 등록한 Bean이 있기 때문이라는 것입니다.

2. @ComponentScan(exclude ~)가 붙어있는 AutoAppConfig는 스캔 제외대상에 포함되지 않습니다.

 

2번의 경우 직접 테스트 해보았습니다.

1. Config1에 @ComponentScan이 붙어 있습니다.

@ComponentScan에 아무런 옵션이 없을 때, Config1, Config2, Config3 모두 빈으로 등록됩니다.

 

2. Config1의 @ComponentScan에 Configuration 애노테이션 제외필터를 걸었습니다.

@ComponentScan은 현재 클래스가 속한 패키지와 그 하위 패키지를 스캔합니다.

Config1은 @ComponentScan이 붙은 자신이기 때문에 해당되지 않고

스캔 제외 대상이 될 클래스들은 Config1과 동일한 패키지에 위치한 Config3

그 하위 패키지에 위치한 Config2입니다.

그래서 결과를 보면 Config1만 스캔이 된 것을 알 수 있습니다.

 

namhkim님의 프로필 이미지
namhkim
질문자

감사하다는 댓글을 깜박해서 다시 들어 왔는데 글이 변경이 되어서 놀랐습니다. 그전 설명에서 어떤 부분이 잘 안 와닿았는데  테스트까지 해서 다시 설명해주셔서 정말 100% 완벽하게 이해했습니다. 이런거를 사실 직접 테스트를 해봐야하는데 프레임워크를 배우는게 처음이라 제가 테스트 하고도 이게 맞는건지 확신을 못했었습니다. 일반 자바나 C언어는 디버깅 작업을 통해 확신을 가질수 있는데 아무래도 스프링이 처음이라 확실하게 배우고 싶어 질문했었는데 덕분에 100% 이해했습니다. 감사합니다.

도움이 되셨다니 기쁘네요:)

2

안녕하세요. namhkim님, 공식 서포터즈 David입니다.

.
먼저, @ComponentScan에서 제외처리된 AppConfig, TestConfig는 내부에 수동 빈 등록과 관련된 정보가 있기 때문입니다. @ComponentScan 제외처리할 때
자신을 빼고 자동으로 처리하진 않습니다. excludeFilters의 조건을 따라 제외처리 하며 자신은 해당되지 않습니다.

.
감사합니다.

namhkim님의 프로필 이미지
namhkim
질문자

컴포넌트스캔 - 컴포넌트스캔과의존관계자동주입시작하기의 3분 54초에 보면 @Configuration이 붙은 클래스를 빼버린다고 말씀하시는데 그러면 클래스를 빼버린다는게 아니라 @Configuration이 붙은 클래스 안에 @Bean 또는 수동으로 등록한 Bean을 빼버리는건가요?  그리고 AutoAppconfig에는 아무런 수동빈도 등록되어있지 않으니까 제외할게 없는 상황으로 이해하면 되는건가요?. 클래스를 빼버린다고 하셔서 현재 자동 주입을 하는 AutoAppConfig.java에도 @Configuration이 붙어 있는데 자신 자체를 빼버린다고 생각해서 혼란스럽습니다.

namhkim님의 프로필 이미지

작성한 질문수

질문하기