NOW 프로젝트를 진행하면서 기록한 글입니다.
격리된(Isolated) Repository 테스트
모든 비즈니스 로직(도메인, 서비스 레이어)에 대한 테스트를 위해 Mock 라이브러리(Mockito)를 활용했었습니다.
그러나 이러한 방식만으로는 실제 애플리케이션을 사용하는 과정에서 나타나는 일부 문제를 잡아내기 어려웠던 상황이 종종 발생했었습니다.
또한, 매번 UI에 의존하여 데이터가 올바르게 입력되고 표시되는지를 확인하는 것도 어려웠습니다.
이러한 상황이 발생했던 이유는 Repository 레이어에 대한 테스트를 스킵했기 때문인데요.
이를 해결하고자, 격리된 Repository 테스트 환경을 구성하여 테스트를 진행하기로 했습니다.
추가적으로, 격리된 환경으로 구성해야했던 이유는 각 테스트가 독립적으로 실행되어 다른 테스트와의 데이터 간섭 없이 정확한 검증을 하고자 했기 때문입니다.
(auto_increment 속성은 @Transcational 어노테이션과 관계없이 롤백 되지 않음)
테스트 격리 방법
스프링에서는 테스트를 격리하는 여러 방법을 제공하고 있는데요.
해당 프로젝트에서는 그 중 @Sql
어노테이션을 활용해서 격리된 테스트 환경을 구성했습니다.
@Sql: 스프링에서 제공하는 어노테이션으로써, 테스트 클래스에 해당 어노테이션을 붙이면 매 테스트 메소드 실행전 지정된 경로의 SQL 스크립트를 실행
@RepositoryTest 어노테이션 구현
테스트의 격리를 더욱 편리하게 처리하기 위해 @RepositoryTest
라는 어노테이션을 구현했습니다.
@Target(ElementType.TYPE)
: 클래스 레벨에서 사용할 수 있도록 지정@Retention(RetentionPolicy.RUNTIME)
: 런타임까지 어노테이션 정보가 유지되도록 설정@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
: 랜덤한 포트를 사용하는 Spring Boot 테스트 환경 설정@Sql("classpath:testdb.sql")
: 지정된 경로의 SQL 스크립트를 실행@ActiveProfiles("test")
: "test" 프로파일 활성화
실행시키고자 하는 스크립트는 resources 폴더에 위치시켰습니다.
격리된 테스트 환경 구성 후 테스트
앞서 언급한 @RepositoryTest
어노테이션을 사용했습니다.
따라서, 메서드 실행 전 데이터베이스를 초기화하는 작업을 수행함으로써 각 테스트를 격리시켰습니다.
마무리
@RepositoryTest 어노테이션을 테스트 클래스에 적용함으로써, 테스트 환경을 간편하게 구성할 수 있었습니다. 앞으로 이 어노테이션으로 격리된 테스트 환경을 구성하고 초기 데이터를 로드하는 등의 작업을 더욱 간편하게 처리할 수 있을 것입니다.
부족하거나, 개선할 부분은 앞으로 프로젝트를 진행하면서 차근차근 진행하고자 합니다.
긴 글 읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
Rate Limiting 인터셉터를 활용한 트래픽 관리 (0) | 2023.09.11 |
---|---|
Spring Cache(스프링 캐시) 적용 (0) | 2023.08.26 |
파사드 패턴을 활용한 서비스 의존성 주입(with 트랜잭션 설정) (0) | 2023.08.22 |
Spring의 Argument Resolver를 활용한 principal 주입 (0) | 2023.08.14 |
Spring AOP로 Slack 알람 구현 (0) | 2023.08.13 |