본문 바로가기

Development/Spring

[Spring] 테스트 환경을 독립적으로 만들어보자

H2 Database

H2 Database는 다음과 같은 특징을 가진 인메모리 데이터베이스이며, 메모리에 데이터를 정하기 때문에 매우 빠른 속도를 제공한다.
또한 파일 기반으로 작동하기 때문에 별도의 서버 설치가 필요하지 않다.
H2 데이터베이스는 JDBC 드라이버를 제공하기 때문에 대부분의 JDBC 기반 프레임워크와 호환된다.

 

JDBC?

JDBC는 Java Database Connectivity의 약자로, 자바 프로그래밍 언어에서 데이터베이스에 접근하고 데이터를 조작하기 위한 표준 API이다.
JDBC를 사용하면 Java 코드를 통해 데이터베이스에 연결하고, SQL 쿼리를 실행하고, 결과를 처리하며, 데이터를 삽입, 수정, 삭제할 수 있다.

H2 DB는 빠른 속도와 간편한 설정으로 인해 개발 및 테스트 환경에서 자주 사용된다.
특히 Spring Boot는 H2 DB를 기본 데이터베이스로 사용할 수 있도록 지원한다.

testImplementation 'com.h2database:h2'

위 코드를 통해 의존성을 추가하고, Spring Boot 설정에서 spring.datasource.url 속성을 jdbc:h2:mem:testdb;와 같이 설정하면 H2를 사용할 수 있다.

하지만 H2 데이터베이스는 메모리에 데이터를 저장하기 때문에 생산 환경에서 사용하기에는 적합하지 않다.
따라서 H2 데이터베이스는 개발 및 테스트 환경에서 사용하는 것이 좋고, 생산 환경에서는 PostgreSQL, MySQL, Oracle과 같은 다른 데이터베이스를 사용하는 것이 좋다.

테스트용 Profile 만들기

application-test.yml

spring:
  datasource:
      url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
      driverClassName: org.h2.Driver
      username: sa
      password:
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.sql: info

application-test.yml 파일은 Spring Boot 애플리케이션의 테스트 환경 설정을 담고 있는 프로필이다.

데이터 소스 설정 (Datasource):

  • url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 - H2 DB를 in-memory로 사용하도록 설정
  • DB_CLOSE_DELAY=-1 옵션은 테스트 종료 후 데이터베이스 연결을 닫지 않도록 지연시킨다. 이를 통해 테스트 종료 후 잠시 동안 데이터베이스 연결을 유지하여 여러 테스트 간 연결 재설정 시간을 줄일 수 있다.
  • driverClassName: org.h2.Driver - H2 DB 드라이버 클래스를 지정
  • username: sa - H2 데이터베이스의 기본 사용자 이름
  • password: H2 DB는 기본적으로 비밀번호가 필요하지 않다.

JPA 설정:

  • database-platform: org.hibernate.dialect.H2Dialect - JPA에서 사용할 데이터베이스 문법을 H2 DB에 맞게 설정한다.
  • hibernate.ddl-auto: create-drop - 테스트 실행 시마다 데이터베이스 스키마를 생성하고 테스트 종료 후 삭제한다.

JPA 속성 설정:

  • hibernate.show_sql: true - JPA가 실행하는 SQL 쿼리를 로그에 출력한다.
  • hibernate.format_sql: true - 출력되는 SQL 쿼리를 가독성 좋게 포맷팅한다.

로깅 설정:

  • org.hibernate.sql: info - Hibernate가 실행하는 SQL 쿼리에 대한 로그 레벨을 INFO로 설정한다.

DB와 연동하는 테스트 클래스에 @ActiveProfile 적용하기

@SpringBootTest
@ActiveProfiles("test")

@ActiveProfile 어노테이션은 Spring Framework에서 특정 프로필을 활성화하는 데 사용된다.
프로필은 애플리케이션의 특정 구성 또는 동작을 정의하는 설정 그룹이다.

@ActiveProfiles 어노테이션 동작

Spring Boot는 애플리케이션 실행 시 spring.profiles.active 속성을 통해 활성화할 프로필을 지정한다.
@ActiveProfile 어노테이션은 지정된 프로필과 일치하는 경우에만 빈을 활성화하도록 한다.
만약 spring.profiles.active 속성이 설정되지 않았거나 @ActiveProfiles 어노테이션과 일치하는 프로파일이 없으면 기본 프로필이 활성화된다.

참고로 @Profile 어노테이션은 프로필별로 빈을 다르게 정의하는 데 사용된다.

H2 DB의 UUID 문제

Hibernate의 기본 UUID 매핑은 BINARY 방식이다.
만약 UUID 타입의 엔티티 필드를 사용하고 있다면, ORM 과정에서 H2 DB에 BINARY(255) 타입으로 저장이 되고,
UUID를 채우고 남은 공간에 '0' 을 채우기 때문에 문제가 생긴다.
따라서 columnDefinition = "uuid" 를 명시해야만, H2 DB에 UUID 타입으로 적용이 된다.

아래는 예시 코드이다.

@JoinColumn(name = "survey_id", columnDefinition = "uuid")

참조

  • Google Gemini