본문 바로가기

Backend Development/Spring boot

[Spring boot] Spring boot test H2 DB 사용하기

보통 Unittest용으로 사용하는 DB는 실제 DB가 아닌 메모리 DB를 사용하는게 좋다. DB 서버의 물리적인 연결 필요없이 소스만 내려받으면 테스팅이 가능해지기 때문이다.

 

H2 DB로 Unittest 환경을 구축하려면 우선 라이브러리 다운로드를 받아야 한다.

 

Pom.xml 파일에 아래와 같이 디펜던시를 추가해 준다.

<dependency><!-- h2 DB -->
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>compile</scope>
</dependency>

 

Unit test를 실행할 active property(yml)에는 다음과 같이 database 설정 정보를 적어준다.

spring.datasource.driver-class-name=org.h2.driver
spring.datasource.url=jdbc:h2:mem:test;MODE=PostgreSQL;INIT=RUNSCRIPT FROM 'classpath:testdata/data.sql';DATABASE_TO_UPPER=false;CASE_INSENSITIVE_IDENTIFIERS=true
spring.datasource.initialization-mode=always
spring.datasource.username=test
spring.datasource.password=test

 

H2는 메모리 DB이다 보니 처음 DB 실행시 테이블 및 데이터를 생성, 추가 해주어야 한다.

 

INIT=RUNSCRIPT FROM 'classpath:testdata/data.sql'

 

위 부분이 프로젝트 실행 시 스크립트를 실행하는 구문이다.

 

MODE=PostgreSQL

 

H2 DB를 특정 모드로 설정할 수 있다. 프로젝트가 PostgreSQL기반이라면 해당 모드로 설정해서 application 쿼리가 seamless하게 호환 되도록 설정한다.

 

CASE_INSENSITIVE_IDENTIFIERS=true

 

위 구문은 초반에  생성한 DB 테이블 및 컬럼 명의 대소문자 구문을 하지 않겠다는 의미이다. DDL 생성시 소문자로 생성했는데 쿼리는 대문자로 작성하면 테이블 및 컬럼명을 못찾는 경우가 발생한다. 위 옵션을 켜면 대소문자 mismatch로 실행 오류가 나는 부분을 건너 뛸수 있어 편하다.

 

spring.datasource.initialization-mode=always

 

Unittest는 매번 초기값으로 실행이 되므로 위 옵션을 켜서 실행 시 init을 매번 하도록 한다.

 

-- The end --