개발자

SpringBoot @ComponentScan 질문

2023년 10월 26일조회 69

안녕하세요. 1년차 백엔드 개발자 입니다. JPA 실습 중 궁금한 것이 생겨서 질문 드립니다. 코드 @SpringBootApplication @ComponentScan(basePackages = "com.jpabook.jpashop") public class JpaShopApplication { public static void main(String[] args) { SpringApplication.run(JpaShopApplication.class, args); } } 상황설명 -@Repository 어노테이션을 명시한 Bean 객체를 테스트에서 찾지 못하는 오류 발생 -Repository 계층에 대한 단위 테스트 수행을 하고 싶은데 @SpringBootTest를 사용해야하는 상황이 발생함. -방법을 찾다보니 위 코드 처럼 @ComponentScan을 직접 명시하니 해결 궁금한 것은 위 코드에서 @ComponentScan이 명시되어 있는데 해당 어노테이션은 @SpringBootApplication에 기능이 포함되어 있어서 이제껏 명시하지 않더라도 @Autowired 등의 의존성 주입이 정상적으로 됐었는데요. 이번 실습 프로젝트에서는 되지 않아서 저렇게 명시를 했더니 정상적으로 작동합니다. 혹시 어떤 이유 때문인지 설명해주실 수 있으실까요? 참고로 테스트 했던 코드는 아래와 같습니다. 패키지 구조는 사진과 같습니다.

1@DataJpaTest
2@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
3class ItemRepositoryTest {
4    @Autowired
5    ItemRepository itemRepository;
6
7    @Test
8    @DisplayName("상품 저장 테스트")
9    void saveItem() {
10        Album item = new Album();
11        item.setName("item");
12        item.setArtist("test");
13
14        itemRepository.save(item);
15
16        Item findItem = itemRepository.findOne(item.getId());
17
18        Assertions.assertEquals(item, findItem);
19    }
20}
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 10월 26일

아마도 테스트 코드와 애플리케이션 코드가 서로 다른 패키지 구조에 위치해 있어서 그럴 수 있습니다. `@SpringBootApplication` 어노테이션은 해당 클래스가 있는 패키지를 기준으로 스프링 빈을 등록하는 역할을 합니다. 즉, `@SpringBootApplication`이 위치한 패키지를 시작점으로 하위 패키지들을 모두 스캔하게 됩니다. 따라서, 만약 `SpringBootApplication`과 `Repository`가 다른 패키지에 위치하고 있다면 스프링 부트는 자동으로 `Repository`를 스캔하지 못하게 됩니다. 이런 경우에는 여러분이 직접 어느 패키지를 스캔할 지 설정해주어야 하는데, 이 때 사용하는 것이 `@ComponentScan(basePackages = "package_name")` 입니다. 따라서 이번 상황에서는 `@ComponentScan(basePackages = "com.jpabook.jpashop")` 명시해서 Bean 오류가 해결되었습니다. 다만, 보다 좋은 방법은 애플리케이션 코드와 테스트 코드 모두 최상위 같은 패키지 안에서 관리하는 것입니다. 그러면 이런 문제를 자연스럽게 피할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!