• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@SpringBootTest에서 어떻게 @Autowired가 작동하는지 궁금합니다

21.05.11 21:54 작성 조회수 1.92k

2

안녕하세요~ 유익한 강의 잘 듣고 있습니다!

이해가 안가는 부분이 있어 질문드립니다.

24분 40초 쯤에 보면 @SpringBootTest 클래스에서 @Autowired를 사용하고 있습니다. 이게 어떻게 동작하는지 모르겠습니다.

1. 일전에, ComponetScan의 범위는 AutoAppConfig가 포함된 패키지 이하라고 하셨습니다.

이에 따르면 test, resources는 컴포넌트 스캔의 대상이 아닙니다

2. 의존관계 주입 대상은 컨테이너에 빈이라고 하셨습니다.

그렇다면 @SpringBootTest 클래스(CoreApplicationTest)는 빈 등록 대상이 아니므로 Autowired가 불가능한 것 아닌가요??

어떤 과정을 거쳐 @SpringBootTest 클래스에 빈이 주입되는지 궁금합니다!

답변 1

답변을 작성해보세요.

12

안녕하세요. 재량님

지금까지는 우리가 직접 스프링 컨테이너인 ApplicationContext를 생성했습니다.

반면에 @SpringBootTest는 스프링 부트가 제공하는 스프링 컨테이너를 사용해서 실행하는 방법입니다.

@SpringBootTest를 사용하면 @SpringBootApplication이 있는 CoreApplication을 찾아서 사용합니다.

그리고 이렇게 찾은 @SpringBootApplication 안에는 @ComponentScan이 존재합니다.

이곳의 package 위치는 hello.core이기 때문에 우리가 작성한 전에 애플리케이션 코드가 컴포넌트 스캔의 대상이 됩니다. 여기에는 @Configuration도 포함됩니다.

그리고 테스트에서 실행했기 때문에 test 중에서도 hello.core를 포함한 그 하위 패키지는 컴포넌트 스캔의 대상이 됩니다.

두번째 질문하신 것은 @SpringBootTest가 있으면 해당 테스트 클래스는 특수하게 @Autowired를 허용해줍니다. 이것은 스프링 빈으로 등록되어서 그런 것은 아니고, JUnit과 스프링이 예외적으로 테스트를 편리하게 하도록 허용하는 기능입니다.

도움이 되셨길 바래요^^