본문 바로가기
Spring Boot

스프링 부트(Spring Boot) - 5분 안에 H2 Database와 JPA 연동해보기

by 도뎡 2023. 6. 18.
반응형

1. H2 Database란?

H2 DB는 자바 기반의 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 보통 테스트 단계 또는 작은 규모의 프로젝트에서 사용되며, Gradle 또는 Maven에 의존성만 추가해 주면 쉽고 빠르게 H2 DB를 이용할 수 있습니다. (공식 사이트에서 설치해서 사용할 수도 있습니다.)

H2 DB는 In-Memory Mode, Embedded Mode, Server Mode 총 세 가지의 모드를 지원해 주는데요. 여기서는 In-Memory Mode와 Embedded Mode를 이용해서 데이터를 관리하는 방법을 다루게 됩니다.

 

1-1) In-Memory Mode

애플리케이션(WAS) 구동 시 H2 DB 데이터를 메모리에 올려서 관리하는 방식입니다. 애플리케이션이 종료되면 메모리에 올라가 있던 모든 데이터는 사라집니다. 즉, 휘발성이기 때문에 간단한 테스트에 사용하기 좋습니다.

 

1-2) Embedded Mode

애플리케이션(WAS) 구동 시 H2 DB 데이터를 PC에 저장해서 관리하는 방식입니다. In-Memory와는 달리 데이터가 사라지지 않는 비휘발성 모드이기 때문에 개발 초기 단계에 사용하기 좋습니다.

 

2. 프로젝트 생성하기

인텔리제이 커뮤니티 버전을 이용하고 계시다면 스프링 이니셜라이저를 통해 프로젝트를 생성해 주시면 됩니다. 생성할 프로젝트 스펙은 다음과 같습니다.

  • 언어 : Java
  • 빌드 도구 : Gradle
  • 자바 버전 : 11

프로젝트 스펙 1

 

다음으로 부트 버전과 추가할 의존성입니다. H2 DB는 JDBC API와 H2 Database 라이브러리를 필요로 합니다.

프로젝트 스펙 2

 

아래 코드는 build.gradle의 dependencies 구조입니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

3. application.yml(properties) 설정하기

다음으로 애플리케이션 설정 파일을 손봐줘야 합니다. yml 또는 properties에 아래 설정을 추가해 주세요.

server:
  port: 80 # 내장 톰캣 포트번호

spring:
  # H2 Database 설정
  datasource:
    driver-class-name: org.h2.Driver
    url: 'jdbc:h2:mem:test'   # H2 DB 연결 주소 (In-Memory Mode)
    #url: 'jdbc:h2:~/test'    # H2 DB 연결 주소 (Embedded Mode)
    username: username        # H2 DB 접속 ID (사용자 지정)
    password: password        # H2 DB 접속 PW (사용자 지정)

  # H2 Console 설정
  h2:
    console: # H2 DB를 웹에서 관리할 수 있는 기능
      enabled: true           # H2 Console 사용 여부
      path: /h2-console       # H2 Console 접속 주소

  # JPA 설정
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create        # DB 초기화 전략 (none, create, create-drop, update, validate)
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
        format_sql: true      # 쿼리 로그 포맷 (정렬)
        show_sql: true        # 쿼리 로그 출력

 

1. spring.datasource.url

위 설정에서 포인트는 H2 Database 설정의 url과 JPA 설정의 ddl-auto입니다. H2 Database는 url을 기준으로 모드를 선택할 수 있는데요. url에 'mem'이 붙으면, H2 DB가 In-Memory 방식으로 작동하고, 주석 처리된 두 번째 url과 같이 선언하면 Embedded 방식으로 작동합니다.

 

2. jpa.hibernate.ddl-auto

JPA의 테이블 생성 전략을 의미합니다. Entity 클래스를 대상으로 DDL 쿼리의 실행 여부와 실행되는 쿼리를 선택할 수 있습니다.

옵션 설명
none 테이블 생성 전략을 사용하지 않습니다. 보통 운영 환경에서는 해당 옵션이 권장됩니다.
create 기존 테이블을 삭제한 후 테이블을 재생성합니다.
create-drop 기존 테이블을 삭제한 후 테이블을 재생성하고, 애플리케이션 종료 시점에 테이블을 삭제합니다.
update 기존 테이블 구조는 유지하고, 새로 추가된 컬럼(멤버)만 테이블에 반영합니다. 기존 컬럼(멤버)은 속성이 변경되더라도 테이블에 반영되지 않습니다.
validate DDL 쿼리를 실행하지 않고, 온전히 엔티티와 테이블이 정상적으로 매핑되었는지만 확인합니다. none과 마찬가지로 운영 환경에서 권장되는 옵션입니다.

 

4. Entity 클래스 생성하기

마지막으로 테스트용 엔티티 클래스를 추가해 주시면 됩니다. 이 클래스는 H2 DB에 'user' 테이블로 생성되며, yml(properties)에 선언한 테이블 생성 전략(create)에 의해 애플리케이션이 실행되는 시점에 CREATE DDL 쿼리가 실행됩니다.

package com.study.domain;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 30)
    private String name;

    @Column(nullable = false)
    private int age;

    @Column(nullable = false)
    private LocalDate birthday;

}

 

 

5. In-Memory Mode 테스트하기

이제, 애플리케이션을 실행한 후 H2 Console에 접속해 볼 차례입니다. WAS 실행이 완료되면 IDE 콘솔에서 'member' 테이블 DDL 쿼리(DROP & CREATE) 로그를 확인하실 수 있습니다.

실행된 DDL 쿼리

 

yml에 내장 톰캣의 포트 번호를 웹 기본 포트인 '80'으로 설정했고, H2 Console의 경로(path)를 '/h2-console'로 설정했기 때문에 'localhost/h2-console'로 접속해 주시면 됩니다.

H2 Console의 UI는 아래와 같으며, 드라이버 클래스 ~ 비밀번호는 yml(properties)에 설정한 값과 동일하게 작성해 주시면 되는데요. 정보가 올바르게 입력된 상태에서 '연결 시험'을 클릭하면 아래와 같이 '시험 성공'이라는 메시지를 보실 수 있습니다.

In-Memory 모드 '연결 시험' 결과

 

'연결'을 클릭해서 H2 콘솔 메인 화면으로 이동해 보면 아래와 같은 화면을 보실 수 있습니다. 생성된 테이블은 좌측에서 확인할 수 있으며, 중앙 상단의 인풋 박스에 쿼리를 작성할 수 있습니다.

H2 Console 메인 화면

 

저는 MEMBER 테이블에 아래와 같이 데이터를 INSERT 했으며, 인풋 박스 아래에는 쿼리 실행 결과가 출력됩니다.

INSERT 쿼리 실행 결과

 

테이블을 SELECT 해보면, 데이터가 정상적으로 조회되는 것을 확인할 수 있습니다.

SELECT 쿼리 실행 결과

 

앞에서 말씀드렸듯이 In-Memory 방식은 메모리에 데이터를 올리는 휘발성 모드이기 때문에 애플리케이션을 재실행하면 테이블이 재생성되며, 기존 데이터는 모두 삭제됩니다.

애플리케이션 재실행 후 SELECT 쿼리 실행 결과

 

6. Embedded Mode 테스트하기

Embedded 모드는 In-Memory 모드와는 달리 데이터가 PC에 저장되기 때문에 데이터가 삭제되지 않는다는 특징이 있습니다. Embedded 모드를 이용할 땐 H2 DB의 연결 주소와, JPA의 테이블 생성 전략을 'update'로 변경해 주어야 합니다.

server:
  port: 80 # 내장 톰캣 포트번호

spring:
  # H2 Database 설정
  datasource:
    driver-class-name: org.h2.Driver
    #url: 'jdbc:h2:mem:test'  # H2 DB 연결 주소 (In-Memory Mode)
    url: 'jdbc:h2:~/test'     # H2 DB 연결 주소 (Embedded Mode)
    username: username        # H2 DB 접속 ID (사용자 지정)
    password: password        # H2 DB 접속 PW (사용자 지정)
    
  # H2 Console 설정
  h2:
    console: # H2 DB를 웹에서 관리할 수 있는 기능
      enabled: true           # H2 Console 사용 여부
      path: /h2-console       # H2 Console 접속 주소

  # JPA 설정
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: update        # DB 초기화 전략 (none, create, create-drop, update, validate)
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
        format_sql: true      # 쿼리 로그 포맷 (정렬)
        show_sql: true        # 쿼리 로그 출력

 

테이블 생성 전략을 'update'로 설정해도, 처음에는 테이블이 없기 때문에 애플리케이션 실행 시점에 테이블을 CREATE 하는 쿼리가 실행됩니다.

'update' 모드에서 실행된 DDL 쿼리

 

In-Memory 모드와 마찬가지로 드라이버 클래스 ~ 비밀번호는 yml(properties)에 설정한 정보와 동일하게 입력해 주시면 됩니다.

Embedded 모드 '연결 시험' 결과

 

이번에는 다중 삽입 쿼리를 실행해 보았습니다.

multi-row insert 쿼리 실행 결과

 

데이터 또한 정상적으로 조회되고 있습니다.

Embedded 모드 SELECT 쿼리 실행 결과

 

JPA의 테이블 생성 전략을 'update'로 변경했기 때문에 애플리케이션을 재실행해도 DDL 쿼리는 실행되지 않으며, Embedded 모드로 변경했기 때문에 MEMBER 테이블을 SELECT 해보면 기존 데이터가 유지되는 것을 확인하실 수 있습니다. (ID가 33번으로 들어간 건 의문입니다.)

추가 데이터 INSERT 후 SELECT 쿼리 실행 결과

 

7. H2 Database 관련 파일 위치

마지막으로 H2 DB 관련 파일들이 생성되는 위치만 간략히 설명드리고 글을 마치도록 하겠습니다. 윈도우 기준으로 기본 경로는 'C:\Users\(사용자)'이며, Embedded 모드를 통해 생성한 데이터(테이블, 레코드 등)를 초기화하고 싶으시다면, h2.server.properties와 test.mv.db 파일을 삭제해 주시면 됩니다.

H2 DB 관련 파일

 

마치며

사실, H2 DB를 수박 겉핥기식으로만 접해봤기 때문에 디테일하게 다루지는 못하지만, 단위 테스트 단계 또는 개발 초기 단계에서는 가끔씩 이용하기 괜찮은 기능인 듯합니다.

데이터를 유지할 필요가 없는 경우에는 휘발성인 In-Memory 모드를, 데이터를 유지해야 하는 경우에는 비휘발성인 Embedded 모드를, 목적에 알맞게 설정해서 사용해 주시면 되겠습니다.

날씨가 점점 뜨거워지고 있습니다.. 방문자 여러분 모두 더위 조심하시고, 건강 유의하시기 바랍니다!

오늘도 방문해 주셔서 감사드립니다. 좋은 한 주 보내세요 :)

H2-Database.zip
0.11MB

반응형

댓글