헤르메스 LIFE

[Spring Boot] Application.yml 설정 - SQL Script를 활용한 DB 초기화 본문

Spring Boot Framework

[Spring Boot] Application.yml 설정 - SQL Script를 활용한 DB 초기화

헤르메스의날개 2023. 3. 5. 12:11
728x90

요즘 JPA를 공부하고 있습니다. MyBatis 만 하다가, 개인적으로 공부를 진행하고 있습니다. 하다보니 막히고, 이해가 안되는 부분이 많네요. 그때마다 검색과 삽질로 해결하고 있습니다. 여기 그 삽질의 자취를 남겨봅니다.


개발환경

Spring Boot 2.7.9

H2 2.1.214

p6spy 1.8.1

slf4j 1.7.36

swagger2 2.6.1

lombok

devtools

postgresql


Spring Boot + JPA 기반 개발환경에서 @Entity를 사용하면 Embedded Tomcat 기동 시 자동으로 연결된 Database의 테이블을 생성하거나, 수정할 수 있습니다.

단점은 테이블의 컬럼 순서가 원하는 순서로 생성되지 않습니다. ( PK, 알파벳 순입니다. ) 테이블 사용에는 아무런 문제는 없습니다만, 생성된 테이블이 예쁘게(?) 보이지 않습니다. 운영환경에서는 당연히 사용을 금합니다.

그 단점을 보완하기 위해 찾아낸 방법이 Script를 실행해서 테이블을 관리하는 방법입니다. 이 방법도 Embedded Tomcat 기동 시 자동으로 연결된 Database의 테이블을 생성하거나, 수정할 수 있습니다. 테이블도 Script에 설정된 순서데로 테이블이 생성됩니다.

application.yml 샘플

# Server port
server:
  port: 9090
  servlet:
    context-path: /
    encoding:
      enabled: true
      charset: UTF-8
      force: true
    session:
      timeout: 18000                              # 30분, Default 기본단위 : 초
      
  tomcat:
    uri-encoding: UTF-8                         # Spring Default : UTF-8
##############################################################
# Spring Message 처리
  messages:
    basename: messages/messages, messages/exception		# 각각 ResourceBundle 규칙을 따르는 쉼표로 구분된 기본 이름 목록
    always-use-message-format: false	# 인수가 없는 메시지도 구문 분석하여 항상 MessageFormat 규칙을 적용할지 여부
    encoding: UTF-8
    fallback-to-system-locale: true		# locale에 해당하는 file이 없을 경우 system locale을 사용 ( default : true )
    use-code-as-default-message: true	# 해당 코드를 찾을 수 없을 경우 Code 를 출력한다. ( default : false )
    cache-duration: 3                 # default는 forever
    #cache-seconds: -1					      # 로드된 자원 번들 파일 캐시 만료(초). -1로 설정하면 번들은 영원히 캐시됩니다.
    
##############################################################
# Swagger pathmatch
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

##############################################################
# Spring Message 처리
spring:
  config.activate.on-profile: local
  jpa:
    open-in-view: false
    database-platform: org.hibernate.dialect.H2Dialect
    #database-platform: org.hibernate.dialect.PostgreSQLDialect
    #show-sql: true       # System.out 으로 출력. logging.level.org.hibernate.SQL=debug 로 대체합니다. 
    hibernate:
      # create : entity를 drop cascade 하고 다시 생성
      # update : entity가 수정되면 수정된 내용만 반영
      # create-drop,validate, none
      # 하이버네이트가 자동으로 생성해주는 DDL은 신뢰성이 떨어지기 때문에 
      # 절대로! 운영DB 환경에서 그대로 사용하면 안되고, 직접 DDL을 작성하는 것을 권장
      ddl-auto: none
    #generate-ddl: true
    properties:           # Additional native properties to set on the JPA provider.
      hibernate:
        #show-sql: true                  #System.out 으로 출력
        format_sql: true                # 로그, 콘솔의 SQL을 좀 더 이쁘게 출력합니다.
        highlight_sql: true             # SQL 출력을 ANSI escape codes를 사용하여 색을 부여합니다.
        use_sql_comments: true          # 보다 쉬운 디버깅을 위해 SQL 내부에 /* */의 주석을 추가합니다.
  h2:                                   # H2-2.1.214
    console:
      enabled: true
      path: /h2-console
##############################################################
# Spring Datasource 처리
spring:
  datasource:
 #url: jdbc:h2:tcp://localhost/~/test;MVCC=TRUE # H2 1.4.200 버전부터 MVCC 옵션이 제거되었습니다.
    url: jdbc:h2:tcp://localhost/~/test;DB_CLOSE_ON_EXIT=FALSE
 #url: jdbc:p6spy:h2:tcp://localhost/~/test;DB_CLOSE_ON_EXIT=FALSE # P6Spy
    driver-class-name: org.h2.Driver # H2 Database
 #driver-class-name: com.p6spy.engine.spy.P6SpyDriver # P6Spy
    username: sa
    password:
##############################################################
# - 경로 : /src/main/resources 경로 하위
# - schema.sql : 테이블 생성 스크립트
# - data.sql : 데이터 입력 스크립트
# - 파일이름규칙 : schema-${platform}.sql , data-${platform}.sql
#   ex. schema-h2.sql , shcema-postgres.sql
#spring.datasource.initialization-mode=always # Spring Boot <v2.5.x
# DB초기화(schema.sql, data.sql) , [always : 기동 시 매번 동작, never : 기동 시 동작하지 않음]
    #schema: classpath*:initdata/${platform}/schema.sql
    #data: classpath*:initdata/${platform}/data.sql
    #schema: classpath*:initdata/h2db/schema.sql
    #data: classpath*:initdata/h2db/data.sql
    #initialization-mode: always
  sql:
    init:
      schema-locations: classpath*:initdata/schema-postgresql.sql
      data-locations: classpath*:initdata/data-postgresql.sql
      mode: always          # Spring Boot >=v2.5.0

# Logging
logging:
  level:  # 각 package 별로 로깅 레벨을 지정할 수 있다.
    root : info
    octopus: debug
    org.springframework: WARN
    #org.hibernate.SQL: debug                    # logger를 통해 하이버네이트 실행 SQL
    #org.hibernate.type.descriptor.sql: trace    # sql의 ? 값을 Parameter로 보여줌.
  pattern:
    console: "%-5level %d{yy-MM-dd HH:mm:SSS}[%thread] %logger.%method[%line]: - %msg%n"
    file: "%-5level %d{yy-MM-dd HH:mm:SSS}[%thread] %logger.%method[%line]: - %msg%n"
  file:
    name: /Octopus/logs/app_log.log  # 로깅 파일 위치이다.
  logback:
    rollingpolicy:
      max-file-size: 10MB               #default 10M 로그 파일 하나당 최대 파일 사이즈이다.
      max-history: 31                   #default 7 로그 파일 삭제 주기이다. 7일 이후 로그는 삭제한다.
      file-name-pattern: app_log.%d{yyyy-MM-dd}.%i.gz
      
decorator.datasource.p6spy.enable-logging: true     # false : Disable p6spy
#decorator.datasource.enable: true

변경해야 할 설정

# 하이버네이트가 자동으로 생성해주는 DDL은 신뢰성이 떨어지기 때문에 
# 절대로! 운영DB 환경에서 그대로 사용하면 안되고, 직접 DDL을 작성하는 것을 권장
spring.jpa.hibernate.ddl-auto=none
spring.datasource.schema=classpath*:initdata/schema-postgresql.sql          # Spring Boot <=v2.5.x
spring.datasource.data=classpath*:initdata/data-postgresql.sql          # Spring Boot <=v2.5.x
spring.sql.init.schema-locations=classpath*:initdata/schema-postgresql.sql  # Spring Boot >=v2.5.0
spring.sql.init.data-locations=classpath*:initdata/data-postgresql.sql  # Spring Boot >=v2.5.0

spring.sql.init.mode=always                  # Spring Boot >=v2.5.0
spring.datasource.initialization-mode=always # Spring Boot <v2.5.0

참고 : https://hermeslog.tistory.com/682

 

[Spring Boot] Hibernate – SQL Dialects

application.yml # Spring spring: config.activate.on-profile: local jpa: open-in-view: false database-platform: org.hibernate.dialect.H2Dialect #database-platform: org.hibernate.dialect.PostgreSQLDialect properties: hibernate: show-sql: true format_sql: tru

hermeslog.tistory.com


- 경로 : /src/main/resources 경로 하위

- schema.sql : 테이블 생성 스크립트

- data.sql : 데이터 입력 스크립트

- 파일이름규칙 : schema-${platform}.sql , data-${platform}.sql

- platform : 데이터 베이스 명  ( ex. hsqldb, h2, oracle, mysql, protgresql )

   ex. schema-h2.sql , shcema-postgres.sql


Property 'spring.datasource.schema' is Deprecated: Use 'spring.sql.init.schema-locations' instead.

spring.datasource.schema : <= spring boot 2.1.5

spring.sql.init.schema-locations : >= spring boot 2.2.x

Property 'spring.datasource.data' is Deprecated: Use 'spring.sql.init.data-locations' instead.

spring.datasource.data : <= spring boot 2.1.5

spring.sql.init.data-locations : >=spring boot 2.2.x


https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-initialization.using-basic-sql-scripts

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 

728x90