ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SpringBootApplication이 필요한 bean을 찾지 못하는 경우
    프레임워크/Spring Boot 2024. 4. 25. 00:01

     

    싱글 모듈 형태로 작성된 프로젝트를 멀티 모듈의 형태로 변경 중에 이슈를 해결한 기록을 적어봅니다.

    새로 분리한 모듈이 다른 모듈에서 생성하는 bean을 인지 하지 못하는 이슈입니다.

    프로젝트의 실행과 테스트의 실행 두 부분으로 나눠서 살펴보겠습니다.


     

    이 글은 다음과 같이 진행됩니다.

    1. 프로젝트의 실행

    2. 테스트 코드의 실행

    3. @SpringBootApplication vs @ComponentScan

    4. @WebMvcTest

     

    1. 프로젝트의 실행

    quiz_service에 있던 RestTemplate관련 설정을 global 프로젝트로 옮겨주었습니다.

     

     

    헌데 옮기고 나니 quiz_service가 실행될 때 restTemplate bean을 찾지 못하게 되었습니다.

     

    컴포넌트 스캔 시에 global을 스캔하지 않는 것이 문제일 것 같습니다.

    @ComponentScan으로 global 모듈도 스캔하도록 지정합니다.

     

     

    이렇게 지정하니 서버 실행이 잘 됩니다.

    이렇게 끝나면 참 좋겠지만 이번에는 테스트 코드가 실행이 안되네요?

     

     

    2. 테스트 코드의 실행

     

    아래와 같이 WebMvcTest를 구성하고 있습니다. 

     

     

    헌데, 멀티 모듈로 변경되면서 jobPostingService에서 사용되는 repository들을 찾지 못한다는 에러를 줍니다.
    mocking 하는 대상의 구현내용이 왜 문제가 되는것이며? 잘 되던 것은 왜 안되는가?ㅜ

     

     

    ComponentScan을 할 경로를 @ComponentScan으로 지정할 수도 있지만 @SpringBootApplication(scanBasePackages)로도 지정이 가능합니다.

     

     

    위 처럼 지정해주니 테스트까지 잘 통과합니다.

     

     

     

    3. @SpringBootApplication 과 @ComponentScan 은 무슨차이?

    이 부분은 찾아봐도 @SpringBootApplication은 본인 패키지를 먼저 Scan한다는 이야기와 @SpringBootApplication은 @ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration을 한번에 선언해주는 편의적인 어노테이션이라는 이야기만 있습니다.

     

    실제 어노테이션 코드를 살펴봐도 ComponentScan에 전달만 하는 것으로 보이는데 어찌 동작이 다른지 잘 모르겠습니다 ㅎㅎ

     

     

    4. @WebMvcTest

    WebMvcTest 문서를 살펴보면 Controller 만 테스트를 하는 것이 아니라면 @SpringBootTest와 @AutoConfigureMockMvc를 조합해서 사용하라고 안내하고 있습니다.

     

     

     

     

    나중에 비슷한 케이스를 흔하게 만날 것 같아 정리해봅니다.

    감사합니다.

     

     


    [참고]

    https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTest.html

     

     

     

     

Designed by Tistory.