application.properties vs application.yml

Jinny·2021년 8월 13일
1

스프링

목록 보기
3/5

외부 설정 파일

애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의하는 파일이다.

Spring boot를 이용해서 어플리케이션을 만들다 보면 외부에서 특정 값들을 주입받아야 하는 경우가 있다. (예를 들면 외부 API를 사용하기 위한 API key 등) 이러한 값들을 소스 코드에 그대로 쓰면 여러가지 문제가 생길 수 있다. 따라서 이러한 값들을 외부 설정 파일에 넣어 사용할 수 있다.

resources 디렉터리 밑에 있는 application.properties 나 application.yaml 파일은 스프링 부트가 자동으로 로딩하는 설정 파일들이다.

application.properties

스프링부트가 애플리케이션을 구동할때 자동으로 로딩하는 파일이다. key - value 형식으로 값을 정의하면 애플리케이션에 참조하여 사용할 수 있다.

spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password

# 리스트 표현
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

random

app.age=${random.int}

placeholder

앞서 정의해준 값을 변수 사용하듯이 참조할 수 있다.

app.name=MyApp
app.description=${app.name} is a Spring Boot application

application.yml

properties와 다르게 계층 구조로 표현할 수 있어서 prefix의 중복 제거가 가능해지고 가독성이 좋다.

spring:
	h2:
		console:
			path: /h2-console
    datasource:
        url: jdbc:h2:~/test
        driverClassName: org.h2.Driver
        username: sa
        password: password
# 리스트 표현
application:
    servers:
    -   ip: '127.0.0.1'
        path: '/path1'
    -   ip: '127.0.0.2'
        path: '/path2'
    -   ip: '127.0.0.3'
        path: '/path3'

값 참조

아래와 같은 application.yml이 정의된 상태라고 가정

external:
	record-year: 2021
	api:
		name: kakao
		key: 123123

@Value

@Value 어노테이션을 사용하여 값을 주입할 수 있다.

public class ExternalService{
    @Value("${external.record-year}")
	private String recordYear;
  
	@Value("${external.api.name}")
	private String apiName;
  
	@Value("${external.api.key}")
	private Integer apiKey;
}

Environment

Environment api를 사용하여 .getProperty("key") 메서드로 값을 가져올 수 있다.

@Autowired
private Environment env;

private String apiName = env.getProperty("external.api.name")

@ConfigurationProperties

@ConfigurationProperties 어노테이션을 사용해 구조화 된 개체에 바인딩 할 수도 있다.

@ConfigurationProperties 의 value 로 prefix를 적어줘야 한다. 중첩 클래스 (ex.Api)를 사용하게 되는 경우 이름을 똑같이 일치시켜야 하고 setter를 반드시 정의해주어야 함.

@ConfigurationProperties("external")
public class ConfigProperties{
    String recordYear;
    String Api api;
    
    @Getter
    @Setter
    public static class Api {
        private String name;
        private Integer key;
    }
}

프로퍼티 우선순위

프로퍼티를 설정할 수 있는 방법은 여러가지이며 각 방법마다 우선순위가 있다. 여러 방법으로 같은 프로퍼티를 정의하고 있으면 우선순위가 가장 높은 방법으로 정의한 프로퍼티 값이 오버라이딩된다.

우선순위

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  2. 테스트에 있는 @TestPropertySource
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
  6. ServletConfig 파라미터
  7. ServletContext 파라미터
  8. java:comp/env JNDI 애트리뷰트
  9. System.getProperties() 자바 시스템 프로퍼티
  10. OS 환경 변수
  11. RandomValuePropertySource
  12. JAR 밖에 있는 특정 프로파일용 application properties
  13. JAR 안에 있는 특정 프로파일용 application properties
  14. JAR 밖에 있는 application properties
  15. JAR 안에 있는 application properties
  16. @PropertySource
  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

application.properties 의 우선순위

application.properties를 같은 위치가 아니라 다른 위치에 둘 경우는 컴파일해도 덮어쓰지 않게된다.

이 때 우선순위는 아래와 같다.

  1. file:./config/ :프로젝트 디렉토리 바로 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법
  2. file:./ :프로젝트 루트 바로 아래에 application.properties 만들어주는 방법
  3. classpath:/config/ :classpath 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법
  4. classpath:/ :classpath 아래에 application.properties 만들어주는 방법

참조

Using application.yml vs application.properties in Spring Boot

Spring Boot에서 properties 값 주입받기

Application.properties

profile
삐약 응애

0개의 댓글