H2 DB는 3가지 모드가 있다.
각 모드 별 URL이나 커넥션 풀 등 관련 상세 내용은 공식 문서에서 확인 가능하다.
본글에서는 3가지 모드와 사용법에 대해 공부한 내용을 정리했다.
H2 DB의 3가지 모드
- Server Mode
- Embedded Mode
- In-Memory Mode
3가지 모드에 대해 간략히 정리해 보면 다음과 같다.
Mode | H2 다운로드 여부 | 실행 주체 | DB 저장 위치 |
---|---|---|---|
Server Mode | O | 외부 | 로컬(파일 시스템) |
Embedded Mode | X | 스프링 | 로컬(파일 시스템) |
In-Memory Mode | X | 스프링 | 메모리 |
좀 더 상세히 알아보자.
application.properties
에 서버 주소를 입력해 접속한다.💡 참고:
터미널에서 H2 서버 실행하는 방법(Mac):
H2 다운로드 폴더 진입 >bin
폴더 경로에서 터미널 실행 >./h2.sh
입력
build.gradle
및 application.properties
설정을 통해 실행 가능하다.build.gradle
및 application.properties
설정을 통해 실행 가능하다.In-Memory Mode
는 파일 시스템이나 네트워크를 사용하지 않고 애플리케이션 내부에서만 데이터를 유지한다.
따라서 Server/Embedded Mode
와는 달리 서버를 재시작하면 데이터가 삭제되기 때문에 주의해야 한다.
하지만 데이터베이스가 일시적으로 필요한 경우에 매우 유용하다.
예를 들면 테스트가 필요할 때 메모리에서 실행하여 빠른 성능을 확보할 수 있다.
데이터를 영구적으로 저장하려면 Embedded mode
나 Server mode
를 사용해야 한다.
Spring Boot 프로젝트에서 H2 DB를 사용하려면 다음과 같은 순서로 설정을 해야 한다.
build.gradle
에 의존성 추가application.properties
에 H2 환경 설정
아래 코드를 참고하여 의존성을 추가한다.
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
옵션application.properties
에 입력해야 한다.runtimeOnly
옵션application.properties
에 실행할 파일 경로를 입력하지 않아도 된다.testImplementation
옵션아래 코드를 참고하여 설정을 해준다.
# 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 초기화가 필요하다면 실행할 sql 파일 경로를 지정하면 된다.
H2 의존성을 runtimeOnly
로 설정했다면 resources/
경로의 파일을 자동으로 읽는다.
인메모리 모드는 저장 방식이고, h2db의 임베디드 모드, 서버 모드, 혼합모드 와는 독립적이면서 동시에 결합할 수 있는 개념아닌가요??
https://www.h2database.com/html/features.html#connection_modes 공식문서입니다.