Development/Spring & Spring Boot

[Spring Boot] H2 DB Embedded Mode 사용하기

개발하는 곰돌이 2023. 10. 4. 21:04

목차

    들어가기 전에

    H2는 굉장히 작고 가벼운 RDBMS로, 그 특성상 제공되는 기능은 제한적이지만 속도가 빠르고 별도의 프로그램 없이 웹브라우저 기반의 DB 콘솔을 사용할 수 있다는 장점도 있다. 이러한 특징으로 인해 다양한 기능이 필요하지 않은 소규모 서비스나 단위 테스트에서 많이 사용된다.

     

    H2는 별도의 엔진을 설치하지 않고 사용할 수 있는 In-memory Mode와 Embedded Mode를 지원하는데 이 글에서는 Embedded 방식을 사용하는 방법과 In-memory 방식과의 차이에 대해 정리하려고 한다.

    H2의 여러 모드들이 갖는 특징

    H2는 Server Mode, In-memory Mode, Embeded Mode라는 세가지 방식으로 사용할 수 있다. 각 방식의 특징은 다음과 같다.

    • Server Mode
      • 직접 엔진을 설치하여 사용하는 방식.
      • 애플리케이션과 상관 없는 외부에서 DB 엔진이 구동된다.
      • 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.
    • In-memory Mode
      • 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
      • 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
      • 데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션을 종료하면 데이터가 사라진다.
    • Embedded Mode
      • 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
      • 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
      • 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.

    공통적으로 스프링부트에서 H2를 사용하려면 아래 의존성 라이브러리가 추가되어 있어야 한다. 

     

    Gradle

    runtimeOnly 'com.h2database:h2'

    Server mode

    서버 모드는 여타 DBMS와 동일하게 DB 엔진을 설치하고 엔진을 구동하여 사용하는 방식이다. 애플리케이션과 DB가 분리되어 있기 때문에 여러 애플리케이션에서 동일한 DB를 사용하기에 적합하다고 볼 수 있다.

     

    H2 DBMS는 아래 공식 사이트에서 다운로드 받을 수 있다.

     

    H2 Database Engine

    H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size     Supp

    www.h2database.com

    In-memory Mode

    인메모리 모드는 애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식이다. 데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션이 종료되면 모든 데이터가 사라지는 휘발성의 특징을 갖고 있다.

     

    이러한 특징으로 인해 단위 테스트 등에서 많이 사용된다.

     

    스프링부트 프로젝트에서 H2를 인메모리 모드로 사용하려면 application.yml 또는 application.properties에서 아래와 같이 설정하면 된다.

     

    application.yml

    spring:
      datasource:
        driver-class-name: org.h2.Driver
        url: jdbc:h2:mem:{DB 이름}
        username: sa
        password:

    application.properties

    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.url=jdbc:h2:mem:{DB 이름}
    spring.datasource.username=sa
    spring.datasource.password=

    datasource의 url에는 일반적으로 DB 서버의 호스트와 포트 번호, DB 이름 등의 접속 정보를 기재하는데, H2에서는 여기에 mem을 기재하여 애플리케이션이 실행되는 메모리 자체에서 DB를 사용하겠다는 것을 선언한다.

    Embedded Mode

    임베디드(내장) 모드는 인메모리 모드와 동일하게 애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식이다.

     

    인메모리 모드와 다른 점은 데이터를 로컬에 저장하기 때문에 데이터 휘발에서 자유롭다는 점이다. 이로 인해 간단한 애플리케이션에서 사용하기 좋다.

     

    스프링부트 프로젝트에서 H2를 임베디드 모드로 사용하는 방법은 url을 제외하고 동일하게 설정해주면 된다.

     

    application.yml

    spring:
      datasource:
        driver-class-name: org.h2.Driver
        url: jdbc:h2:{DB가 저장될 경로}
        username: sa
        password:

    application.properties

    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.url=jdbc:h2:{DB가 저장될 경로}
    spring.datasource.username=sa
    spring.datasource.password=

    위의 인메모리 모드와 차이점이라면 mem이 사라지고 jdbc:h2:이후에 바로 DB가 저장될 경로를 입력하는 것이다.

     

    예를 들어, 프로젝트 폴더 내의 data라는 폴더에 demo라는 DB를 사용하기 위해선 아래와 같이 설정해주면 된다.

     

    application.yml

    spring:
      datasource:
        driver-class-name: org.h2.Driver
        url: jdbc:h2:./data/demo
        username: sa
        password:

    application.properties

    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.url=jdbc:h2:./data/demo
    spring.datasource.username=sa
    spring.datasource.password=

    이와 같이 설정하고 애플리케이션을 실행하면 프로젝트 폴더 내에 data 폴더와 아래와 같은 파일이 생성되는 것을 확인할 수 있다.

    이 파일을 별도로 삭제하지 않는 이상 애플리케이션의 실행 여부와 관계 없이 데이터가 사라지지 않는다.

     

    브라우저에서 H2 콘솔에 접속하는 방법은 인메모리 모드와 동일하다. Driver Class, JDBC URL, User Name, Password를 위의 설정 그대로 입력하면 접속되는 것을 볼 수 있다.

    application 설정과 동일한 정보로 H2 콘솔에 접속할 수 있다.

    마치며

    기존에는 단위 테스트를 위한 인메모리 방식으로만 H2를 사용하고 있었는데 사내에서 진행하는 소규모 프로젝트에서 별도로 DBMS를 설치하지 않고도 임베디드 방식의 H2를 사용하는 것을 보고 알아두는 것이 좋을 것 같아서 정리해보았다.

     

    만약 인메모리 모드나 임베디드 모드에서 DB가 연결에 문제가 있다면 아래 글을 참조하면 좋을 것이다.

     

    [H2] Database "mem:testdb" not found, either pre-create it or allow remote database creation 해결

    Intro 스프링부트에서는 아래와 같은 설정으로 간단하게 인메모리 H2 데이터베이스를 사용 할 수 있습니다. application.yml spring: datasource: url: jdbc:h2:mem:testdb username: sa build.gradle.kts runtimeOnly("com.h2databa

    shanepark.tistory.com