Posts

Spring Boot에 H2 연결하기

local test를 위한 h2 데이터베이스 연동 과정과 error list

H2 Database

  • Java 기반의 관계형 데이터베이스 관리 시스템 (RDBMS)

특징

  • 매우 빠른 오픈 소스 JDBC API
  • ODBC Driver
  • 임베디드 모드와 서버 모드의 In-Memory Database 기능 지원
  • 브라우저 기반의 콘솔 애플리케이션
  • 약 2.5MB jar 파일 크기로 매우 작음
  • 트랜잭션 지원
  • 다중 버전 동시성 (MVCC)를 통한 동시 접근 허용
  • 암호화된 데이터베이스 제공
  • 전체 텍스트 검색 가능

장점

  • Java 기반이기 때문에 spring 프로젝트에서 local이나 테스트용으로 많이 사용
  • 별도의 설치 과정 없어 구동까지 걸리는 시간이 상대적으로 짧음
  • 표준 SQL 대부분을 지원
  • 다른 DB와 호환성이 좋아 mode로 지정 시 해당 DB의 네이티브 쿼리 적용 가능
  • In-Memory 데이터베이스이기 때문에 빠른 읽고 쓰기가 가능함

단점

  • 메모리에 데이터를 저장하는 방식인 In-Memory 데이터베이스이기 때문에 휘발성이고 안정성이 떨어짐
  • 대규모 데이터 혹은 고부하 환경에는 적절하지 않음
  • 휘발성이기 때문에 백업 / 복구 등을 지원하지 않음

Spring boot와 H2

아래 글은 Spring Boot 프로젝트를 open 한 이후를 가정한다. 프로젝트를 생성할 때 h2 를 추가한 후 생성하도록 하자.

1. h2 설치하기

https://h2database.com/html/main.html 사이트로 이동하여 사용하는 OS에 해당하면서 Spring Boot 프로젝트에 적절한 버전을 다운받아야 한다.

⚠️ 주의 ⚠️

  • External Libraries 내에서 확인한 h2database의 버전으로 설치하는 것이 가장 좋다.
  • Spring Boot 버전이 3.0 이상의 최신 버전이라면 H2는 2.1.x 이상의 버전을 사용해야 한다.
  • Spring Boot 버전이 2.4 이상 2.7 이하라면 H2는 호환성 문제를 피하기 위해 안정적인 1.4.200를 사용하는 것이 좋다.
  • spring Boot 버전이 2.3 이하라면 마찬가지로 1.4.200이나 아래의 버전을 사용하는 것이 좋다.
  • JAVA 버전이 11 이상이라면 h2의 버전 중 2.x 버전을 사용할 수 있다.
  • JAVA 버전이 8 이하라면 h2의 버전 중 1.4.x 버전을 사용할 수 있다.
  • 자세한 사항은 MVNREPOSITORY에서 확인할 수 있다.

2. dependencies 설정하기

1
runtimeOnly 'com.h2database:h2'

DB 접근 API를 어떤 것을 사용하냐에 따라 JPA나 JDBC를 추가하면 된다.

3. properties 설정

1
2
3
4
5
6
7
8
9
# h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem://localhost/~/test
# spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

spring.datasource.username=sa
spring.datasource.password=
  • spring.h2.console.enabled를 true로 설정하여 Spring Boot에서 H2 Console, 즉 H2 Database의 UI을 제공하도록 한다.
  • spring.h2.console.path로 H2 Console의 경로를 설정한다.
  • spring.datasource.url는 h2를 어떤 모드로 사용할 지 결정할 수 있다.
  • DB명은 가장 오른쪽에 위치한다. 위의 설정 파일로 세팅되는 DB의 이름은 test가 되는 것이다.
  • username은 설정하지 않으면 오류를 발생할 수 있으며, 기본값은 sa이다.
  • username이 sa일 경우 password는 존재하지 않는다.


h2를 세팅할 때 username으로 많이 사용하는 sa는 System Administrator (시스템 관리자)의 의미를 가지고 있으며 h2의 password 없이 접근 가능하다.

4. 연결 테스트

우선 h2 database를 실행해야 한다. h2가 설치된 경로로 이동하여 bin 파일 안에 있는 실행 파일을 클릭해 실행하자. 윈도우 사용자라면 h2.bat을, 리눅스 계열 사용자라면 h2.sh를 실행하면 된다. (실행 시 콘솔창이 열리고 브라우저에 h2 접속 화면이 열리는데 이때 콘솔창을 닫으면 접속이 중단된다.) 접속 페이지는 아래와 같다.

접속 창

연결 버튼을 누르면 바로 접속이 된다. 이후 Entity class를 생성해두었을 경우, spring boot 프로젝트 실행 시 해당 entity table이 생성되는 것을 확인할 수 있다. 접속 후 페이지는 아래와 같다.

접속 창

USER는 필자가 생성한 Table이다. 최초 접속 시에는 테이블이 존재하지 않는다.

Error List

1. java.lang.ClassNotFoundException: org.h2.Driver

위와 같은 Err가 발생했을 경우, 아래의 방법을 통해 해결할 수 있다.

❓ 공백 여부 확인

application.properties에서 h2의 설정 내용에 공백이 있는지 확인하자. 공백으로 인해 오류가 발생하는 경우가 왕왕 있는 것 같다. 다만 내 경우에는 공백이 존재하지 않았기 때문에 해당 방법으로는 해결할 수 없었다.
참고 : 회원가입 테스트 오류관련 질문드립니다

❓ 빌드 오류

가끔 spring initializr에서 생성한 프로젝트를 intellJ에서 열면 빌드가 안 먹는 경우가 있다. h2를 주석 처리하고 빌드한 후 다시 주석을 풀고 빌드하면 오류가 사라진다.
필자는 위 오류로 h2 문제가 해결되지 않았으나 다른 dependency를 해결했다.

❓ spring boot와 h2 버전 확인

이 방식으로 필자는 위 오류를 해결했다!
위에서 서술했듯 spring boot와 h2의 버전이 맞지 않아 오류가 발생하기도 한다. 필자의 경우에는 spring boot 버전이 2.7이라 2.0.x를 설치했더니 에러가 발생했다. 이후 찾아보니 Java 버전도 영향이 있다는 것을 발견해 1.4.200으로 재설치했다.

이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.