application.properties vs application.yml
Spring Boot에서는 외부에서 환경 변수를 삽입할 수 있는 application.properties와 application.yml을 제공한다.
application.properties는 key-value 형식으로 환경 변수를 설정할 수 있다. 그에 반해 yml은 계층적으로 환경 변수를 설정할 수 있다.
아무래도 properties보다 직관적으로 관리할 수 있고, key를 중복해서 작성해지 않아도 된다는 장점 때문에 최근 프로젝트에서는 yml을 주로 사용하게 되었다.
이에 properties를 yml로 바꾸는 방법과, 더불어 다중 profile을 적용하는 방법을 포스팅해놓고자 한다.
properties 파일을 yml 파일로 전환하는 법
처음 프로젝트를 생성하면 다음과 같이 application.properties 파일이 생성되어 있다.
properties를 yml로 바꾸는 방법은 간단하게 그냥 rename으로 이름만 변경해버리면 된다.
이외의 별도로 적용해줘야 할 설정은 없다.
다중 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로 기재하면 다음과 같은 결과물이 출력됨을 확인할 수 있다.
추가로 굳이 파일을 나누지 않더라도 한 파일 내에 다음과 같이 #--- 으로 구분해 여러 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에 따라 환경 변수가 잘 삽입됨을 확인할 수 있다.
'실습 > 리눅스 서버 + 스프링 부트' 카테고리의 다른 글
OAuth2.0 + Spring Boot (Google, Kakao, Naver 연동) (2) | 2023.07.01 |
---|---|
application 파일에서 자료구조(list, map) 사용법 (1) | 2023.05.28 |
JPA에서 외래키 사용 (1) | 2022.12.13 |
[Shell Script] 프로그램 실행/종료 스크립트 만들기 (0) | 2022.09.18 |
[Shell Script] 쉘 스크립트 문법 (0) | 2022.08.16 |