본문 바로가기
스프링

[스프링] H2 데이터베이스 사용하기

by kdohyeon (김대니) 2023. 2. 9.
반응형

H2 데이터베이스는?

  • 빠르고, 오픈소스이며, JDBC API 를 지원
  • 자바로 작성된 관계형 (relational) 데이터베이스
  • 인메모리 테이블 또는 디스크 기반 테이블 둘 다 지원
    • 인메모리 (In-memory): 어플리케이션이 종료될 때 DB 가 초기화 됨
    • 디스크 기반 (Disk): 어플리케이션이 종료되어도 데이터가 디스크에 저장되어 재사용 가능
  • 브라우저 기반 콘솔 지원 (브라우저에서 쿼리를 날릴 수 있음)
  • 표준 SQL 대부분 지원
  • 주로 로컬 또는 테스트 환경에서 사용
  • 다양한 기능 지원: 트랜잭션, Fulltext search, 암호화된 테이블 등

자세한 내용은 공식 홈페이지를 참고하자.

의존성

implementation("org.springframework.boot:spring-boot-starter-jdbc")

runtimeOnly("com.h2database:h2")

// 로컬에서 콘솔창을 띄울 수 없다면
implementation("org.springframework.boot:spring-boot-devtools")

설정

  • spring.jpa.show-sql=true 실행되는 SQL 문을 콘솔에 노출하기 위함
  • spring.h2.console.enabled=true h2 콘솔 사용 여부
  • spring.sql.init.mode=always h2 데이터베이스가 실행될 때 항상 db/migration/V1__init.sql 파일로 테이블 생성
spring:
  jpa:
    show-sql: true
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    url: jdbc:h2:mem:blog;MODE=MYSQL
    driver-class-name: org.h2.Driver
    username: sa
    password:
    platform: h2
  sql:
    init:
      mode: always
      schema-locations: classpath:db/migration/V1__init.sql

V1__init.sql

db/migration/V1__init.sql 파일은 아래와 같이 구성되어 있다.

DROP TABLE IF EXISTS blog_statistic;
CREATE TABLE blog_statistic
(
    id          BIGINT       NOT NULL AUTO_INCREMENT,
    keyword     VARCHAR(500) NOT NULL,
    count       BIGINT       NOT NULL,
    created_at  TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6),
    created_by  VARCHAR(50)  DEFAULT NULL,
    modified_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6),
    modified_by VARCHAR(50)  DEFAULT NULL,
    PRIMARY KEY (id)
);
CREATE INDEX blog_statistic_keyword_idx ON blog_statistic (keyword);
CREATE INDEX blog_statistic_count_idx ON blog_statistic (count DESC);

콘솔에 접근하기

어플리케이션을 실행하고 브라우저에서 아래 경로로 접근해보자

http://localhost:8080/h2-console

아래와 같은 그림대로 노출되면 성공!

설정대로 접근하기

설정대로 입력하고 Connect 를 클릭하면 아래처럼 접근 가능하다.

V1__init.sql 파일에서 생성한 BLOG_STATISTIC 테이블

초기 데이터는 따로 설정한 것이 없으니 당연히 없다.

초기 데이터는 없음

초기 데이터 넣기

V2__init_data.sql 파일에 초기 데이터가 있다고 하면 아래처럼 설정할 수 있다.

spring:
  sql:
    init:
      data-locations: classpath:db/migration/V2__init_data.sql

데이터베이스 초기화

schema-locations, data-locations 을 활용한 방법은 SQL 스크립트 기반 데이터베이스 초기화 하는 방법이었다. 또 다른 방법으로는 JPA, Hibernate 기반 데이터베이스 초기화를 할 수 있다. @Entity 어노테이션이 부여된 클래스를 스캔하여 자동으로 스키마를 생성해준다.

spring.jpa.generate-ddl=true | false
# JPA 에서 기본적으로 제공하는 스키마를 생성한다.

spring.jpa.hibernate.ddl-audo=create | create-drop | update | validate | none
# Hibernate 가 제공하는 스키마를 생성한다.
# - create: 기존 스키마 drop 후 다시 생성
# - none: 아무것도 하지 않음
반응형

댓글