[트러블 슈팅]@DataJpaTest 사용시 인메모리 H2 강제 사용

jkky98·2025년 3월 11일
0

ProjectSpring

목록 보기
17/20

Spring Boot @DataJpaTest가 H2를 강제로 사용하는 문제 해결

이때 동안 디폴트로 잘 사용하고 있던 테스트용 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 {
}

1️⃣ @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

  • Spring Boot가 H2를 자동으로 사용하지 못하도록 설정한다.
  • 즉, application-test.yml에 정의한 데이터베이스를 그대로 사용하게 된다.

2️⃣ @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)을 적용할 수 있다.

profile
자바집사의 거북이 수련법

0개의 댓글

관련 채용 정보