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