이때 동안 디폴트로 잘 사용하고 있던 테스트용 mem h2 db
를 떼어내고 mysql
을 붙이고자 하였다. 이에 따라 test 환경에 profile=test로 하여금의 application.yml
을 작성해주었다.
Spring Boot에서 @DataJpaTest
를 사용할 때, 기본적으로 H2 데이터베이스를 자동으로 사용하는 문제가 발생할 수 있다는 것을 알았다.
의심 포인트는 다음과 같다. 엔티티 필드에 대해 mysql 필드 타입을 TINYINT
를 주었는데 h2에서는 TINYINT가 불가능하다는 식의 에러 로그가 남았던 것이다.
잉? h2가 왜 나와?
@DataJpaTest
를 사용하여 JPA 테스트를 진행하려고 할 때, 설정한 데이터베이스가 아닌 H2가 자동으로 사용되는 문제가 발생한다.
@DataJpaTest
class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
@Test
void testSave() {
MyEntity entity = new MyEntity("Test");
myRepository.save(entity);
List<MyEntity> result = myRepository.findAll();
assertThat(result).isNotEmpty();
}
}
위 코드에서 테스트용 application-test.yml
을 구성해도,
테스트 실행 시 H2 데이터베이스를 사용하는 문제가 발생할 수 있다.
이유는 @DataJpaTest
가 기본적으로 내장형 데이터베이스(H2)를 자동으로 설정하기 때문이다.
이 문제를 해결하려면 두 가지 어노테이션을 추가하면 된다.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 기본 H2 사용 막기
@ActiveProfiles("test") // test 환경 프로파일 적용
class MyRepositoryTest {
}
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
application-test.yml
에 정의한 데이터베이스를 그대로 사용하게 된다.@ActiveProfiles("test")
application-test.yml
을 만들어 두고 사용 가능하다.application-test.yml
예시spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
username: test_user
password: test_password
driver-class-name: com.mysql.cj.jdbc.Driver
위 설정이 있다면, @ActiveProfiles("test")
를 추가하면 H2가 아닌 MySQL을 사용하게 된다.
✅ @DataJpaTest
는 기본적으로 H2 데이터베이스를 사용한다.
✅ 이를 방지하려면 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
를 추가해야 한다.
✅ @ActiveProfiles("test")
를 사용하면 테스트 환경의 설정 파일(application-test.yml
)을 적용할 수 있다.