본문 바로가기
TIL(Today I Learned)

[삽질 기록] in-memory DB로 h2 사용하는 방법

by kkkdh 2023. 8. 18.
728x90

오늘은 이동욱 님의 스프링부트와 AWS로 혼자 구현하는 웹 서비스 책을 공부하며 코딩을 하다가 h2 관련해서 모호한 부분이 있어 정리할 겸 글을 씁니다.

 

h2 document의 아래 부분에 따르면, url 설정에 따라 다음과 같은 차이점이 존재한다.

  • jdbc:h2:mem : private한 data connection을 유일하게 생성한다. (이름 별도로 없음)
  • jdbc:h2:mem:xxx : 여러 개의 connection을 같은 in-memory db에 대해서 생성하고 싶은 경우 다음과 같이 사용한다.

참고로 이 방식은 in-memory 방식으로 h2 db를 사용하는 방식이다.

 

Features

  Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore

www.h2database.com

 

따라서 다음과 같이 application.yml 파일에 datasource 정보를 입력하면, in-memory db를 사용한다고 명시하는 것이 된다.

test3라는 database에 multiple connection 생성하도록 설정한 것

 

또한 기본적으로 spring boot project의 경우 application.yml 파일을 생성만 해도 기본적으로 h2 in-memory database를 사용하도록 설정되어 있어, 별도로 명시하지 않은 경우에도 h2 database를 사용하는 결과를 확인할 수 있다.

 


h2의 세 가지 모드

Embeded mode (In-memory mode) vs Server mode

  • embedded mode (in-memory)
    • 별도로 h2를 다운받고, 설치하는 과정이 필요 없다.
    • 의존성 추가만으로 실행 가능
    • spring이 build 되고, 실행되는 시점에 의존성으로 받아온 h2의. jar로 h2를 자체적으로 띄워 접속 가능함
    • embedded, in-memory 둘은 유사한 방식이지만, embedded의 경우 로컬 파일에 데이터를 직접 저장하고 사용하는 반면, in-memory 모드의 경우 그렇지 않다는 차이점이 존재한다.
  • server mode
    • h2 다운로드한 후, 별도의 port를 통해 실행해야 한다.

 

기본적으로 h2를 두 가지 모드로 사용할 수 있다고 한다.

 

위에서 본 예시들은 embedded mode로 사용하고 있는 것으로 in-memory db의 형태로 h2 db를 사용하는 것을 의미한다.

 

임베디드 모드로 구동하게 되면, 당연히 db에 저장된 데이터들은 영속적이지 않고, 프로그램 종료 시에 휘발되는 단점이 존재한다. 하지만, server mode에 비해서 성능이 빠르다는 장점이 존재한다.

 

그렇다고 하더라도 embedded mode의 경우 application의 thread와 자원을 사용해 데이터에 접근하는 방식이기 때문에, application의 상태에 영향을 받는다는 것이 단점이 될 수 있다.

 

server mode 사용의 장단점은 다음과 같다고 한다. (다른 글 참조)

  • 제한이 없는 Application과 DB의 커넥션 (TCP/IP를 사용함으로써 흐름 제어가 가능한 듯하다.)
  • PageStore 엔진의 동기화를 이용하여 멀리 스레딩을 지원함으로 데이터 정합성을 지킬 수 있다.
  • TCP/IP를 이용하여 데이터의 흐름을 가지기 때문에, 커넥션을 맺고 데이터를 전송하는 등의 성능 오버헤드가 존재
  • 외부 서버에서 제공하고 연동 설정을 지정하지 않는다면, 환경에 따라서 해당 모드를 사용하는 프로젝트에 대해 별도의 H2 설정과 데이터베이스에 대한 데이터 (DDL, DML 등)가 요구된다.

 


여태까지 h2 db를 설정할 때 이렇게 했었던 이유

세 가지 모드를 알고 나니 그동안 강의를 듣거나, h2를 사용할 때 db 파일을 생성하는 과정을 왜 그렇게 진행하는지 알게 되었다.

 

예를 들어 test라는 db를 생성하여 프로젝트에서 사용한다면, 우선 다음과 같이 h2 web console에서 url을 입력해 db 파일을 만들었던 것이 기억할 것이다.

test라는 db 생성

그다음 연결을 한 뒤에 다시 연결을 해제하고, 다음과 같이 접속을 하는 과정을 진행했는데

jdbc url 변경 후에 재접속

이러한 이유는 우선 embedded mode로 접속해 db 파일을 생성한 뒤에 server mode로 TCP 통신을 통해 DB에 접속하는 방식으로 설정하기 위함이었던 것이었다..!!

 

이렇게 또 하나를 배웠다..

 


그래서 삽질한 내역

그래서 무엇으로 삽질을 했느냐하면..

 

spring boot 프로젝트에서 application.yml 파일에 datasource 설정을 추가하는데, 아무리 해도 테스트 코드를 실행할 때에는 잘 동작하는 것 같은데, application 실행 만 하면, 제대로 동작하지 않아서 이거저거 계속 시도해보면서 하루를 썼습니다..

 

문제의 원인은 황당하게도

test에만 appliation.yml 파일을 생성했었다..

멍청하게 test 폴더에만 appliation.yml 파일을 생성해 db 설정을 이거저거 바꿔가며 실행하고 있었습니다..

 

 

그걸 마지막에 알아서 java 폴더에 application.yml 파일을 복붙하니까 바로 정상 작동을 하네요..

spring:
  jpa:
    hibernate:
      ddl-auto: create #create, create-drop, update ...
    properties:
      hibernate:
        show_sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  h2:
    console:
      enabled: true
      path: /h2
      settings:
        trace: false
        web-allow-other: true # 브라우저에서 접근 가능하도록 설정

  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test3
    username: sa
    password:

logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          descriptor:
            sql: trace

아는 설정이랑 설정은 다 해보면서 했는데 너무 바보같은 실수를 했네요

 

그래도 다음에는 이런 실수는 절대 안하지 않을까 생각하며, 오늘은 여기서 글을 마치겠습니다!!

 

 


참조

https://lob-dev.tistory.com/13

 

H2의 Local(In-Memory) 와 Server(TCP) 모드

H2의 Local, Server 개념 Embedded 모드 H2 DB를 시스템의 메인 메모리에서 (JVM 위에서) 구동시키는 방식으로 application이 종료된다면 저장, 수정된 Data가 손실(휘발) 된다. 즉 기본적으로는 영속적이지 않

lob-dev.tistory.com

https://kukim.tistory.com/105

 

Spring boot에서 H2 DB 3가지 모드 사용하기(embedded, In-Memory, Server)

잘못된 내용이 있습니다. 참고용으로만 사용해주시기 바랍니다. 글을 내리려다 꾸준히 오시는 분들이 계셔서 그대로 유지하고 있습니다. 감사합니다. 환경 : Java 11 + Spring Boot 2.6.2 + Gradle 데이터

kukim.tistory.com

https://www.h2database.com/html/features.html

 

Features

  Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore

www.h2database.com

 

728x90

댓글