일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Tomcat
- maven
- Thymeleaf
- jpa
- Source
- Python
- git
- Core Java
- myBatis
- MSSQL
- JavaScript
- error
- ubuntu
- Exception
- STS
- MySQL
- Open Source
- JDBC
- SpringBoot
- 문서
- 설정
- Docker
- oracle
- PostgreSQL
- spring
- Eclipse
- Spring Boot
- 오픈소스
- IntelliJ
- AJAX
- Today
- Total
헤르메스 LIFE
[Spring Boot] Application.yml 설정 - SQL Script를 활용한 DB 초기화 본문
[Spring Boot] Application.yml 설정 - SQL Script를 활용한 DB 초기화
헤르메스의날개 2023. 3. 5. 12:11요즘 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
- 경로 : /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
'Spring Boot Framework' 카테고리의 다른 글
JPA @CreatedDate Column Update시 Null 되는 현상 해결방법 (0) | 2023.03.12 |
---|---|
AuditingEntityListener.class (0) | 2023.03.12 |
[Spring Boot] Spring Data JPA에서 GroupBy 처리하기 (0) | 2023.02.26 |
[Spring Boot] Common Application properties (0) | 2023.02.26 |
[Spring Boot] Application.yml 설정 - Hibernate – SQL Dialects (0) | 2023.02.26 |