[스프링부트 (11)] SpringBoot YAML 적용하기(properties vs yaml)
이번 포스팅은 [ Spring Boot Properties 대신 YAML적용하기 ] 입니다. : )
1. YAML이란?
▶ YAML (YML Ain't Markup Language)
- 자세한 내용은 위키 참조(위키를 참조하여 간략히 정리 하였다.) : https://ko.wikipedia.org/wiki/YAML
- XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식.
- YAML은 모든 데이터를 리스트, 해쉬, 스칼라 데이터의 조합으로 적절히 표현할 수 있다는 믿음을 가지고 만들어졌다.
문법은 상대적으로 이해하기 쉽고, 가독성이 좋도록 디자인되었으며, 고급 컴퓨터 언어에 적합하다.
또한 들여쓰기 및 XML의 특수기호를 사용하기 때문에, XML과 거의 비슷 핟.
- JSON은 yaml의 일종이다.
▶ 사용방법 및 Properties와 비교시 이점
1. 가독성이 좋다.
계층구조로 표현하여 가독성이 좋다. 또한 불필요한 소스의 중복도 제거 할 수 있다.
들여쓰기, 띄어쓰기로 구분하여 보기 편하다.
ex) properties
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.hikari.username=root
spring.datasource.hikari.password=qlalfqjsgh
spring.datasource.hikari.maximum-pool-size=10
ex) yaml
spring:
datasource:
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
hikari:
username: root
password: qlalfqjsgh
maximum-pool-size: 10
2. 리스트 표현
- 여러 줄에 쓸 때에는 하이픈(-)으로 시작하는 한 줄에 하나의 요소를 표현한다.
- 한 줄에 모아 쓸 때에는 대괄호([])를 이용하며 쉼표로 각 요소를 구분한다.
ex) properties
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
ex) yaml(1) - 여러줄 표현
my:
servers:
- dev.example.com
- another.example.com
ex) yaml(2) - 한줄 표현
my:
servers: [dev.example.com, another.example.com]
3. 주석
- 주석은 #으로 표시하며, 한 줄이 끝날 때까지 유효하다.
ex)
spring:
datasource: #db 접속 정보
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
hikari: #hikari 설정 정보
username: root
password: qlalfqjsgh
maximum-pool-size: 10
4. SpringBoot Profile적용이 용이하다. (with "--- " 구분자)
- 한 파일 내에서 여러 파일을 사용하는 것처럼 분리가 가능하다.
- application.yml 파일 하나로 여러개의 yml을 생성 한것과 같이 처리 가능
1) properties
- application-{profile}.properties 형식으로 다음과 여러개의 파일을 생성하여 사용했다.
ex) application-{profile}.properties
application-local.properties
application-dev.properties
application-prod.properties
※ 참고
if no profiles are explicitly activated, then properties from application-default.properties are loaded.
- 프로파일을 설정하지않으면 application-default.properties 을 기본으로 사용하도록 한다.
2) yaml
ex) profiles를 선언하여 한 yaml파일 내에서 구분 가능
#local, dev, prod 공통 설정
application:
version: 1.0.0
title: bo
spring:
profiles:
active: local #profiles 선언하여 적용할 profile을 선택 한다.
thymeleaf:
view-names: thymeleaf/*
prefix: classpath:templates/
suffix: .html
cache: false
--- #local 환경
spring:
profiles: local
logging:
level:
root: debug
--- #dev 환경
spring:
profiles: dev
logging:
level:
root: info
--- #prod 환경
spring:
profiles: prod
server:
port: 9090
logging:
level:
root: error
5.단점
- @PropertySource 어노테이션으로 프로퍼티 값을 불러 올 수 없다.
- 해당 어노테이션을 사용 하려면 프로퍼티 파일을 사용해야된다.
> yaml을 프로퍼티에 적용하는 방법은 역시 공식 문서를 참고하도록 하자.
6.기타
- .properties나 .yml 파일은 Kebob case를 권장 한다.
The prefix value for the annotation must be in kebab case (lowercase and separated by -, such as acme.my-project.person).
Property | Note |
acme.my-project.person.first-name | Kebab case, which is recommended for use in .properties and .yml files. |
acme.myProject.person.firstName | Standard camel case syntax. (표준 카멜 케이스) |
acme.my_project.person.first_name | Underscore notation, which is an alternative format for use in .properties and .yml files. |
ACME_MYPROJECT_PERSON_FIRSTNAME | Upper case format, which is recommended when using system environment variables. (시스템 환경 변수 사용시) |
출처 및 참고
내가 현재 설정 해둔 application.properties 파일도 yaml 파일로 변경 해보았다.
참고로 작성해두며 이번 포스팅을 끝내려 한다.
spring:
profiles:
active: local
datasource: #DB 접속정보
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
hikari: #Hikari 설정
maximum-pool-size: 10
#connection-test-query: SELECT 1
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
jpa: #JPA 설정
properties:
hibernate:
#방언 설정 https://dololak.tistory.com/465, https://gigas-blog.tistory.com/119
dialect: org.hibernate.dialect.MariaDBDialect
#하이버네이트가 실행하는 모든 SQL문을 콘솔로 출력해 준다.
show_sql: true
#콘솔에 출력되는 JPA 실행 쿼리를 가독성있게 표현한다.
format_sql: true
#디버깅이 용이하도록 SQL문 이외에 추가적인 정보를 출력해 준다.
use_sql_comments: true
mvc: #JSP 설정
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
thymeleaf: #Thymeleaf 설정
#JSP와 같이 사용시 뷰 구분을 위해 컨트롤러가 뷰 이름을 반환시 thymeleaf/ 로 시작하면 타임리프로 처리하도록 view-names 지정
view-names: thymeleaf/*
prefix: classpath:templates/
suffix: .html
#파일 수정시 반영하려면 하면 재시작을 해줘야 한다. 브라우저 새로고침시 수정사항 반영을 취해 cache=false 설정(운영시 true)
cache: false
check-template-location: true
mybatis: #Mybatis 설정
type-aliases-package: com.god.bo.*.vo
mapper-locations: mybatis/**/*.xml
log4jdbc: #log4jdbc 설정
spylogdelegator:
name: net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
dump:
sql:
maxlinelength: 0
devtools: #jsp파일 서버 재시작 없이 바로 적용하기 spring-boot-devtools
livereload:
enabled: true
--- #local 환경
spring:
profiles: local
datasource:
url: jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
hikari:
username: root
password: qlalfqjsgh
logging: # ROOT레벨 전체 로깅 레벨 결정
level:
root: info
com.god.bo.test: info #com.god.bo.test 패키지 logging Level > info
com.god.bo.test.controller: debug #com.god.bo.test.controller 패키지 logging Level > debug
--- #dev 환경
spring:
profiles: dev
datasource: #TODO : dev용으로 변경 필요
url: jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
hikari:
username: root
password: qlalfqjsgh
logging: # ROOT레벨 전체 로깅 레벨 결정
level:
root: info
--- #prod 환경
spring:
profiles: prod
datasource: #TODO : prod용으로 변경 필요
url: jdbc:log4jdbc:mariadb://localhost:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
hikari:
username: root
password: qlalfqjsgh
server:
port: 9090
logging: # ROOT레벨 전체 로깅 레벨 결정
level:
root: error
'Programming > Spring' 카테고리의 다른 글
[스프링부트 (1)] 스프링부트 시작하기 (SpringBoot 프로젝트 설정 방법) (0) | 2022.05.29 |
---|---|
[스프링부트 (12)] SpringBoot 에러 페이지 설정(Custom Error Page) (0) | 2022.05.29 |
[스프링부트 (10)] SpringBoot Test(3) - 단위 테스트(@WebMvcTest, @DataJpaTest, @RestClientTest 등) (0) | 2022.05.29 |
[스프링부트 (9)] SpringBoot Test(2) - @SpringBootTest로 통합테스트 하기 (0) | 2022.05.29 |
[스프링부트 (8)] SpringBoot Test(1) - Junit 설정 및 실행 (0) | 2022.05.29 |