목차
들어가기 전에
H2는 굉장히 작고 가벼운 RDBMS로, 그 특성상 제공되는 기능은 제한적이지만 속도가 빠르고 별도의 프로그램 없이 웹브라우저 기반의 DB 콘솔을 사용할 수 있다는 장점도 있다. 이러한 특징으로 인해 다양한 기능이 필요하지 않은 소규모 서비스나 단위 테스트에서 많이 사용된다.
H2는 별도의 엔진을 설치하지 않고 사용할 수 있는 In-memory Mode와 Embedded Mode를 지원하는데 이 글에서는 Embedded 방식을 사용하는 방법과 In-memory 방식과의 차이에 대해 정리하려고 한다.
H2의 여러 모드들이 갖는 특징
H2는 Server Mode, In-memory Mode, Embeded Mode라는 세가지 방식으로 사용할 수 있다. 각 방식의 특징은 다음과 같다.
- Server Mode
- 직접 엔진을 설치하여 사용하는 방식.
- 애플리케이션과 상관 없는 외부에서 DB 엔진이 구동된다.
- 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.
- In-memory Mode
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
- 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
- 데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션을 종료하면 데이터가 사라진다.
- Embedded Mode
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
- 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
- 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.
공통적으로 스프링부트에서 H2를 사용하려면 아래 의존성 라이브러리가 추가되어 있어야 한다.
Gradle
runtimeOnly 'com.h2database:h2'
Server mode
서버 모드는 여타 DBMS와 동일하게 DB 엔진을 설치하고 엔진을 구동하여 사용하는 방식이다. 애플리케이션과 DB가 분리되어 있기 때문에 여러 애플리케이션에서 동일한 DB를 사용하기에 적합하다고 볼 수 있다.
H2 DBMS는 아래 공식 사이트에서 다운로드 받을 수 있다.
In-memory Mode
인메모리 모드는 애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식이다. 데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션이 종료되면 모든 데이터가 사라지는 휘발성의 특징을 갖고 있다.
이러한 특징으로 인해 단위 테스트 등에서 많이 사용된다.
스프링부트 프로젝트에서 H2를 인메모리 모드로 사용하려면 application.yml
또는 application.properties
에서 아래와 같이 설정하면 된다.
application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:{DB 이름}
username: sa
password:
application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:{DB 이름}
spring.datasource.username=sa
spring.datasource.password=
datasource의 url에는 일반적으로 DB 서버의 호스트와 포트 번호, DB 이름 등의 접속 정보를 기재하는데, H2에서는 여기에 mem
을 기재하여 애플리케이션이 실행되는 메모리 자체에서 DB를 사용하겠다는 것을 선언한다.
Embedded Mode
임베디드(내장) 모드는 인메모리 모드와 동일하게 애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식이다.
인메모리 모드와 다른 점은 데이터를 로컬에 저장하기 때문에 데이터 휘발에서 자유롭다는 점이다. 이로 인해 간단한 애플리케이션에서 사용하기 좋다.
스프링부트 프로젝트에서 H2를 임베디드 모드로 사용하는 방법은 url을 제외하고 동일하게 설정해주면 된다.
application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:{DB가 저장될 경로}
username: sa
password:
application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:{DB가 저장될 경로}
spring.datasource.username=sa
spring.datasource.password=
위의 인메모리 모드와 차이점이라면 mem
이 사라지고 jdbc:h2:
이후에 바로 DB가 저장될 경로를 입력하는 것이다.
예를 들어, 프로젝트 폴더 내의 data라는 폴더에 demo라는 DB를 사용하기 위해선 아래와 같이 설정해주면 된다.
application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:./data/demo
username: sa
password:
application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:./data/demo
spring.datasource.username=sa
spring.datasource.password=
이와 같이 설정하고 애플리케이션을 실행하면 프로젝트 폴더 내에 data 폴더와 아래와 같은 파일이 생성되는 것을 확인할 수 있다.
이 파일을 별도로 삭제하지 않는 이상 애플리케이션의 실행 여부와 관계 없이 데이터가 사라지지 않는다.
브라우저에서 H2 콘솔에 접속하는 방법은 인메모리 모드와 동일하다. Driver Class, JDBC URL, User Name, Password를 위의 설정 그대로 입력하면 접속되는 것을 볼 수 있다.
마치며
기존에는 단위 테스트를 위한 인메모리 방식으로만 H2를 사용하고 있었는데 사내에서 진행하는 소규모 프로젝트에서 별도로 DBMS를 설치하지 않고도 임베디드 방식의 H2를 사용하는 것을 보고 알아두는 것이 좋을 것 같아서 정리해보았다.
만약 인메모리 모드나 임베디드 모드에서 DB가 연결에 문제가 있다면 아래 글을 참조하면 좋을 것이다.
'Development > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] AOP를 이용해서 DB에 API 로그를 남겨보자 (2) | 2024.02.06 |
---|---|
[Spring Boot] @Value 대신 생성자 바인딩을 통해 프로퍼티 값을 바인딩하고 관리해보자 (0) | 2023.12.21 |
[Spring Boot] 스프링이 제공하는 다양한 어노테이션을 통한 유효성 검사와 응답 처리 (0) | 2023.08.28 |
[Spring Security] 스프링 시큐리티를 적용하고 예외가 발생했을 때 403 Forbidden이 발생하는 원인과 처리 방안 (1) | 2023.08.05 |
[JWT] Access Token의 한계와 Refresh Token의 필요성 (12) | 2023.07.19 |
댓글