로컬 환경 H2 Database 도입

중고 개발자
중고 개발자
Published in
5 min readMay 11, 2021

H2는 자바로 작성된 RDBMS 다. 자바 애플리케이션에 내장되거나 클라이언트-서버 모드로 실행할 수 있다. 주요 기능으로 임베디드 모드(Embedded Mode)와 서버 모드(Server Mode)의 인 메모리 데이터베이스를 제공한다.

임베디드 모드는 애플리케이션 내에 H2 DB를 내장하여 기동하는 방식이고, 서버 모드는 별도의 서버에 H2 DB를 기동하는 방식이다.

아래 그림과 같이 하나의 애플리케이션은 H2 DB를 내장하여 임베디드 모드로 기동하고, 다른 애플리케이션에서 해당 H2 DB로 접속하는 믹스드 모드(Mixed Mode)도 제공한다.

Mixed Mode
Mixed Mode

인 메모리 DB 외 H2의 주요 기능은 오픈소스의 빠른 JDBC API, 브라우저 기반의 콘솔 애플리케이션, 약 2MB 크기의 경량 설치 파일이다.

H2 DB 사용 이점

로컬 PC 단말에서 직접 개발환경 DB 서버에 접속하지 않고, 로컬환경 DB 서버로서 H2 인 메모리 DB를 사용하고 있다. H2를 사용하면서 개인적으로 느낀 유용한 점은 다음과 같다.

  • 개발환경 DB는 다른 업무 서버 및 외부기관과의 연계로 인해 테스트 로그 데이터가 적재되고 있으므로, 개발환경과 로컬환경의 DB를 분리하여 데이터 정합성을 지킬 수 있다.
  • 로컬 PC에서 애플리케이션이 기동됨과 동시에 DB가 생성되며, 애플리케이션이 종료되면 DB도 파기된다. 각종 테스트 시 DB에 데이터가 불필요한 데이터가 쌓이는 것을 신경쓰지 않아도 되어서 개발 생산성이 좋아졌다.
  • 믹스드 모드를 이용하여 마이크로서비스 애플리케이션(이하 MSA) 간의 통신 테스트 실시가 가능하다. 예를 들어 동일한 DB를 사용하는 MSA A, B, C를 로컬에서 기동한다. MSA C 내에 H2 DB를 임베디드 모드로 기동하고, MSA A, B에서 접근할 수 있다.

MSA 통신을 위한 H2 DB 설정

MSA 간 통신 테스트를 위해 H2 DB를 믹스드 모드로 설정한 내용을 요약하고자 한다.

모든 MSA는 Spring Boot Framework 기반이다. MSA A, B, C는 서로 HTTP API로 통신하며 같은 DB를 사용한다. MSA C는 애플리케이션 내에 임베디드 모드로 H2 DB를 기동하였고, DB 서버의 역할을 한다. MSA A와 B는 MSA C에 내장된 H2 DB에 접근하는 클라이언트의 역할을 한다.

프로젝트 관리 도구로 Maven을 사용하였고, H2 DB를 Maven Dependency에 추가하였다. 다음은 MSA 간 통신을 위한 설정이다.

1) MSA C의 local 환경 properties 설정 파일에 H2 DB 설정을 넣어준다. 몇가지 옵션을 넣어서 URL을 열어주고, driver class를 지정해준다. DB 접속을 위해 username, password를 입력하고 schema 생성을 위한 ddl 파일 경로를 설정해준다. 그리고 브라우저 기반 콘솔로 접속하기 위한 설정을 입력한다.

...
spring:
datasources:
url: jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
driver-class-name: org.h2.Driver
username: sa
password:
sql-script-encoding: UTF-8
initialization-mode: embedded
schema: classpath*:/schema/schema.sql
h2:

...

2) MSA C에 내장된 H2 DB를 외부에서 접속이 가능하도록 TcpServer를 Bean으로 등록하는 클래스를 작성한다. Spring Boot에서 H2를 기동할 때 JVM 메모리에 탑재하는데, 외부에서는 접근할 수 없다. 이를 우회하기 위해 H2 라이브러리에서 제공하는 TcpServer를 사용한다. 해당 설정은 local 환경에서만 작동하도록 profile을 설정한다.

3) 애플리케이션 3개를 동시에 기동 후 테스트하기 위해 각 애플리케이션의 server port를 다르게 열어두었다.

4) MSA A와 B의 local 환경 properties 설정 파일에 MSA C에서 설정한 H2 DB의 URL과 username, password를 입력한다.

...
spring:
datasources:
url: jdbc:h2:tcp://localhost:9090/mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
...

결론

위와 같이 설정 후 테스트를 실시한 결과, 복수의 애플리케이션에서 한 애플리케이션에 내장된 H2 DB를 공유하며 정상적으로 작동하였다. 메모리에서 동작하기 때문에 속도가 빠르며, 로컬 환경에서 가볍게 사용할 수 있다.

--

--