강의

멘토링

로드맵

Inflearn brand logo image

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

매콤한각설탕님의 프로필 이미지
매콤한각설탕

작성한 질문수

스프링 핵심 원리 - 기본편

조회한 빈이 모두 필요할 때, List, Map

main 패키지와 test 패키지의 컴포넌트 스캔 범위

작성

·

24

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

 @Test
    void findAllBean() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
        // 생략...
    }
    
    @Component
    static class DiscountService {
        // 생략
    }

DiscountService.class를 new AnnotationConfigApplicationContext()의 인자로 대입하는 대신에, 클래스에 @Componant를 붙였는데 정상적으로 테스트가 통과됐어요.

image.png

제가 알기로는 AutoAppConfig는 main 패키지에 속하며, DiscountService는 test 패키지에 속하니깐 DiscountService는 컴포넌트 스캔의 대상이 아니지 않나요? 그런데 어째서 정상적으로 의존관계 주입이 된 건가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

매콤한각설탕님께서 질문하신 내용을 살펴보면, AutoAppConfig는 스프링 설정 클래스이며 컴포넌트 스캔을 통해 빈을 등록하도록 하고 있습니다. 그런데 DiscountService가 테스트 패키지에 위치해 있어도 정상적으로 빈으로 등록되고 의존관계가 주입된 것에 대해 궁금하신 것 같습니다.

스프링의 컴포넌트 스캔은 기본적으로 @ComponentScan 어노테이션이 붙어 있는 클래스가 있는 패키지와 그 하위 패키지를 스캔합니다. 테스트 환경에서 스프링 컨텍스트를 초기화할 때, 메인 패키지뿐 아니라 테스트 패키지 포함 전체 프로젝트 패키지를 스캔하도록 되어 있는데, 이는 보통 @SpringBootTest에서 이루어집니다. 테스트 환경에서는 전체 클래스패스가 스캔 대상에 포함될 수 있기 때문에, DiscountService가 빈으로 등록될 수 있었습니다.

따라서, DiscountService가 @Component 어노테이션으로 등록되어 있고, 테스트 코드에서는 해당 클래스에 접근하여 의존성을 주입받기에 테스트가 정상적으로 통과할 수 있습니다.

유사한 질문과 참고할만한 세부 내용은 아래 링크를 통해 확인 부탁드립니다:
- Component Scan의 패키지 범위와 원하는 빈의 등록 가능 여부
- 스프링 테스트의 빈 등록 과정과 스캔 범위 이해하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

매콤한각설탕님의 프로필 이미지
매콤한각설탕

작성한 질문수

질문하기