본문 바로가기
개발/스프링

H2 Database를 이용하여 간단하게 개발 시작하기

by 카펀 2022. 12. 30.

백엔드 개발을 할 때, DB의 사용은 필수적입니다.

단순한 CRUD 게시판을 만든다고 해도, DB가 있어야 글을 저장하고, 조회하고, 수정하고, 삭제하는 기능을 이용할 수 있습니다.

하지만 처음부터 냅다 MySQL 같이 규모 있는 DB 환경을 셋업하고 시작하기엔 무리가 가는 것이 사실입니다.

 

이를 위해 간단하게 사용할 수 있는 메모리 기반의 RDBMS가 존재합니다.

H2 Database라고 하는데요. 예전에 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 따라서 개발하면서 언급한 바 있습니다.

메모리 상에 DB가 생성되고, 따라서 애플리케이션이 시작할 때마다 초기화되므로 개발을 진행하며 사용하기에 아주 좋습니다. 실무 환경에서도, 개발/운영 DB에 직접 데이터를 쓰고 지우기에는 부담이 될 때 활용할 수 있습니다.

 

이러한 장점 덕분에, Spring Boot 프로젝트를 생성하는 Spring Initializr를 보시면, dependency의 하나로 지원하고 있습니다.

H2 Database

저 역시 H2를 자주 사용하고 있던 차에, 기본적인 설정 방법이 다소 헷갈릴 수 있다고 생각하게 되었습니다.

따라서 H2 Database를 JPA와 함께 설정하는 과정을 공유해보고자 합니다.

목차

1. H2 Database dependency 추가

2. H2 사용을 위한 설정 추가

3. JPA Entity

4. 실행 확인

1. H2 Database dependency 추가

빌드를 Gradle로 하는 경우를 기준으로, H2를 dependency에 추가하는 방법은 총 3가지가 있습니다.

  1. Spring Initializr에서 추가한 후 내려받기
  2. IDE에서 추가한 후 프로젝트 생성하기
  3. build.gradle에 추가하기

1. Spring Initializr에서 추가한 후 내려받기

위의 이미지에서 보여드린 방법입니다.

Spring Initializr (start.spring.io)에 접속하시면 아래와 같은 화면이 보입니다 (2022년 12월 30일 기준).

start.spring.io

왼쪽은 기본 설정을 하는 화면이며, 오른쪽은 프로젝트에서 사용할 dependency를 검색하여 추가하는 곳입니다.

 

저는 아래와 같이 선택하였습니다.

  • Project: Gradle - Groovy
  • Language: Kotlin
  • Spring Boot: 2.7.7
  • Project Metadata:
    • Group: com.tistory.katfun
    • Artifact: test-project
    • Name: test-project
    • Packaging: Jar
    • Java: 11

위의 내용은 크게 중요하지 않습니다.

 

다음으로, 우측의 'add dependencies'를 클릭합니다.

add dependencies

위와 같은 화면이 나타납니다. Spring 환경에서 사용하면 좋은 다양한 dependency를 추가 및 관리할 수 있습니다.

 

H2 Database를 검색해서 추가해 주시면 됩니다.

참고로, 저는 Spring을 이용한 웹 개발 시에, 아래 dependency도 추가해서 같이 사용합니다.

  • Spring Web
  • Spring Data JPA (이 글에서는 이후에 사용하므로 추가해 주세요.)
  • (Java로 개발하는 경우) Lombok

추가해준 후, 프로젝트를 생성하면 .zip으로 압축된 프로젝트를 받을 수 있습니다. 이것을 IDE에서 여시면 됩니다.

 

2. IDE에서 추가한 후 프로젝트 생성하기

IntelliJ IDEA를 기준으로 소개하겠습니다.

File > New > Project를 선택하고, 좌측에서 Spring Initializr를 선택합니다.

IntelliJ IDEA

이후 내용은 Spring Initializr와 비슷하게 적당히 입력해 줍니다.

3. build.gradle에 추가하기

앞서 소개해 드린 두 방법은 신규 프로젝트를 생성할 때 사용하는 방법입니다.

하지만 기존에 생성한 프로젝트에서도 쉽게 dependency를 추가할 수 있습니다.

 

build.gradle을 열고, dependencies 내에 아래 내용을 추가해 줍니다.

runtimeOnly 'com.h2database:h2'

build.gradle

이후 reload를 한 번 해주시면 필요한 내용을 전부 내려받아 옵니다.

2. H2 사용을 위한 설정 추가

성공적으로 H2가 프로젝트에 추가되었다면, 아래와 같이 확인할 수 있습니다.

Gradle 내 Dependencies 확인

잘 받아와진 것을 확인할 수 있습니다.

 

우리가 실제 DB에 접속하려면 jdbc driver, url 등 정보가 필요하듯, H2 Database 역시 그러한 내용이 필요합니다.

이 내용을 추가해 보도록 하겠습니다.

 

src/main/resources 아래에 application.properties 파일이 있습니다.

이 파일을 그대로 사용하셔도 되고, 확장자를 .yml로 바꾸어 사용하셔도 됩니다.

 

파일을 열고, 아래와 같이 입력합니다.

 

application.yml의 경우:

spring:
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/test
    username: sa
    password:
  jpa:
    show_sql: true
    hibernate:
      ddl-auto: create

 

application.properties의 경우:

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

spring.h2.datasource.driver-class-name=org.h2.Driver
spring.h2.datasource.url=jdbc:h2:~/test
spring.h2.datasource.username=sa
spring.h2.datasource.password=

spring.h2.jpa.show_sql=true
spring.h2.jpa.hibernate.ddl-auto=create

 

저는 개인적으로 application.yml로 설정하는 것을 더 좋아합니다.

application.yml

위 내용을 간단히 설명하면,

h2 console은 웹 브라우저 상에서 사용할 수 있는 h2 console에 대한 설정입니다.

이를 활성화하고, 접속 url을 "/h2-console"로 지정하였습니다.

datasource는 DB의 접속 등에 관련된 설정입니다. 기본적으로는 driver, jdbc url, username, password 등을 설정하는 내용이라고 이해하시면 됩니다.

jpa는 JPA를 사용하는 경우에 대한 설정입니다. show_sql을 true로 설정하여 호출되는 쿼리가 콘솔에 출력되도록 하였고, hibernate: ddl-auto: create로 설정하여, 테이블이 없는 경우 create를 통해 생성하도록 하였습니다.

 

yml을 통해 설정하시는 경우, 띄어쓰기에 주의하시기 바랍니다. Python과 비슷하게, 특정 카테고리의 하위 내용을 띄어쓰기 두 칸 (  )으로 구분합니다.

이 띄어쓰기가 잘못 되어 있는 경우 설정이 원하는 대로 되지 않을 수 있으며, 이 경우 문제점을 발견하기도 굉장히 어렵습니다.

예를 들어, jpa에 관한 내용이 아래와 같이 작성된다면,

  jpa:
    show_sql: true
    hibernate:
    ddl-auto: create

테이블이 자동으로 생성되지 않습니다.

ddl-auto는 hibernate의 하위  내용이므로, ddl-auto 앞에 띄어쓰기 두 칸을 추가하셔야 합니다.

 

각 설정에 대한 자세한 내용은 공식 문서에서 확인하실 수 있습니다.

3. JPA Entity

JPA의 Entity를 이용하여, 테이블을 정의해 보겠습니다.

저는 src/main/kotlin/com.tistory.katfun.mapleanalysis 밑에 domain이라는 패키지를 만들고, Users.kt 파일을 생성했습니다.

이 클래스는 JPA Entity에 대한 내용을 정의하기 위해 쓰입니다.

 

아래와 같이 작성합니다.

// kotlin
package com.tistory.katfun.mapleanalysis.domain

@Entity
class Users (
    var token: String,
    var createdAt: LocalDateTime = LocalDateTime.now(),
    var editedAt: LocalDateTime = LocalDateTime.now(),
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long
)

Java의 경우에는 아래와 같이 작성할 수 있습니다.

// java
package com.tistory.katfun.mapleanalysis.domain;

@Entity
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column
    private String token;
    
    @Column
    private LocalDateTime createdAt = LocalDateTime.now();

    @Column
    private LocalDateTime editedAt = LocalDateTime.now();
}

 

id를 PK로 가지고, token, createdAt, editedAt를 각각 column으로 가지는 테이블을 정의하였습니다.

4. 실행 확인

다음으로, 메인 application을 실행해 봅니다.

메인 application에는 @SpringBootApplication이 달려 있습니다.

 

{$projectName}Application.kt

정상적으로 실행된다면, 아래와 같은 로그가 출력됩니다.

확대해서 보시면 더 잘 보입니다.

중간에 라이언이 서 있는 곳이 보이시나요?

아래에 실행된 쿼리가 보입니다.

DROP TABLE IF EXISTS USERS CASCADE

CREATE TABLE USERS(
    ID BIGINT GENERATED BY DEFAULT AS IDENTITY,
    CREATED_AT TIMESTAMP,
    EDITED_AT TIMESTAMP,
    TOKEN VARCHAR(255),
    PRIMARY_KEY(ID)
)

대충 테이블 생성한다는 뜻입니다.

 

생성된 테이블을 확인해 봅시다.

앞서 언급했던 H2 console에서 확인해 보려는데요.

웹 브라우저에 http://localhost:8080/h2-console 을 입력하면 아래와 같은 화면이 나타납니다.

localhost:8080/h2-console

url은 앞의 설정 파일 (application.properties/yml)에 따라 달라질 수 있습니다.

 

여기서 앞서 설정 파일에 적은 대로 입력하시고 connect를 클릭하시면 웹 콘솔에 접근하실 수 있습니다.

H2 Console

좌측에 USERS가 보이시나요? (Users는 DB 사용자 정보가 담긴 다른 내용입니다.)

저 테이블이 저희가 JPA를 통해 H2 내에 생성한 테이블입니다.

실제로 조회해 보면,

SELECT * FROM USERS

USERS는 정의한 바와 같이 ID, CREATE_AT, EDITED_AT, TOKEN 4개의 column을 가지는 테이블임을 확인할 수 있습니다.

USERS 내에 insert된 내용은 없기 때문에 들어 있는 내용은 없습니다.

요약

이렇게 H2 Database를 설정 및 사용하는 방법에 대해 간단히 알아보았습니다.

H2는 특히 테스트 코드를 작성할 때 편리합니다. 꼭 사용해 보시면 좋겠습니다.

 

 

이후에 H2 사용 중 유용하거나 기록할 만한 경험을 얻는다면 내용을 추가하도록 하겠습니다.

댓글