H2 DB - 인메모리(In-Memory) 모드

 



H2 DB를 공부하면서 H2를 In-Memory 모드로 사용할 수 있다는 것을 알게 되었다.

(H2 DB는 보면 볼수록 유용한 기능을 많이 제공하는 것 같다.)

 

이 In-Memory 모드를 사용하면 개발환경 및 테스트 환경에서 유용하게 사용할 수 있을 것 같다는 생각에 학습하여 적용해보았고, 

학습 기록을 포스팅해보려고 한다.

 

 


 

인메모리 모드 (In-Memory Mode)

 

H2의 인 메모리 모드 는 데이터베이스의 데이터가 메모리에만 존재하고 디스크에 저장되지 않는 모드이다.

 

테스트 또는 개발 환경 같은 특정 케이스에서는, 데이터의 영속이 필요하지 않을 수도 있다.

 

H2 DB는 그러한 상황을 위해 데이터가 영속되지 않는 인 메모리 모드를 지원한다.

인메모리 모드는 모든 Connection이 close되면, DB도 close되며 DB에 요청된 CRUD 작업에 대한 내용이 영속되지 않고 모두 휘발된다.

H2에 대해 자세히 알기 이전에는 사람들이 왜 테스트 DB로 H2를 선택하는 지 몰랐지만,
RDB와 똑같이 사용할 수 있지만 모드를 지원한다는 점과, 인메모리 모드로 사용함으로써 얻을 수 있는 성능상의 이점만으로
테스트 DB로 사용할만하다고 생각이 들었다. (테스트 속도는 빠를 수록 좋으니까)

 

 


 

In-Memory Mode의 2가지 종류

이러한 인 메모리 모드는 2가지 종류가 있고 DB URL을 통해 설정이 가능하다.

그 2가지 모드에 대해 알아보자.

 

 

• 1 Connection per 1 Database 모드

해당 모드를 적용하는 경우, 동일한 JVM 내에서 두 개의 커넥션을 열면 각각의 커넥션은 서로 다른 DB를 사용할 수 있다.

💡 해당 모드를 사용하면 각각의 커넥션이 각각의 DB를 사용하기 때문에 성능면에서 단점이 있어보였다.
커넥션 별로 다른 DB를 사용해야하는 특수한 상황이 아니라면 사용을 지양하는 편이 좋겠다고 생각이 든다.

 

• N Connections per 1 Database 모드

여러 커넥션을 통해 하나의 DB에 접근하려면 해당 모드를 선택하면 된다.

해당 모드를 적용하는 경우, 동일한 JVM 내에서 두 개의 커넥션을 여는 경우 두 커넥션은 하나의 같은 DB에 접근한다.

💡 굳이 커넥션 단위로 DB를 분리할 이유가 없다면, 이 N Connections per 1 Database 모드를 사용하는 것을 추천한다.

 

 


 

In-Memory Mode 의 장단점

 

장점

  • DB를 설치하고 DB 서버를 실행할 필요없이 build.gradle에서 의존성만 추가해주어도 사용할 수 있다.
  • 모드에 따라 커넥션 단위로 각각의 DB를 사용하게 할 수 있는 등, 세부 옵션이 존재한다.
  • In-Memory 모드는 매우 빠른 초기화 및 쿼리 성능을 제공하므로, 테스트 및 개발 환경에서 신속한 반복 작업이 가능하다.

단점

  • 여러 JVM을 사용하는 분산환경에서 자원 공유가 불가능하다.
    메모리 관리는 JVM 내에서 수행하기 때문에 Embedded 모드와 마찬가지로 동일한 DB에 접근하는 것은 오직 같은 JVM 내에서만 가능하다.
  • JVM의 메모리를 사용하기 때문에 메모리가 부족한 환경에서 OOM(Out Of Memory)를 유발할 수 있다.

 

 


 

적용 방법

 

build.gradle

dependencies {
    runtimeOnly 'com.h2database:h2' // h2 의존성 추가
}

 

 

• 1 Connection per 1 Database 모드

application.yml

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

 

 

• N Connections per 1 Database 모드

application.yml

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

 

application.properties의 datasource URL 설정 값을 다음과 같이 설정한다.

이렇게만 설정해주면 H2DB 설치 없이 인 메모리 방식으로 H2 DB를 사용할 수 있다.

 

 


Reference

 

Features

  Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore

www.h2database.com