# mysql8.0.23
# java11
---
spring:
config:
activate:
on-profile: local
datasource:
driver-class-name: org.mariadb.jdbc.Driver
username: username
password: password
url: jdbc:mysql://localhost:3306/commerce?allowPublicKeyRetrieval=true&useSSL=false
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: none
use-new-id-generator-mappings: false
properties:
hibernate:
globally_quoted_identifiers: true
---
spring:
config:
activate:
on-profile: develop
activate.on-profile
: 설정 구성파일의 환경을 설정할 수 있음. 환경별로 파일을 따로 구성(application-local.yaml / application-develop.yaml
) 해서 아예 구분을 지어놓을 수도 있고, 하나의 설정파일(application.yaml
) 안에 아래와 같이 구분해서 작성할 수도 있음.
---
을 구분자로 두고 각 설정 영역이 나뉘고, active.on-profile
로 환경명을 구분할 수 있음. 최상단 ---
위 영역은 default
영역이 아니고, 마지막 영역에서 설정한 값에 덮어씌워짐.
(이 부분은 환경별 설정 들어갈 때 테스트 해봐야겠음)
[default 영역이 아님]
---
[설정파일 1 영역]
spring:
config:
activate:
on-profile: local
datasource:
username: username-local
password: password-local
---
[설정파일 2 영역]
spring:
config:
activate:
on-profile: develop
datasource:
username: username-develop
password: password-develop
honeymon.io - [spring-boot] 2.4 부터 변경된 구성파일 처리방식 살펴보기
datasource는 데이터베이스 연결을 위한 factory.
url
: 데이터베이스 url
username
: 데이터베이스 사용자 아이디
password
: 데이터베이스 사용자 비밀번호
driver-class-name
: jdbc driver 클래스 명
-> 대부분 Spring Boot가 connection url을 통해 추론하므로 사용하지 따로 명시를 안하긴 하지만 여기서는 mysql driver
가 아니라 mariadb driver
를 쓰므로 명시함
HowToDoInJava - Spring Boot DataSource Configuration
database-platform
: hibernate 에서 사용할 dialect를 설정함.
-> hibernate
는 데이터베이스 소프트웨어들과는 독립적으로 persistence 로직을 개발할 수 있게 만들어진 java ORM 프레임워크임.
-> dialect(방언)는 Java JDBC 타입과 SQL 타입 간에 가교 역할을 하는데, hibernate 가 각 데이터베이스에 최적화된 SQL을 만들 수 있게 해줌.
-> 여기서는 mysql8을 쓰므로 거기에 맞는 dialect를 명시함.
-> 그런데 찾아보니 MySQL8Dialect가 deprecated 되었다고 함. hibernate 6.x 버전대로 올라가면서 사라짐
-> 만약 hibernate 6.x를 쓴다면 database-platform: org.hibernate.dialect.MySQLDialect
를 사용하면 됨.(MySQL 5.x 이상에 대해서 사용가능하다고 함)
추가 참고문서
Hibernate- SQL Dialects
hibernate.ddl-auto
: DDL 초기화 기능을 설정하는 값으로 none(실행x)
, validate
, update
, create(삭제-생성)
, create-drop(삭제-생성-삭제)
의 값을 줄 수 있음. connection
type이 hsqldb
, h2
, derby
이면 default 값이 create-drop
으로 설정되고, 나머지는 none
으로 설정됨. 이외에도 import.sql
등을 통해 초기화 스크립트를 자동 실행되게 할 수도 있음(Spring docs - Database initialization) / 상세 설정 값들을 정리해놓은 블로그
hibernate.use-new-id-generator-mappings
: @Entity
에서 @ID @GeneratedValue
로 id 생성 전략을 매핑하는데 관여. @GeneratedValue
가 Auto 일때 어떤 값이 들어가는지를 결정하는데, SpringBoot 2.x 이후부터는 이 값이 true(default)
일 때 생성 전략이 TABLE
전략으로 매핑됨. 그러므로 IDENTITY
전략으로 매핑하고 싶다면 이 값을 false
로 두거나, 애초에 어노테이션을 달 때 전략을 지정해줘야함(@GeneratedValue(strategy = GenerationType.IDENTITY)
. 매번 전략을 지정해준다면 use-new-id-generator-mappings
설정을 따로 안해도 될거 같긴한데, 혹시 모르니 설정도 해두고 매핑할 때도 전략을 지정해주면 좋을듯.
properties.hibernate.globally_quoted_identifiers
: true
로 설정할 경우 모든 데이터베이스의 identifiers 에 틸드(`)를 씌워줌. 이걸 왜 쓰냐면 엔티티 클래스에 선언된 필드 등이 데이터베이스의 예약어(ex) group 등)와 중복될 때 syntax error
를 낼 수 있는데 이때 틸드를 씌워주면 에러가 발생하지 않음.
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
pathmatch.matching-strategy
: mvc path 경로 매칭 전략을 설정해줌. default 는 PATH_PATTERN_PARSER
로 ANT_PATH_MATCHER
로 사용하고 싶다면 설정을 해줘야함. Spring 에서는 PathPattern 을 좀 더 효율적인 경로 매칭이라고 설명함.
[Spring - URL Matching with PathPattern in Spring MVC]
두 매칭 전략은 대부분 호환되나 일부에 차이가 있다고 함.
PathPattern is compatible with AntPathMatcher syntax except for the following:
1. Support for additional syntax to match and capture 0 or more path segments at the end, e.g. "/foo/{*spring}". This is useful as a catch-all pattern in REST APIs with access to the captured path segments through a @PathVariable.
2. Support for "**" for multi-segment matching is only allowed at the end of a pattern. This helps to eliminate most causes of ambiguity when choosing the closest match for a given request.
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "hello";
}
Spring docs - AntPathMatcher
Spring docs - PathPattern
MySQL 8.x부터 caching_sha2_password
라는 authentication plugin 을 추가하고 디폴트 설정으로 두면서 RSA public key 암호화 방식으로 사용자 비밀번호 전송에 보안을 더했음. 그래서 secure connection이 아닌 이상 plain text로 보낼 수 없도록 하는게 default로 되어있음. ssl 모드를 사용하는 등의 방법으로 에러를 해결할 수 있으나 로컬 테스트용으로 작업 중이므로 보안상 권장되지는 않는 AllowPublicKeyRetrieval=true
방식으로 해결함(잠재적으로 안전하지 않은 연결을 허용하는 옵션)
MySqlConnector - Retrieval of the RSA public key is not enabled for insecure connections
MariaDB Connector/J 2.x 에서 AWS Aurora DB에 대한 장애조치 대응을 지원함. 쓰기 데이터베이스에 문제가 생겼을 경우 읽기 데이터베이스를 승격 시켜서 장애를 해결하는 등의 조치를 지원한다고 함. 3.x 에서는 Aurora 가 파이프라이닝과 호환되지 않는 등의 문제가 해결되지 않고 있어 관련 기능을 구현하지 않았다고 함.
driver 3.0 is a complete rewrite of the connector. Specific support for aurora has not been implemented in 3.0, since it relies on pipelining. Aurora is not compatible with pipelining. Issues for Aurora were piling up without the community proposing any PR for them and without access for us to test those modifications. (2.x version has a 5 years support).
About MariaDB Connector/J
AWS 에서도 AWS-MySql-jdbc 를 사용할 수 있도록 해놨고 Aurora에 대한 장애대응도 해놨으나 22년 3월에야 1.0.0 버전으로 올라와 더 안정화를 거쳐야하지 않을까 싶어 일단 배제함.
Aurora 장애대응 지원 외에 기본 기능 성능간의 차이는 비교할 수 있는 방법을 찾지 못해 비교하지 못했음. 혹시 아시면 알려주시면 좋겠음.
Failover and High availability with MariaDB Connector/J for 2.x driver
[입 개발] MariaDB Connector 와 AWS Aurora
SpringBoot2.x 는 디폴트로 HikariCP를 Connection Pool로 잡음(1.x까지는 Tomcat 이었음). HikariCP가 없다면 Tomcat을 잡고, Tomcat도 없다면 DBCP2를 찾아서 잡음.(HikariCP github 만 보면 다른 CP보다 월등히 높은 성능을 보임, 알리바바의 druid와 비교를 해보고 싶으나 아직 방법을 찾지 못했음)
이번 프로젝트에서는 hikariCP에 대한 직접적인 설정이 필요하진 않아서 참고용으로만 내용 남겨놓음
# hikari CP
spring:
datasource:
hikari:
connection-timeout: 50000
idle-timeout: 300000
max-lifetime: 900000
maximum-pool-size: 10
minimum-idle: 10
pool-name: ConnPool
connection-test-query: select 1 from dual
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false
logging.level.com.zaxxer:
hikari: TRACE
HikariConfig: DEBUG
HowToDoInJava - Spring boot JPA + Hibernate + HikariCP Configuration