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
'SpringBoot > 테스트와 품질 관리' 카테고리의 다른 글
통합 테스트 (@SpringBootTest) (0) | 2025.04.15 |
---|---|
단위 테스트 (@WebMvcTest, @DataJpaTest) (0) | 2025.04.15 |