DB/일반

[H2] Spring Boot에서의 테스트를 위한 DB 설정

은서파 2023. 10. 23. 21:58

이번 포스트에서는 Spring Boot에서 단위테스트를 위한 H2 설정법에 대해 살펴보자.

 

H2 Database 설정

 

h2의 모드

h2는 크게 3가지 모드로 사용할 수 있다.

https://www.h2database.com/html/cheatSheet.html

 

H2 Database Engine

Using H2 Documentation Reference: SQL grammar, functions, data types, tools, API Features: fulltext search, encryption, read-only (zip/jar), CSV, auto-reconnect, triggers, user functions Embedded jdbc:h2:~/test 'test' in the user home directory jdbc:h2:/da

www.h2database.com

모드 설명
Server Mode 공홈에서 H2 서버 파일을 다운받아 설치하고 사용하는 버전으로 Server를 띄워놓고 사용하는 방식
 - 초기 DB 생성에 문제가 있을 경우 DB 파일 삭제 후 H2 Console에서 Embedded Mode로 생성 후 사용
 - H2는 단순 테스트용이므로 일반적으로 사용할 일은 없을듯
Embedded Mode H2 서버를 별도로 설치/실행하지 않고 pom.xml 등에 실행 파일을 포함한 후 애플리케이션 실행 시 내부적으로 설버를 실행하는 방식
- application에서 생성한 DB를 h2-console에서 열 수는 있지만 반대는 안됨
- 나중에 H2-console에서 데이터를 확인해야할 필요가 있을 때
In-Memory Mode Embedded Mode와 동일하나 데이터를 데이터베이스 파일에 저장하지 않고 메모리에 쓰는 방식
console을 통해서 질의하지 않음
 - 단위테스트 처럼 실제 질의할 필요는 없을 때

 

pom.xml

당연히 h2에 대한 의존성이 필요하다. 추가로 jpa에서 사용할 계획이므로 spring-boot-starter-data-jpa도 추가한다.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

DB 접속 설정

먼저 Datasource에 대한 설정과 h2 서버로의 접근을 위한 설정은 아래와 같이 해준다.

spring:
  datasource:                         # embedded 기반 datasource 설정
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/spring-test
    username: sa
    password:
  h2:       
    console:                          # h2 console 사용 설정
      enabled: true
      path: /h2-console

DB에 접근은 Repository와 단위테스트를 통해서 하겠지만 웹 기반의 h2 콘솔을 이용하려면 하단부의 설정이 필요하다.

참고로 memory 기반으로 사용하기 위해서는 url을 다음과 같이 지정한다.

jdbc:h2:mem:spring-test

 

초기화 스크립트

다음으로 사용하려는 DB의 초기화 스크립트를 실행시키는 방법이다.

spring.sql.init 속성 활용

특정 기술에 속하지 않고 DB를 초기화 할 때 application.yml 파일에 다음과 같이 schema와 초기 data를 설정할 수 있다.

spring:
  sql:
    init:
      mode: embedded         # always: 언제나, embedded: embedded db만(default), never: 초기화X
      data-locations:        # 기본 위치는 classpath root
      - classpath:init_data/data.sql
      schema-locations:
      - classpath:init_data/schema.sql

위와 같은 설정에서 먼저 schema.sql로 schema를 설정하고 data.sql로 데이터를 삽입한다. 이 파일들을 classpath root에 설치하면 자동으로 읽기 때문에 설정이 필요 없어진다.

주의사항은 위 설정에 의한 스크립트 동작 후 spring.jpa.hibernate.ddl-auto=create가 동작하므로 함께 사용하면 테이블이 drop 후 create 되므로 데이터를 확인할 수 없다. 나머지 option은 테이블을 drop 하지 않으므로 무관하다.

 

spring.hibernate.ddl-auto 설정 활용

JPA를 사용 중에 schema가 자주 바뀌는 프로젝트 초기라면 spring.hibernate.ddl-auto를 사용하는 것이 편리하다.

spring:
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true

위의 설정은 애플리케이션 로딩 시점에 Entity를 이용해서 테이블을 구성한다. 하지만 초기 데이터가 없는 단점이 생기는데 이는 @Sql 로 보완할 수 있다.

@SpringBootTest
@Slf4j
@Sql(scripts = {"classpath:init_data/data.sql"})
class TxWithJpaApplicationTests {
	// do testing
}