spring application.yml 작성중

jomminii_before·2022년 6월 14일
0

spring

목록 보기
1/4
# 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

설명

spring.config

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 부터 변경된 구성파일 처리방식 살펴보기

spring.datasource

datasource는 데이터베이스 연결을 위한 factory.

url : 데이터베이스 url
username: 데이터베이스 사용자 아이디
password: 데이터베이스 사용자 비밀번호
driver-class-name: jdbc driver 클래스 명
-> 대부분 Spring Boot가 connection url을 통해 추론하므로 사용하지 따로 명시를 안하긴 하지만 여기서는 mysql driver가 아니라 mariadb driver를 쓰므로 명시함

HowToDoInJava - Spring Boot DataSource Configuration

spring.jpa

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

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

pathmatch.matching-strategy: mvc path 경로 매칭 전략을 설정해줌. default 는 PATH_PATTERN_PARSERANT_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

trouble shooting

[datasource.url] Public key retrieval is not allowed 에러

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 driver 사용 이유

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

Hikari CP

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

profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글