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 공식문서입니다.