application.properties? application.yml? application-test?? 우선순위는?
어렵지 않은 것인데, 일전에 노베이스로 직접 설정하다가 너무 힘들게 배워서 포스팅한다.
(resources directory 밑에 위치)
application.properties란, Spring Boot 애플리케이션의 구성 속성을 설정하는 데 사용되는 파일이다. 애플리케이션의 클래스 경로에 위치하며, 키-값 쌍의 형식으로 구성된다. 스프링 부트가 자동으로 로딩하게 되는 규약들이라고 보면 된다.
나는 스프링을 처음 배우며 application.properties를 사용했기 때문에 이게 익숙했다.
아래는 내가 사용한 예시이다.
// MySQL 사용 설정
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
// Hibernate 쿼리문 날아가는 것을 보기 쉽게 해준다
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
ddl-auto=
는 create, create-drop, update, validate, none(default) 로 5가지 속성이 있는데, 테이블을 어떻게 다룰지 관련된 설정이다.그럼 yml은 뭐냐?
이것은 Spring legacy에서의 web.xml, root-context.xml, servlet-context.xml의 합본이다. 즉, application.yml은 이 프로젝트에서 사용하는 설정값들을 관리하는 파일이다.
즉, application.properties의 구버전인 셈.
똑같은 기능을 한다고 보면 된다. 위에 작성 한 것을 yml로 바꿔보면,
spring:
datasource:
url: ${DB_URL}
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${DB_USER}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
use_sql_comments: true
format_sql: true
구조만 다를 뿐, 그 내용을 들여다보면 위와 동일한 내용을 갖고있는 것을 볼 수 있다.
이렇게 properties나 yml에 -test를 붙이면 test코드에 적용될 설정들을 적용 할 수 있다.
또는 이렇게 test의 resource에 넣으면 -test를 붙이지 않아도 테스트 코드에 적용된다.
(이 방법이 더 직관적이라 일반적으로 선호된다.)
그렇다면 test용으로 설정한 이유는 무엇인가?
나의 경우는 test용 DB를 따로 설정하고 싶었기 때문이다.
실제(?) DB는 MySQL을, Test용으로는 가벼워서 의존성 주입만으로도 사용 가능한 h2를 사용했다.
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=test
spring.datasource.password=password
spring.h2.console.enabled=true
그렇다면 설정들은 어떤 우선순위를 갖고 적용이 될까?
우선 속성의 종류는 아래와 같다.
이런 속성값은 아래의 방법으로 객체에 바인딩 할 수 있다.
우선순위는 낮은 순에서 높은 순으로 오버라이드되므로, 공통으로 사용할 값일 수록 우선순위가 낮아지고, 프로파일이나 특정 환경별로 사용할 값일 수록 우선순위가 높아진다.
보통은 3~4번 정도까지 다루게 되는 것으로 알고있다.