이러한 특징 때문에 H2는 작은 프로젝트나 개발 도중 임시 데이터베이스로 사용하기 좋다고 한다. 또한 H2는 다양한 데이터베이스 엔진과 SQL 호환을 지원하므로 마이그레이션에도 좋다.
같은 JVM(로컬)에서 JDBC를 이용해 데이터베이스에 접근하는 모드
jdbc:h2:
원격에서 JDBC를 이용하여 데이터베이스에 접근하는 모드
jdbc:h2:tcp://
로컬과 원격에서 동시에 데이터베이스에서 접근하는 모드
H2는 모든 모드에서 영속 데이터베이스 또는 인메모리 데이터베이스를 모두 사용할 수 있다. 영속 데이터베이스는 데이터를 디스크에 저장하는 일반적인 방식이고, 인메모리 데이터베이스는 메모리에 저장하고 연산하는 방식이다.
인메모리 데이터베이스의 특징은 다음과 같다 :
jdbc:h2:mem:testdb
와 같이 URL만 설정해 주면 된다. testdb
는 데이터베이스 이름이다.;DB_CLOSE_DELAY=-1
을 추가하여 JVM이 살아있는 동안은 데이터를 유지하도록 할 수 있지만, 메모리 누수가 발생할 수 있다.jdbc:h2:tcp://localhost/mem:testdb
= 믹스드 모드).먼저 로컬에 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 등 다른 데이터베이스 엔진과의 호환을 제공하고 있다.
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 다이얼렉트와 달라 문법 오류가 발생하는 경우에도 이 오류가 나타나므로 다이얼렉트도 체크해보자.