H2 DB의 3가지 모드와 사용법 - Server Mode, Embedded Mode, In-Memory Mode

Jinny·2023년 4월 3일
2

Spring

목록 보기
3/10

💾 H2 DB

H2 DB는 3가지 모드가 있다.
각 모드 별 URL이나 커넥션 풀 등 관련 상세 내용은 공식 문서에서 확인 가능하다.

본글에서는 3가지 모드와 사용법에 대해 공부한 내용을 정리했다.

H2 DB의 3가지 모드

  • Server Mode
  • Embedded Mode
  • In-Memory Mode

🎛️ 3가지 모드

3가지 모드에 대해 간략히 정리해 보면 다음과 같다.

ModeH2 다운로드 여부실행 주체DB 저장 위치
Server ModeO외부로컬(파일 시스템)
Embedded ModeX스프링로컬(파일 시스템)
In-Memory ModeX스프링메모리

좀 더 상세히 알아보자.

Server Mode

  • H2 실행 파일을 다운로드해야 한다.
  • 외부에서 터미널을 통해 H2 서버를 실행해야 한다.
  • 서버를 실행하면 스프링에서 application.properties에 서버 주소를 입력해 접속한다.
  • H2 DB 데이터를 로컬에 직접 저장하고 사용한다.

💡 참고:
터미널에서 H2 서버 실행하는 방법(Mac):
H2 다운로드 폴더 진입 > bin 폴더 경로에서 터미널 실행 > ./h2.sh 입력

Embedded Mode

  • H2 실행 파일 다운로드가 필요 없다.
  • build.gradleapplication.properties 설정을 통해 실행 가능하다.
  • 스프링 부트 실행할 때 함께 H2를 띄운다.
  • H2 DB 데이터를 로컬에 직접 저장하고 사용한다.

In-Memory Mode

  • H2 실행 파일 다운로드가 필요 없다.
  • build.gradleapplication.properties 설정을 통해 실행 가능하다.
  • 스프링 부트 실행할 때 함께 H2를 띄운다.
  • H2 DB 데이터를 로컬에 저장하지 않고 메모리에만 가지고 있다.

어떤 모드를 사용해야 할까?

In-Memory Mode는 파일 시스템이나 네트워크를 사용하지 않고 애플리케이션 내부에서만 데이터를 유지한다.
따라서 Server/Embedded Mode와는 달리 서버를 재시작하면 데이터가 삭제되기 때문에 주의해야 한다.

하지만 데이터베이스가 일시적으로 필요한 경우에 매우 유용하다.
예를 들면 테스트가 필요할 때 메모리에서 실행하여 빠른 성능을 확보할 수 있다.

데이터를 영구적으로 저장하려면 Embedded modeServer mode를 사용해야 한다.


📖 사용법

Spring Boot 프로젝트에서 H2 DB를 사용하려면 다음과 같은 순서로 설정을 해야 한다.

  1. build.gradle에 의존성 추가
  2. application.properties에 H2 환경 설정

1. build.gradle에 의존성 추가

아래 코드를 참고하여 의존성을 추가한다.

gradle의 의존성 옵션은 다양하다. 여기서는 세가지 옵션에 대해서 설명을 하겠다.
더 많은 옵션은 gradle 공식문서를 참고하라.

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-jdbc' //JDBC Driver 추가 
   implementation 'com.h2database:h2' // 여러가지 옵션 중 원하는 옵션 선택
   // runtimeOnly 'com.h2database:h2' 
}

⚠️ 참고1:
공식 문서에 따르면 의존성을 추가할 때 버전을 명시하지 않으면 artifact에 따라 spring이 매핑해놓은 버전이 다운로드된다.
H2:1.4.198 버전부터 보안상의 문제로 자동 데이터베이스 생성을 막아 두었는데,
밑에 2번 설정까지 완료 후 데이터베이스 생성 관련 오류가 생긴다면 해당 블로그 글을 참고해 보시라.
혹은 버전을 다운그레이드 시도해 보시라.

⚠️ 참고2:
H2는 보안상 취약점이 있는 버전의 경우, IDE가 경고를 띄어주는데 사용하는데는 문제가 없다.
어떤 버전에 어떤 취약점이 있는지 확인하고 싶다면 사이트를 참고 하시라.

implemenataion 옵션

  • 직접적으로 의존하는 모듈만 rebuild를 하기 때문에 빠르다.
  • compile 시점에는 API를 노출하지 않지만 runtime 시점에는 노출된다.
  • 따라서 compile 시 sql 파일을 자동으로 읽을 수 없어 실행할 sql 파일 경로를 application.properties에 입력해야 한다.

runtimeOnly 옵션

  • compile 시점에는 필요없고 runtime 시점에만 필요한 라이브러리를 추가할 때 사용한다.
  • 대표적으로 Logging 관련 라이브러리, DB 관련 라이브러리 등이 있겠다.
  • runtime 중에 종속성을 추가하기 때문에 application.properties에 실행할 파일 경로를 입력하지 않아도 된다.

testImplementation 옵션

  • 테스트 코드를 수행할 때 적용할 라이브러리를 추가할 때 사용한다.
  • 위에서 말했던 In-Memory Mode를 테스트 시에 사용하고 싶다면 해당 옵션을 사용하면 되겠다.

2. application.properties에 H2 환경 설정

아래 코드를 참고하여 설정을 해준다.

# H2 데이터베이스의 웹 콘솔 기능 활성화
spring.h2.console.enabled=true // 웹 콘솔 기능 활성화
spring.h2.console.path=/h2-console // 경로 지정

# H2 설정
spring.datasource.driverClassName=org.h2.Driver
// spring.datasource.url=jdbc:h2:~/cafe # embedded Mode : db 데이터 저장 위치 설정
// spring.datasource.url=jdbc:h2:mem:test # In-Memory mode
spring.datasource.username=sa
spring.datasource.password=

# DB 초기화 쿼리 필요 시 설정
// spring.sql.init.mode=always
// spring.sql.init.schema-locations=classpath:schema.sql # 경로 입력
// spring.sql.init.data-locations=classpath:data.sql # 경로 입력

웹 콘솔 기능 활성화

웹 콘솔을 활성화 하면 localhost:{설정한 포트}/h2-console 를 통해 H2 DB 어드민 페이지에 접속할 수 있다.
포트를 따로 지정하지 않았으면 기본은 8080이다.

H2 설정

H2 설정은 어드민 페이지에 최초 설정한 것과 동일하게 입력하면 된다.

DB 초기화 쿼리

H2가 실행될 때 매번 DB 초기화가 필요하다면 실행할 sql 파일 경로를 지정하면 된다.
H2 의존성을 runtimeOnly로 설정했다면 resources/ 경로의 파일을 자동으로 읽는다.


profile
블로그 이사갔어요. https://jinny-l.tistory.com/

1개의 댓글

comment-user-thumbnail
2024년 8월 20일

인메모리 모드는 저장 방식이고, h2db의 임베디드 모드, 서버 모드, 혼합모드 와는 독립적이면서 동시에 결합할 수 있는 개념아닌가요??
https://www.h2database.com/html/features.html#connection_modes 공식문서입니다.

답글 달기