해결된 질문
작성
·
247
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요. 강의 열심히 듣고 있습니다.
밑에 다른 분이 비슷한 질문을 해주셨는데, 해소되지 않는 부분이 있어 질문을 남깁니다.
Test 코드 작성시에 위에 @SpringBootTest annotation이 있는데, 해당 annotation이 붙으면 컨테이너가 자동으로 실행되어 spring boot 환경에서 test를 진행이 가능한 것으로 알고 있습니다. 결국 주입을 자동으로 받는 다는 것은 memberRepository가 빈으로 등록되어있다는 뜻인 것 같은데, memberRepository는 test가 아닌 실제 main쪽 패키지에 존재하는데 어떻게 등록이 가능한건가요? main쪽에 있는 ItemServiceApplication이 실행되는 것인가요?
이전에도 비슷하게 실행한 적이 있는 것 같은데.. 그때는 인지하지 못하다가 문득 궁금해져서 질문을 남깁니다.
감사합니다.
답변 1
2
안녕하세요. 박정선님, 공식 서포터즈 David입니다.
@SpringBootTest 애노테이션이 붙은 클래스의 메서드를 실행하면 내부적으로 @SpringBootConfiguration 애노테이션이 붙은 클래스들을 찾고 이를 빈으로 등록하게 됩니다.
이 과정에서 test 패키지가 아닌 main 이하에 있는 패키지도 탐색 대상이 됩니다.
main 패키지 내 main 메서드가 존재하는 클래스에 @SpringBootApplication 애노테이션이 붙어 있는데 해당 애노테이션은 @SpringBootConfiguration 애노테이션과 @ComponentScan 애노테이션을 가지고 있습니다.
따라서, 해당 클래스는 빈으로 등록되게 되며 @ComponentScan이 붙어 있었기 때문에 main 패키지 내 컴포넌트 스캔 대상의 모든 빈들이 스캔되어 빈으로 등록되게 됩니다.
요약하면, @SpringBootTest을 붙이면 main, test 패키지 내 특정 클래스들을 식별하여 빈 등록이 처리됩니다.
감사합니다.
감사합니다. 큰 도움이 됐습니다.