H2 DB를 활용해 봅시다!

yun yun·2021년 11월 19일
0

JPA와 SpringSecurity를 공부하면서, H2 데이터베이스를 사용해 보았습니다. 처음에는 강사님께서 알려주시는 설정 그대로 사용하다가, JPA공부할 때는 로컬 H2 데이터베이스에서 정보 확인이 가능하였지만, SpringSecurity 공부할 때 가능하지 않았습니다. 띠용!!!

그래서 H2 데이터베이스 URL에 대해 공부해 보았으며, 활용에 좋은 정보만 기록해 보았습니다.


기본 URL 형식

사용할 상황URL예시
임베디드 로컬 연결jdbc:h2:[file:][<path>]jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:C:/data/sample (<- Windows일 경우에만 한정)
인메모리(비공개)jdbc:h2:mem:
인메모리
(데이터베이스 이름 지정)
jdbc:h2:mem:jdbc:h2:mem:test
원격연결
(TCP/IP 사용)
jdbc:h2:tcp://[:]/[]jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://localhost:8084/~/test
jdbc:h2:tcp://localhost/mem:test
원격연결
(TLS 사용)
jdbc:h2:ssl://:[:]/[]jdbc:h2:ssl://localhost:8084/~/test;

키워드

사용할 상황키워드예시
암호화된 파일 사용을 사용할 경우CIPHER
(jdbc:h2:;CIPHER=AES)
jdbc:h2:ssl://localhost/~/test;CIPHER=AES
jdbc:h2:file:~/test;CIPHER=AES
데이터 베이스가 이미 존재하는 경우에만 데이터 베이스를 사용하고 싶을 경우IFEXISTS
(jdbc:h2:;IFEXISTS=TRUE)
jdbc:h2:file:~/test;IFEXISTS=TRUE
log 파일 레벨을 설정하고 싶을 경우TRACE_LEVEL_FILE
(jdbc:h2:;TRACE_LEVEL_FILE=<level 0..3>)
→ 0 : OFF
→ 1 : ERROR
→ 2 : INFO
→ 3 : DEBUG
jdbc:h2:file:~/test;TRACE_LEVEL_FILE=3
연결할 때 바로 SQL 실행하고 싶을 경우INIT=RUNSCRIPT FROM
(jdbc:h2:;INIT=RUNSCRIPT FROM '<sql파일 위치>' )
jdbc:h2:file:~/test;INIT=RUNSCRIPT FROM '~/create.sql'\;RUNSCRIPT FROM '~/dummy.sql'
호환 모드 사용하고 싶을 경우MODE
(jdbc:h2:;MODE=)
jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
연결이 끊겼을 시, 자동 재연결을 원하는 경우AUTO_RECONNECT
(jdbc:h2:;AUTO_RECONNECT=TRUE)

→ 단, 자동 커밋이 활성화 된 경우에만 발생합니다. 만약 자동 커밋이 활성화 되어 있지 않다면, 예외가 발생한다고 합니다.
jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE

springboot로 연동하여 실험해보기

(h2 데이터베이스는 테스트용으로 주로 사용되기 때문에, 간단하게 실험해 보았습니다.)

  • 공통
    • 가정
      1. users,authorities 테이블을 생성합니다.
        (인메모리일 경우) 어플리케이션을 가동하면, sql 을 실행하여 users,authorities테이블 생성
        (인베디드일 경우) 직접 users,authorities 테이블 생성
      2. user 테이블에는 id와 password 정보가 저장되어 있습니다.
      3. authorities 테이블에는 사용자의 권한 정보가 저장되어 있습니다.
    • pom.xml
      <dependency>
          <groupId>com.h2database</groupId>
          <artifactId>h2</artifactId>
          <version>1.4.200</version>
          <scope>runtime</scope>
      </dependency>
  • 임베디드 로컬 연결
    • .yml
      spring:
        datasource:
          driver-class-name: org.h2.Driver
          url: "jdbc:h2:~/test;MODE=MYSQL;DB_CLOSE_DELAY=-1"
          username: test
          password: test
      	...
    • 결과
      • h2 데이터베이스(인베디드)에 로그인 정보가 존재하여, 로그인이 됩니다.
      • 어플리케이션을 가동할 경우, h2 데이터베이스에 접속하지 말 것.

  • 인메모리 (비공개)
    • .yml
      spring:
        datasource:
          driver-class-name: org.h2.Driver
          url: "jdbc:h2:mem:;MODE=MYSQL;DB_CLOSE_DELAY=-1"
          username: test
          password: test
      	...
    • 결과
      • h2 데이터베이스(인메모리)에 로그인 정보가 존재하여, 로그인이 됩니다.
      • console로 접근하면 error 발생
        → 데이터 베이스 접근 불가

  • 인메모리 (데이터베이스 이름 지정)
    • .yml
      spring:
        datasource:
          driver-class-name: org.h2.Driver
          url: "jdbc:h2:mem:test;MODE=MYSQL;DB_CLOSE_DELAY=-1"
          username: test
          password: test
      	...
    • 결과
      • h2 데이터베이스(인메모리)에 로그인 정보가 존재하여, 로그인이 됩니다.
      • local h2 database 에는 저장되지 않을 것을 알 수 있습니다.
        • in memory

        • local

쭙쭙한 내용 또는 느낀점

  • 테스트할 때, h2 인메모리 데이터베이스를 활용하는 것이 가장 편할 것 같다. 왜냐하면 어플리케이션을 가동 중에, 콘솔에 접속하여 데이터베이스의 작업 상태를 확인할 수 있기 때문이다. 단, 본 정보가 영구히 저장되길 원한다면, 인베디드로 하는 것이 좋을 것 같다.

📖 출처

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

profile
같이 일 하고 싶은 개발자가 목표!

0개의 댓글