SpringBoot에 H2 DB 연결하기
저번에 설치했었던 H2 DB!! 만들었으면 사용을 해야한다.
H2를 스프링부트에 연결해서 사용해보도록 하겠다. 참고로 이 글에서는 연결 방법만 나오지 JPA나 Mybatis와 같은 DB 데이터 사용 방법까지는 적지 않겠다.
dependency 설정
DB를 연결하기 위해서는 DB 드라이브 라이브러리를 프로젝트에 설정해줘야한다. H2 DB 라이브러리는 아래 코드로 build.gradle 또는 pom.xml에 간단하게 설정할 수 있다.
- gradle
Implementation 'com.h2database:h2'
- maven
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
application.properties 설정
스프링부트에서 DB 연결을 할 때는 application.properties에 설정을 한다. H2 DB 또한 다른 DB들과 마찬가지로 application.properties에 H2 DB의 설정 정보를 입력해야 JPA나 Mybatis에서 사용할 수 있다.
H2 DB는 application.properties에 아래와 같이 설정을 한다. 아래 부분에서 집중해야할 점은 'spring.datasource.url'이다.
나머지 'spring.datasource.driver-class-name'은 동일하게 작성하면 되고 'spring.datasource.username', 'spring.datasource.password'는 아래와 같이 H2 DB의 사용자 이름과 패스워드를 입력하면 된다.
만일 패스워드가 설정되어 있지 않으면 패스워드 부분은 빈 값으로 두면 된다.
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/../test
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url
중요한 부분은 'spring.datasource.url'이다. 이 부분을 어떻게 설정하느냐에 따라서 H2를 연결하는 방식이 달라진다.
1. 인메모리 방식
spring.datasource.url=jdbc:h2:../test
위와 같이 입력할 경우는 인메모리 방식이다. 지난번에 H2 DB를 연결하는 설명 글에서 Embedded로 연결했을 때의 URL 형식이 바로 인메모리 방식이다.
이와 같이 입력할 경우 H2 DB는 스프링부트 어플리케이션이 실행됐을 때 메모리 내에서 동작하고 스프링부트 어플리케이션이 종료되면 그대로 데이터가 사라진다.
따라서, 간단한 스프링부트 어플리케이션에 작성해놓은 간단한 CRUD 기능을 테스트하기에 좋은 방식이다. 대신, 어플리케이션이 종료되면 그대로 데이터가 사라지므로 어플리케이션을 종료하고나서는 기능을 테스트했던 것에 대한 데이터를 확인할 수 없다.
또한 이 인메모리 방식은 기존에 내가 똑같은 url을 입력해 Embedded 방식으로 H2 DB를 연결하고 데이터를 입력해놓았을지라도 스프링부트 어플리케이션에서 해당 데이터를 사용할 수는 없다.
즉 DB url을 똑같이 사용해도별도로 다른 DB로 취급을 한다.
참고로 이 방식은 어플리케이션의 라이브러리를 통해 구동되는 방식이므로 H2 DB가 설치되어 있지 않아도 사용 가능한 방법이다.
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
따라서 기존 사용하던 콘솔에서 DB를 열어도 데이터가 안 보여지는데 위와 같이 'spring.h2.console' 설정을 하면 인메모리로 돌아가는 H2 DB에 접속해서 스프링부트 어플리케이션이 돌아가는 동안의 DB의 데이터를 확인할 수 있다.
'spring.h2.console.path'가 바로 H2 DB 연결하는 콘솔 주소로 위와 같이 설정해놓았을 경우 'localhost:${스프링부트 포트}/h2-console'로 인메모리 DB에 접속할 수 있다.
단, 인메모리 방식을 사용할 경우 entity와 필요한 sequence가 DB에 생성되어 있지 않은 상태로 DB를 사용하면 에러가 발생한다.
그래서 인메모리 방식을 사용할 때는 application.properties에 아래 설정을 넣어 사용할 entity와 sequence를 자동 생성하도록 해야한다.
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
2. TCP 서버 방식
인메모리와 다르게 스프링부트 어플리케이션이 종료되어도 데이터가 사라지지 않는 방식이다.
spring.datasource.url=jdbc:h2:../test
바로 로컬에 설치되어 있는 H2 DB를 서버 방식으로 연결해서 사용하는 것이다. 로컬에 있는 H2 DB 데이터를 사용하는 것이므로 당연히 스프링부트 어플리케이션이 종료되어도 데이터가 사라지지 않는다.
TCP 서버 방식으로 설정해서 사용할 경우 인메모리 방식에서 했던 'spring.h2.console' 설정과 'spring.jpa.hibernate.ddl-auto=create-drop' 설정을 하지 않아도 된다.
그냥 로컬에 설치되어 있는 H2 DB의 콘솔을 사용하면 스프링부트 어플리케이션의 CRUD 기능으로 인해 변경된 데이터를 확인할 수 있다.
참고로 H2 DB를 설치하면 설정되어 있는 기본 로컬 주소는 아래와 같다.
- http://192.168.0.103:${설정된 포트}
3. 파일 방식
마지막으로 설정할 수 있는 방식은 파일 방식이다.
jdbc:h2:file:D:\H2\test
기존 서버 방식과 비슷하게 스프링부트 어플리케이션이 종료되도 데이터가 남아 있다. 다른 곳에서 H2 DB 파일을 받아서 사용할 수도 있는 방식이다.
'file:${해당 파일 경로}' 식으로 사용하는 것으로 H2 DB 데이터 파일이 있는 곳의 경로와 파일 명을 넣으면 된다.
파일모드는 로컬에서 H2 DB 콘솔을 실행시키고 있지 않을 때 사용할 수 있다. 이미 H2 DB를 사용해 콘솔 접속이 가능하면 아래와 같이 에러 메시지가 나타난다. 이럴 때는 TCP 서버 모드로 H2 DB를 연결해 사용해야 한다.
- org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-200]
위 세 가지 방식 중에서 상황에 맞게 H2 DB를 연결해 스프링부트에서 사용하면 된다.
✋ H2 Database Engin 정보
https://mvnrepository.com/artifact/com.h2database/h2