Programming/Spring

[스프링부트 (11)] SpringBoot YAML 적용하기(properties vs yaml)

byeong07 2022. 5. 29. 22:51

[스프링부트 (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을 프로퍼티에 적용하는 방법은 역시 공식 문서를 참고하도록 하자.

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

 

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. (시스템 환경 변수 사용시)

 

출처 및 참고 

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-yaml

 

 

내가 현재 설정 해둔 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