본문 바로가기

Programming/Spring Boot

[Spring Boot][H2 Database 연동 2/2] H2 Console 사용 및 설정

들어가며...

지난번 포스팅에 이어 이번에는 H2 database 및 JPA 설정 방법에 대해 알아보도록 하겠습니다.

 

  • Table of Contents
    • H2 console 사용하기
    • H2 database 설정

이전글 참조 : 2020/03/10 - [Programming/Spring Boot] - [Spring Boot][H2 Database 연동 1/2] Sample Project

 

[Spring Boot][H2 Database 연동 1/2] Sample Project

들어가며... 벡엔드 시스템을 구축하면서 빼놓을 수 없는 것 중에 하나가 Database 연동일 것입니다. 본 글에서는 Database중 관계형 database(RDBMS) 중 간단하게 테스트 또는 Feasibility 프로젝트를 수행할 때..

u2ful.tistory.com

H2 console 사용하기

지난 포스팅에서 H2 관련 설정을 한것이 없고 JPA 연동 시에도 명시적으로 어떤 database를 사용하겠다는 설정이 없었음에도 불구하고 구현한 추가, 조회, 삭제 API가 동작하는 것을 확인하였습니다.

이는 기본적으로 Spring Boot가 아무런 DBMS를 설정하지 않으면 H2를 사용하기 때문입니다. 이를 확인하기 위해 몇가지 설정 후 H2가 제공하는 console을 이용하는 방법에 대해서 알아보도록 하겠습니다.

 

● H2 console enable

Database client처럼 H2는 기본적으로 이를 확인 할 수 있는 browser형태의 console을 제공합니다. 기본적으로는 disabled되어 있으며 이를 enable시키기 위해 프로젝트 내 "src/main/resources" 경로에 "application.yml" 파일에 아래와 같이 설정을 추가합니다. (기본적으로는 application.properties파일이 있을 것이나 본 글에서는 yaml 형태로 바꾸어 사용토록 하겠습니다.)

spring:
  h2:
    console:
      enabled: true
      path: /h2

 

enabled flag에 "true"값을 설정하였고 path는 "/h2"로 설정하였습니다. path를 설정하지 않으면 default값은  "/h2_console"입니다. 또한 path설정이 맨 앞에는 반드시 "/"를 넣어주어야 합니다.

 

● 프로젝트 실행 후 "add" API를 이용하여 임의의 데이터를 추가합니다.

 

● H2 console을 이용하여 데이터 적재 확인

구현한 "list" API를 이용하여 적재결과를 확인할 수도 있겠지만 이번에는 H2 console을 이용하여 확인해 보도록 하겠습니다. browser를 실행시키고 "localhost:8080/h2"로 접속하면 아래와 같이 H2 console화면이 나타나게됩니다. 별도의 설정을 한 것이 없기 때문에 JDBC URL란에 아래와 같이 "jdbc:h2:mem:testdb"를 입력후 연결을 해봅니다.

● 접속화면

왼편에 우리가 생성한 Member table이 있는 것을 확인할 수 있습니다.

 

 

● H2 console을 이용한 데이터 적재 확인

왼편의 MEMBER table을 선택하면 오른편에 자동으로 select 쿼리가 생성되고 이를 실행시키면 현재 MEMBER에 어떤 데이터가 있는 지 확인할 수 있습니다. 위에서 본인이 입력했던 내용이 보여지면 됩니다.

 

H2 database 설정

지금까지는 Spring Boot가 기본적으로 H2 database를 사용한다는 것을 확인해 보았습니다. 추가로 datasource, JPA 설정 값들에 대해 간략하게 알아보도록 하겠습니다.

 

● application.yml 설정

spring:
  # Set the H2 database console
  h2:
    console:
      enabled: true
      path: /h2
      
  # Set datasource
  datasource:
    url: jdbc:h2:file:/Users/ykson/Downloads/h2-test
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  # Set the JPA / Hibernate
  jpa:
    open-in-view: true
    database-platform: org.hibernate.dialect.H2Dialect
    show-sql: true
    properties:
      hibernate.format_sql: true
      hibernate.use_sql_comments: true
    hibernate:
      ddl-auto: update

 

  • datasource
    • datasource.url : 데이터베이스 접속 URL설정. file mode와 해당 경로를 설정하였음.
    • datasource.driver-class-name : 사용할 JDBC Driver. H2를 사용하였기 때문에 해당 Driver명을 설정하였습니다.
    • datasource.username : 데이터베이스 접속 사용자명
    • datasource.password : 데이터베이스 접속 사용자의 패스워스
  •  JPA
    • database-platform : hibernate의 설정방법은 hibernate.dialect인데 Spring Boot에서는 해당 설정 값을 "database-platform"으로 변경한 듯 합니다. H2 database를 사용하기 때문에 H2 database dialect으로 설정하였습니다. (Dialect은 한국말로 번역하면 방언이란 뜻입니다. 모든 데이터베이스가 표준 SQL을 따르면 좋겠으나 MySQL, Oracle, H2 등등 각각의 데이터베이스마다 SQL을 표현하는 방식이 조금씩 다릅니다. 이를 MyBatis와 같이 SQL문을 직접 구현하는 형태로 사용하게 되면 데이터베이스가 변경되었을 때 해당 SQL문들을 모두 바꿔줘야 하는 번거로움이 있습니다. 이와 같은 변경사항을 최소화하기 위해 JPA에서는 dialect을 설정함으로써 내부적으로 해당 데이터베이스에 맞는 SQL문으로 바꿔줍니다. 따라서 반드시 해당 설정을 하는 것이 좋습니다.)
    • show-sql : 어플리케이션 콘솔에 자동 생성된 SQL문을 로그 남길지 여부를 설정합니다.
    • properties.hibernate.format_sql : SQL문 로그의 formatting 여부를 설정합니다. (indent가 있고 없고 여부)  (Spring Boot properties에서 별도로 지원하지 않는 옵션들은 "properties"라는 항목을 만들어 기존 hibernate의 옵션들을 설정할 수 있도록 해놓았습니다. hibernate에는 있으나 spring boot에는 없는 옵션들은 "properties"항목에 별도로 설정할 수 있습니다.)
    • properties.hibernate.use_sql_comments : SQL문에 주석(있을 경우) 출력 여부를 설정합니다.
    • hibernate.ddl-auto : DDL관련 (데이터의 구조와 관련된 명령어 CREATE, ALTER, DROP, RENAME, TRUNCATE 등..) 옵션을 설정합니다. 해당 옵션에 따라 어플리케이션을 재실행할 때 이전에 저장해둔 데이터가 없어지는 현상을 수정할 수 있습니다.

● hibernate.ddl-auto 옵션

  • none : 아무런 명령어도 실행하지 않음 (대부분의 데이터베이스의 기본값) 
  • create : 어플레케이션 실행 시 (SessionFactory 실행 시) 기존의 테이블을 drop하고 새로 생성
  • create-drop : 시작할 때는 create와 동일하고 종료될 때 (SessionFactory 종료) drop을 실행한다. > in-memory 데이터베이스에서는 이것이 기본값이다. 따라서 해당 옵션을 설정하지 않으면 H2 database는 어플리케이션 재시작시 이전의 데이터는 없어지게 된다
  • update : 변경된 Schema만 적용하고 데이터는 그대로 유지한다. > 서비스 운영중에 테이블의 Schema가 종종변경하게 된다. 이럴 경우 기존에는 직접 ALTER TABLE을 이용하여 변경된 Schema를 변경하지만 이 옵션을 정의하여 주면 @Entity에 추가된 값에 대해 자동으로 Schema를 변경하여 준다.
  • validate : Schema validation만 수행

H2 database가 기본적으로는 in-memory형태로 동작하지만 datasource.url에 file형태로 설정하면 작업한 내용을 물리적으로 저장할 수도있습니다. 하지만 hibernate.ddl-auto 옵션을 설정하지 않으면 기본적으로 "create-drop"이 동작하기 때문에 어플리케이션을 재시작할 경우 이전의 내용은 사라지게 됩니다. 따라서, 이전에 작업한 내용을 계속 유지하면서 개발하고 싶을 때는 이를 update로 하시면 됩니다.

마무리...

지금까지 간단하게 H2 database의 console에 접근하는 방법과 datasource를 설정하는 방법에 대해서 알아보았습니다. 간단하게 테스트를 해보아야 하는데 database와 연동해야 하는 경우 oracle이나 mysql등과 같이 설치하고 설정하고 번거로운 작업을 피하고 싶을때 H2 database를 사용하는 것도 좋은 선택지일 듯 싶습니다.

 

 


U2ful은 입니다. @U2ful Corp.