본문 바로가기
SpringBoot/테스트와 품질 관리

테스트 데이터 준비 (@Sql, Testcontainers)

by DEVLIB 2025. 4. 15.
728x90

1. @Sql – SQL 스크립트로 테스트 데이터 삽입

사용 목적

  • 테스트 실행 전후에 SQL 스크립트를 실행
  • 테스트용 데이터셋을 빠르게 구축 가능

사용 예제

@SpringBootTest
@Sql(scripts = "/test-data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    void 회원조회_테스트() {
        Member member = memberRepository.findByEmail("test@example.com").orElseThrow();
        assertEquals("홍길동", member.getName());
    }
}

/resources/test-data.sql 내용 예

INSERT INTO member (id, username, email, password) VALUES (1, '홍길동', 'test@example.com', 'pw1234');

SQL 삽입은 빠르고 직관적이지만, 테이블 구조에 따라 테스트 유지보수가 어려워질 수 있어요.


2. @Sql 사용 주요 옵션

속성 설명
scripts 실행할 SQL 파일 경로
statements SQL 문자열 직접 삽입
executionPhase BEFORE_TEST_METHOD / AFTER_TEST_METHOD

3. Testcontainers – 실데이터베이스를 Docker로 띄워서 테스트

사용 목적

  • H2 대신 실제 MySQL/PostgreSQL 등의 DB 환경에서 테스트
  • 로컬 DB 환경과 테스트 환경을 분리
  • CI/CD 환경에서 유용

기본 설정 (Gradle)

testImplementation 'org.testcontainers:junit-jupiter:1.19.0'
testImplementation 'org.testcontainers:mysql' // or postgresql

예제: MySQL TestContainer

@Testcontainers
@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MemberRepositoryTest {

    @Container
    static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");

    @DynamicPropertySource
    static void overrideProps(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", mysql::getJdbcUrl);
        registry.add("spring.datasource.username", mysql::getUsername);
        registry.add("spring.datasource.password", mysql::getPassword);
    }

    @Autowired
    MemberRepository memberRepository;

    @Test
    void 회원등록_및_조회() {
        Member member = new Member("홍길동", "test@example.com");
        memberRepository.save(member);

        Optional<Member> result = memberRepository.findByEmail("danbi@example.com");
        assertTrue(result.isPresent());
    }
}

Testcontainers의 장점

Docker를 이용한 진짜 DB 테스트  
테스트 간 격리된 환경 제공  
실제 운영 DB와 유사 환경 테스트 가능  
I/CD 파이프라인에 적합 (GitHub Actions, GitLab 등)  

두 방식 비교

항목 @Sql Testcontainers
핵심 목적 SQL로 테스트 데이터 구성 도커 기반 실DB 구성
테스트 속도 빠름 비교적 느림
유지보수 SQL 파일이 많아질수록 복잡 자동 초기화로 편리함
실무 적합성 간단한 데이터 삽입에 유리 실DB 테스트에 강력함
추천 사용처 단위 테스트 통합 테스트 / CI 환경

마무리 요약

기능 설명
@Sql 테스트 전후 SQL 실행으로 데이터 준비
Testcontainers Docker 컨테이너 기반의 실 DB 연동
함께 사용 가능 @SpringBootTest + Testcontainers, @DataJpaTest + @Sql
LIST