본문 바로가기
실습/리눅스 서버 + 스프링 부트

application.yml 적용법

by 이민우 2023. 1. 15.
728x90
반응형

application.properties vs application.yml

 

Spring Boot에서는 외부에서 환경 변수를 삽입할 수 있는 application.properties와 application.yml을 제공한다.

 

application.properties는 key-value 형식으로 환경 변수를 설정할 수 있다. 그에 반해 yml은 계층적으로 환경 변수를 설정할 수 있다.

application.properties에 비해 계층적 관리가 가능한 application.yml

아무래도 properties보다 직관적으로 관리할 수 있고, key를 중복해서 작성해지 않아도 된다는 장점 때문에 최근 프로젝트에서는 yml을 주로 사용하게 되었다.

 

이에 properties를 yml로 바꾸는 방법과, 더불어 다중 profile을 적용하는 방법을 포스팅해놓고자 한다.

 

properties 파일을 yml 파일로 전환하는 법

 

처음 프로젝트를 생성하면 다음과 같이 application.properties 파일이 생성되어 있다.

properties를 yml로 바꾸는 방법은 간단하게 그냥 rename으로 이름만 변경해버리면 된다.

이외의 별도로 적용해줘야 할 설정은 없다.

Rename을 눌러 properties를 yml로 변경한다.

 

 

 

 

다중 active profile 적용 (properties)

 

프로그램은 환경에 따라 입력해야 하는 환경변수가 다르다.

개발 서버와 운영 서버에서 각기 다른 URL의 DB나 파일 위치 등을 적용하는 것이 그 예시이다.

(혹은 환경에 따라 특정 환경 변수가 추가/삭제될 수 있다.)

 

프로그램을 돌릴 때 환경에 따라 환경 변수를 편집하는 일은 귀찮은 일이다. 그래서 환경에 맞는 다양한 환경변수들을 설정해놓고 실행 시 spring.profiles.active 옵션을 통해 각 환경에 특화된 환경 변수를 통해 어플리케이션을 실행할 수 있다.

 

application.properties 사용 시 다중 active profile을 적용하는 방법은 application-{profile_name}.properties 파일을 생성하는 것이다.

위 사진의 경우 순서대로 default (profile이 주어지지 않았을 때), dev, prod이다.

이제 각 properties에 다음과 같은 임시 환경 변수를 주고 테스트를 해보자.

## application.properties 파일
test.data="default properties"

## application-dev.properties 파일
test.data="dev properties"

## application-prod.properties 파일
test.data="prod properties"

 

이제 다음과 같은 테스트용 클래스와 테스트 파일을 생성한다.

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class OutputProperty {
	
	@Value("${test.data}") private String data;
	
	public String getPropertyData() { return data; }
}
package com.example.demo;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ScriptTestApplicationTests {
	
	Logger logger = LoggerFactory.getLogger(ScriptTestApplicationTests.class);
	@Autowired OutputProperty outputProperty;

	@Test
	void contextLoads() {
		logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
		logger.info(outputProperty.getPropertyData());
		logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
	}

}

 

그리고 JUnit5를 이용해 테스트 클래스를 구동해보면 다음과 같은 결과가 출력됨을 확인할 수 있다. profile을 지정하지 않았기에 default가 할당되었다.

 

마지막으로 실행 옵션에 spring.profiles.active을 dev, prod로 기재하면 다음과 같은 결과물이 출력됨을 확인할 수 있다.

VM arguments에 profile 지정
-Dspring.profile.active=dev
-Dspring.profiles.active=prod

추가로 굳이 파일을 나누지 않더라도 한 파일 내에 다음과 같이 #--- 으로 구분해 여러 profile을 생성할 수 있다.

  • 스프링부트 2.4 이전에서는 spring.config.activate.on-profile이 아닌 spring.profiles에 profile_name을 기재한다.

 

 

다중 active profile 적용 (yml)

 

application.yml 파일을 사용할 때도 application.properties와 마찬가지로 profile 별로 파일을 생성해서 사용할 수 있다.

 

만약 굳이 나누고 싶지 않다면, properties에서와 마찬가지로 application.yml 한 파일 안에 여러 profile을 몰아넣어 생성할 수도 있다.

다만 이 때 주의할 점은 properties는 #--- 로 profile을 나눴다면, yml은 ---을 기준으로 profile을 나눈다.

 

예시로 위의 application.properties를 application.yml에 적용하면 아래와 같이 만들어진다.

 

마지막으로 테스트를 해보면 똑같이 spring.profiles.active에 따라 환경 변수가 잘 삽입됨을 확인할 수 있다.

728x90
반응형