Spring Boot

application.yml 프로퍼티

iksadnorth 2023. 7. 27. 14:29

👣 개요

예를 들어, Spring Boot로 애플리케이션을 구축하고 실제 배포를 할 때,
포트 번호를 8080에서 80을 변경해야 하는 순간이 온다.
만약 포트 번호를 Java 코드를 통해 하드 코딩을 하면 코드 담당자 이외의 개발자는
포트 번호를 바꾸기 위해 해당 코드를 읽고 수정해야 하는데 이는 매우 비효율적이고 유지보수에 불리하다.

때문에 이러한 설정값들은 하드 코딩하지 않고 Yaml 파일 등에 기입하고 사용하게 된다.
만약 Spring Boot에 이런 설정 파일을 Parsing하는 기능이 존재하지 않았다면 직접 파일을 불러와서
Json 규칙에 따라 파싱을 진행해야 하지만 다행히도 그런 기능이 존재하기 때문에 개발자는 Yaml 파일을 작성하고 
일련의 규칙을 따르기만 하면 설정값을 Java 객체에 담을 수 있다.

👣 application.yml 파일 위치

Spring은 application.yml를 다음과 장소에 위치시켜야 인식한다.

- 애플리케이션 루트 디렉토리
  |- src
     |- main
        |- java
        |- resources
           |- application.yml (클래스패스 루트에 위치)
           |- config
              |- application.yml (config 디렉토리에 위치)
           |- custom-config
              |- myapp.yml (외부 설정 위치)

다만, (외부 설정 위치) 위치 부분은 다음과 같은 설정을 추가로 해야 한다.

spring.config.location=/path/to/config

👣 프로퍼티 매핑

application.yml에서 파싱한 내용을 실제 Java 객체에 주입하는 방법은 다음과 같다.
방법을 설명하기 앞서 application.yml 예시를 들면 다음과 같다.

my:
  property1: value1
  property2: 42

1. @Value 어노테이션
해당 방법은 SpEL 표현식을 사용해 프로퍼티 값을 매핑한다.

@Component
public class MyConfig {

    @Value("${my.property1}")
    private String propertyValue1;
    
    @Value("${my.property2}")
    private String propertyValue2;
}

2. @ConfigurationProperties 어노테이션
해당 방법은 Property 클래스를 따로 만들어 아예 설정 파일을 받는 기능을 따로 분리한 방법이다.
@Value를 사용하지 않아도 필드 이름으로 판단해 주입한다.

@Component
@ConfigurationProperties(prefix = "my")
public class MyConfigProperties {

    private String property1;
    private int property2;
}

3. Environment 객체 사용
Environment 객체는 yml에서 파싱한 내용을 머금고 있는 객체로서
getProperty 메소드로 직접 설정 내용을 가져올 수 있다.

public class MyService {

    @Autowired
    private Environment env;

    public void doSomething() {
        String propertyValue1 = env.getProperty("my.property1");
        String propertyValue2 = env.getProperty("my.property2");
    }
}

 

👣 Profile별 프로퍼티 분리

설정값은 개발 중, 테스트 중, 운영 중 등등의 상황에 따라 달라져야 한다.
이런 설정값을 각 상황마다 바꾸기보다 아예 각 상황에서 사용하는 설정들을 따로 모아둔다면
관리하기 편하고 쉽게 전환할 수 있다. Spring에서는 이런 기능을 지원한다.

 

application-{profile}.yml라고 파일이름을 명명하면
해당 설정파일은 {profile}에서만 사용되는 설정 파일이 된다.

// application-dev.yml
my:
  property: value1
  
// application-prod.yml
my:
  property: value2

 

특정 Profile로 서버를 가동시키고 싶으면 다음과 같이 작동시키면 된다.
참고로 여러 프로파일을 실행시킬 수 있다.

java -jar my-app.jar -Dspring.profiles.active={profile1},{profile2}
# 명시적으로 무엇을 띄울지 기입.
spring:
  profiles:
    active: local

# 기입하지 않는 경우 사용할 Profile 지정.
spring:
  profiles:
    default: local

 

위와 같이 자주 함께 사용되는 Profile들을 하나로 묶어 정의하는 방법도 존재한다.
application.yml 파일에 다음과 같이 spring.profiles.group을 사용하면 된다.

spring:
  profiles:
    group:
      local:
        - site-local
        - db-local
      dev:
        - site-dev
        - db-dev

'Spring Boot' 카테고리의 다른 글

Spring Boot HTTPS 적용  (0) 2023.07.28
Executable Jar  (0) 2023.07.28
Spring Boot 버전 관리 원리  (0) 2023.07.27
Spring Boot 자동 설정 원리  (0) 2023.07.27
Servlet에서 Spring Boot까지의 발전 양상  (0) 2023.07.12