티스토리 뷰

Spring

[Spring] 멀티모듈 JPA 테스트

minji_6119 2023. 1. 10. 22:51

멀티모듈 프로젝트 테스트

멀티모듈 프로젝트로 프로젝트를 진행하면서 느꼈던 불편함 중 하나는, Domain 모듈에 ApplicationContext가 존재하지 않아서 @SpringBootApplication이 존재하는 Application 모듈에서만 테스트를 진행해야하는 것이었다. 테스트 코드를 짜면서 프로젝트를 진행해야하지만, 개발 일정에 밀려서 등한시 하기도 했고 무엇보다 모듈 내에서 테스트 코드를 짜는 방법을 알지 못해서 테스트 코드를 짜지 못했다.
하지만 이번에 리펙토링 작업을 하면서 정상적으로 동작하는지 테스트 해야할 필요가 있었고, 방법을 찾아내게 되었다.

멀티모듈 JPA 테스트

가장 큰 리펙토링 중 하나는 메인 Entity에 상속 관계가 설정되는 부분이었다. 자주 사용했던 부분이라 빌드 오류가 많이 나기도 했고, @Inheritance에 대한 정확한 이해가 부족하여 어떻게 저장되고 사용해야하는지 테스트하기 위해서는 JPA 테스트가 필요했다. 그러기 위해서는 Application 클래스가 존재하지 않는 각 Domain 모듈에서 테스트를 진행해야 했다. 설정은 의외로 간단했다.

@ExtendWith(SpringExtension.class)
@DataJpaTest
class GroupRepositoryTest {
    @Autowired
    private ApartmentRepository apartmentRepository;
    @Autowired
    private CorporationRepository corporationRepository;
    @Autowired
    private GroupRepository groupRepository;

    @Test
    @DisplayName("아파트가 그룹에 추가되었을 때, 그룹 테이블 값 확인")
    void test1() {
    }
}

처음에는 이렇게만 설정을 했더니 Bean에 등록된 Repository를 찾지 못한다는 에러를 뱉었다. Domain 모듈 자체에서는 Application 클래스를 생성하지 못해서 Bean 스캔을 하려면 Domain 모듈을 implement 하는 App 모듈에서 작업을 수행할 수 밖에 없었던 것이다. 정상 작동하는지 테스트만하려면 test 폴더에서 @SpringBootApplication을 포함한 class를 생성하면 끝이 났다. 또한 @EnableJpaRepositories@EntityScan을 범위에 맞게 지정을 해주면 모듈 내에 존재하는 Bean을 스캔할 수 있게 된다.

@SpringBootApplication
@EnableJpaRepositories(basePackages = "co.example.domain.client.repository")
@EntityScan(basePackages = "co.example.domain.client")
public class TestConfiguration {
}

나는 인메모리 DB를 사용했더니, 기존에 사용하던 데이터베이스 테이블들이 꼬여서 test/resources 폴더에 yml 파일을 추가하여 H2 DB를 사용하였지만, @AutoConfigureTestDatabase를 사용하여 실제 DB를 사용할 수도 있다고 한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함