[DB] H2 데이터베이스

dondonee·2024년 3월 25일
0

H2 데이터베이스

특징 및 장점

  • Java를 위한 데이터베이스(JDBC API)이며 오픈소스이다.
  • 가볍고 빠르다. (설치 파일이 2.5 MB 정도)
  • 인메모리 모드, 서버 모드, 임베디드 모드를 제공한다.
  • 간편한 브라우저 모드를 제공한다.

이러한 특징 때문에 H2는 작은 프로젝트나 개발 도중 임시 데이터베이스로 사용하기 좋다고 한다. 또한 H2는 다양한 데이터베이스 엔진과 SQL 호환을 지원하므로 마이그레이션에도 좋다.



제공 모드

1) 임베디드 모드

같은 JVM(로컬)에서 JDBC를 이용해 데이터베이스에 접근하는 모드

  • 가장 속도가 빠른 모드이다.
  • 단점으로는 하나의 JVM에서 하나의 데이터만 사용할 수 있다는 것과, 데이터의 안전성이 보장되지 않는다는 문제가 있다. 애플리케이션이 SQL을 수행하는 동안 동시에 데이터를 읽고 쓸 수 있기 때문이다. 안전성을 우선하는 경우 애플리케이션과 데이터베이스를 분리하는 서버 모델을 사용하는 것이 더 좋다.
  • URL : jdbc:h2:

2) 서버 모드

원격에서 JDBC를 이용하여 데이터베이스에 접근하는 모드

  • 같은 서버 뿐 아니라 다른 서버에서도 접근할 수 있으며, 여러 애플리케이션이 동시에 접근할 수 있다.
  • TCP/IP를 사용하기 때문에 임베디드 모드에 비해서는 느리다. 내부적으로 임베디드 모드가 사용된다.
  • URL : jdbc:h2:tcp://

3) 믹스드 모드

로컬과 원격에서 동시에 데이터베이스에서 접근하는 모드

  • 데이터베이스에 처음 접근하는 애플리케이션은 임베디드를 사용하고, 다른 프로세스의 경우 서버를 사용한다. 전자의 경우 임베디드 모드만큼 빠르고 후자는 그보다는 느리다.


인메모리 데이터베이스

H2는 모든 모드에서 영속 데이터베이스 또는 인메모리 데이터베이스를 모두 사용할 수 있다. 영속 데이터베이스는 데이터를 디스크에 저장하는 일반적인 방식이고, 인메모리 데이터베이스는 메모리에 저장하고 연산하는 방식이다.

인메모리 데이터베이스의 특징은 다음과 같다 :

  • 테스트, 읽기 전용 데이터베이스 등 특수한 케이스에서 사용한다. 메모리에서 연산하기 때문에 속도가 매우 빠르다.
  • 인메모리 모드는 기본적으로 커넥션이 끊어지면(애플리케이션이 종료되면) 데이터는 휘발된다.
  • 영속 데이터베이스를 사용할 때와 달리 mv.db 파일을 생성할 필요가 없다. jdbc:h2:mem:testdb와 같이 URL만 설정해 주면 된다. testdb는 데이터베이스 이름이다.
  • URL에 ;DB_CLOSE_DELAY=-1을 추가하여 JVM이 살아있는 동안은 데이터를 유지하도록 할 수 있지만, 메모리 누수가 발생할 수 있다.
  • 인메모리 데이터베이스는 한 번에 한 커넥션만 가질 수 있다(private). 따라서 다른 프로세스나 다른 컴퓨터에서 접근할 수 있게 하려면 해당 인메모리 데이터베이스에 대한 TCP 서버 모드를 시작해야 한다 (jdbc:h2:tcp://localhost/mem:testdb = 믹스드 모드).


사용법

설치(Homebrew)

먼저 로컬에 H2를 설치해주어야 한다. 나는 Homebrew를 통해 설치했다. 설치가 완료되면 brew services start h2 명령어를 통해 H2를 동작시켜준다.

스프링부트 의존성 추가

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.h2database:h2'
}

build.gradle에 JDBC와 H2 의존성을 위와 같이 추가해준다.



데이터베이스 생성 및 연결

cd ~
touch testdb.mv.db

먼저 터미널에서 mv.db 확장자를 가진 빈 파일을 홈 디렉토리에 생성해준다.

그리고 브라우저에서 H2 데이터베이스의 기본 포트인 localhost:8082를 입력하면 브라우저 콘솔이 뜬다.


jdbc:h2:~/testdb                --> 임베디드 모드
jdbc:h2:tcp://localhost/~/test  --> 서버 모드
jdbc:h2:mem:test                --> 인메모리 모드

콘솔의 JDBC URL에 사용할 모드와 mv.db 파일의 위치(~)에 맞게 URL 값을 입력해주고 연결을 한다.

스프링부트 설정 URL도 마찬가지로 입력해주면 된다.



호환 모드

H2 데이터베이스는 ANSI SQL을 따르는 자신만의 문법을 갖고 있지만 Oracle, MySQL, MS SQL 등 다른 데이터베이스 엔진과의 호환을 제공하고 있다.


MySQL 호환 모드 설정하기

jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_LOWER=TRUE

MySQL 호환 모드를 사용하고 싶다면 위와 같이 URL에 MODE=MySQL;DATABASE_TO_LOWER=TRUE를 추가한다. 식별자의 대소문자를 구분하지 않으려면 ;CASE_INSENSITIVE_IDENTIFIERS=TRUE 또한 추가한다. DATABASE_TO_LOWER=TRUE 속성은 일단 데이터베이스가 생성된 후에는 수정하지 않는다.

MySQL은 기본적으로 텍스트 비교에 대소문자를 구분하지 않지만 H2는 구분한다. 대소문자를 구분하지 않으려면 URL에 IGNORECASE=TRUE를 추가한다. 이 설정은 =, LIKE, REGEXP를 사용할 때 영향이 있다.


스프링부트 문법 오류

[42001] Syntax error in SQL statement

실행한 SQL의 문법이 올바르지 않으면 42001 오류가 발생한다. 작성된 SQL이 설정된 SQL 다이얼렉트와 달라 문법 오류가 발생하는 경우에도 이 오류가 나타나므로 다이얼렉트도 체크해보자.




🔗 Reference

0개의 댓글