[Spring] 테스트시 데이터베이스 초기화 하는 방법1 - @Sql

nana·2024년 10월 20일
0

Spring

목록 보기
6/9

0. 글을찌는 이유

ECommerce 프로젝트를 하면서 동시성제어에 대한 통합테스트를 진행했다.
통합테스트를 하면서 어려웠던 점은 실제 DB를 사용하고 실제 로직을 실행한다는 것이었는데
TDD를 접하고 단위테스트를 할 때는 몰랐던 DB초기화에 대한 부분이 코드가 복잡해지고 주입해야하는 repository개수가 늘어나면서 더 필요하게 되었다.

그러다보니 DB가 꼬이면서 테스트 실패가 되는것까지 고려해야했고,
@BeforeEach등의 어노테이션으로 하나하나 초기화를 해주다보니

이런식으로 초기화 코드만 한가득이었다.

그래서 찾아보게 된 @Sql이란 어노테이션에대해 공부하게되었다.

1. @Sql ?

스프링 4.1버전에 새롭게 추가된 테스트 기능.

  • 지정한 스크립트를 실행해준다.
  • 스프링 3버전에 추가된 ResourceDatabasePopulator를 사용해도 되지만 @Sql을 이용했을 때 더 편리하다.

2. 사용법

👉🏻@Sql({"classpath:~~~.sql"})

@Sql(scripts = "/reset-database.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)

scripts로 주소를 지정해줘도 되고 classpath로 지정해 줘도 된다.
scripts로 지정시 위치는 보통

여기에 위치하게 된다.

executionPhase : 테스트 메서드 실행 전과 실행 후 중 쿼리를 언제 실행할 것인지 여부를 결정할 수 있다.
ExecutionPhase.BEFORE_TEST_METHOD : 실행 전 SQL 실행
ExecutionPhase.AFTER_TEST_METHOD : 실행 후 SQL실행

3. 참고

자바 7 이하버전을 사용한다면 @SqlGroup를 이용하면 @Sql을 한 테스트 클래스나 메서드에 적용할 수 있다.

@SqlGroup( {

    @Sql("init.sql"), @Sql(scripts="clear.sql", executionPhase=ExecutionPhase.AFTER_TEST_METHOD)} )
  • @Sql 애노테이션은 별도 설정을 하지 않으면 @ContextConfiguration에 지정한 설정 정보에 있는 DataSource빈을 사용해서 스크립트를 실행하고, 트랜잭션 관리자가 존재할 경우 해당 트랜잭션 관리자를 이용해서 트랜잭션 범위 내에서 스크립트를 실행한다.

4. 리팩토링

@Sql(scripts = "/reset-database.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
public class OrderConcurrencyTest {
~~
}


-> reset-base.sql

테스트 코드가 깔끔해졌다!
그리고 모든 테스트에서 @Sql 코드만 주입하면 초기화 할 수 있다 :)

profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글