[Springboot][IntelliJ] Database-H2 설정

김영후·2023년 1월 21일
0

Spring

목록 보기
3/4

요즘은 얼마전 시작했던 마감할인 플랫폼 앱 개발을 진행하고 있다. spring boot가 처음이라 구조파악하는 데 애를 먹었는데, django랑 비슷한 구석이 꽤 있어서 지금은 이해가 잘 되는 것 같다. 테스트용 DB로 H2를 사용하기로 했는데, 아무래도 새로 접하는 것이다 보니 이것도 알아봐야하는 점이 있었다.
우선 내가 아무것도 몰랐던 상태로 project를 build했더니, build가 되지 않았다.

이런 오류가 발생해서 오류의 맨 첫 지점으로 가봤더니 아래 사진같은 출력을 볼 수 있었다.

이게 뭘까? 하고 에러 로그를 기반으로 구글링을 하던 중, H2 DataBase에는 Server Mode, Embedded Mode, In-Memory Mode 총 3가지가 존재한다는 것을 알게 되었다.

  • Server Mode
    Server mode는 H2 공식 홈페이지에서 H2를 다운로드 후 windows는 h2.bat, mac os는 h2.sh 파일을 실행시켜 H2서버를 실행 후 접근할 수 있는 mode이다. 또는 직접 h2.jar를 java-jar로 실행시켜야한다. 직접 실행한 서버에 tcp통신을 통해 접근하는 방식이라고 보면 된다.
    이 mode는 H2 서버를 다운로드해야하고 이 서버를 구동시켜 접근하는 방식이라고 보면 된다.
  • Embedded Mode, In-Memory Mode
    Server mode와는 다르게 이 두 모드는 H2 다운로드가 필요없다. build.graddle에 의존성 주입을 통해 spring boot가 build 및 실행될 때 H2의 .jar을 자체적으로 띄워 사용하는 것이라고 생각하면 된다.
    따로 H2 DB서버를 띄우지 않아도 사용할 수 있는 것이다. 둘은 이러한 공통점이 있지만, 이름이 다른 걸 보면 알 수 있듯이 차이점도 존재한다.
    먼저 Embedded mode는 H2 DB 데이터를 로컬에 직접 저장 및 사용을 한다. In-Memory mode는 DB 데이터를 로컬에 저장하지 않고 메모리에만 가지고 있다. 즉, In-Memory모드는 휘발성 메모리로써 spring boot 서버를 종료하면 삭제된다는 특징이 있다.

내가 처음 project build했을 때 되어있던 application.yml 파일의 datasource section 설정은 밑의 사진과 같다.

url을 보면 tcp 통신을 하겠다는 것을 명시해뒀다. 이는 server mode를 이용한다는 뜻이다. 나의 경우, H2 서버를 켜두지 않은 채로 build를 했으므로 build 시에 아래와 같은 에러를 발생시키며 build가 되지 않았다.

이를 server mode에서 embedded mode로 변경하려면 아래와 같이 application.yml 파일의 url을 수정해주어야 한다. 여기서 application.yml 파일만 건드릴 것이 아니라, build.gradle의 dependencies 파트에 h2와 관련된 의존성 주입 코드를 작성해주어야 한다. 그 부분은 글의 말미에 적도록 하겠다.

Embedded-mode를 통해 build를 하면 windows 기준 사용자 root directory에 아래 사진과 같이 test.mv.db라는 파일이 생성된다.

In-memory mode로 변경하고 싶다면 application.yml 파일의 url을 아래 사진과 같이 변경해주면 된다.

spring boot 서버 build 후, 웹을 통해 DB console에 접근이 가능하다. 이 부분은 application.yml에서 h2 설정 중 console 파트를 설정을 해주어 console enable을 true로, path를 설정해주면 설정한 path로 접근이 가능하다. 나의 경우 아래 사진과 같이 설정을 해주었다.

이제 spring boot build 후 웹을 통해 db에 접근하고자 하면,localhost:8080/{본인이 설정한 h2 console의 path(나의 경우 h2-console)}을 입력해주면 아래와 같은 화면이 나온다.


Saved Settings는 Generic H2(Embedded)를 선택, JDBC URL에 application.yml의 datasource의 url에 적어주었던 url을 입력해주면 된다. 그 후, connect 버튼을 통해 연결해주면 DB console에 접근이 가능해진다. 최종적으로 연결까지 필요한 application.yml 파일의 내용을 아래에 첨부한다.

앞에서 말했듯 application.yml 파일만 작성해줄 것이 아니라, build.gradle 내에 의존성 주입 관련 코드를 작성해주어야 한다.

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

여기서 'com.h2database:h2' 코드 관련 옵션은 runtimeOnly와 implementation이 존재한다. implementation은 컴파일 시간에 종속된 모듈을 노출시키지 않기 때문에 데이터 베이스를 초기화할. sql 파일을 자동으로 읽을 수 없어 실행할. sql 파일을 application.properties에 직접 추가해줘야 한다. runtimeOnly는 런타임 중에 종속성을 추가한다. 따라서 application.properties에 초기화 파일 경로를 입력하지 않아도 된다(출처: https://kukim.tistory.com/105).

이와 같은 방법을 이용해 코드 테스트 시 사용할 DB를 물리적 디스크를 이용하지 않고도 사용할 수 있으니, 앞으로 잘 이용해보도록 할 생각이다.

profile
PNU CSE 16th / Busan, South Korea

0개의 댓글