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
'BackEnd > DB' 카테고리의 다른 글
H2 DB - 3가지 Connection 모드 (0) | 2024.06.20 |
---|---|
[몽고DB, 스프링부트] Springboot, MongoDB 연동 (0) | 2023.01.22 |
[MySQL] MySQL 워크벤치 설치 및 RDS 연결 (3) | 2022.04.14 |
[데이터베이스] ERD cloud 사용법 - 무료 ERD 모델링 도구 (8) | 2022.01.10 |