스프링 부트 활용

프로파일

   프로파일은 스프링 프레임워크에서 제공해주는 기능 중 하나이다. 특정한 프로파일에서만 특정한 빈을 등록하고 싶다거나, 애플리케이션의 동작을 특정 프로파일일 때 빈 설정을 다르게 하고싶을 때 사용하면 된다.

가벼운 예제로 알아보자.
먼저 config라는 디렉토리를 만든 후 빈 설정 2개를 만든다.

package me.gracenam.springinit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Profile("prod")
@Configuration
public class BaseConfiguration {

    @Bean
    public String hello() {
        return "hello";
    }

}
package me.gracenam.springinit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Profile("test")
@Configuration
public class TestConfiguration {

    @Bean
    public String hello() {
        return "hello test";
    }

}

BaseConfigurationTestConfiguration을 만들었다.
BaseConfiguration은 Profile을 production으로 했고, 이 빈 설정 파일은 prod라는 프로파일 일 때 사용된다. 즉, prod가 아니면 사용되지 않는다.

   Runner에서 @Autowired로 hello라는 빈을 가져와서 출력을 해보자. 어떻게 될까?

package me.gracenam.springinit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class SampleRunner implements ApplicationRunner {

    @Autowired
    private String hello;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("=================");
        System.out.println(hello);
        System.out.println("=================");
    }

}


당연히 에러가 발생해야 한다. 에러 문구를 읽어보면 해당하는 타입의 빈을 찾을 수 없다고 출력되었다.

자, 그러면 이것을 해결하기 위해서 어떻게 해야할까.
이때 스프링 부트에서 도움을 주는 것이 있다. properties에 활성화하려는 프로파일을 정할 수 있게 해준 것이다.

spring.profiles.active = prod

프로파일에 위의 값을 넣어주고 실행을 해보면 정상적으로 출력이 되는 것을 확인할 수 있다.


마찬가지로 prod를 test로 바꿔서 실행해보면 바뀐 값이 출력되는 것을 볼 수 있다.

spring.profiles.active = test


   헌데, spring.profiles.active가 있는 위치가 application.properties이다. 그 말은 이것 또한 프로퍼티라는 말이다.
프로퍼티는 우선순위가 적용이 되기 때문에 커맨드 라인을 활용해서 prod로 값을 주게된다면 test를 오버라이딩해서 prod 값이 출력되게 될 것이다.

   프로파일용 프로퍼티를 따로 생성할 수도 있다. prod용와 test용 프로퍼티를 각각 만든 다음에 출력이 어떻게 되는지 확인해보자.

▶ application-prod.properties

grace.name = grace prod

▶ application-test.properties

grace.name = grace test


prod일 때는 name이 grace prod로 출력되는 것을 볼 수 있다. 마찬가지로 test일 때는 grace test로 출력될 것이다. 이처럼 프로파일과 관련된 프로퍼티의 우선순위가 기본적인 프로퍼티보다 높다. 그래서 오버라이딩 된 것이다.

   추가적인 프로파일을 활성화하고 싶을 때 spring.profiles.include를 사용하면 된다.

spring.profiles.include를 사용해서 다른 프로파일을 추가하는 것을 해보자.
기존의 프로파일에 있는 값 중에서 full-Name의 값을 바꿔보겠다.

▶ application.properties

grace.name = grace
grace.fullName = ${grace.name} Nam
spring.profiles.active = prod

▶ application-prod.properties

grace.name = grace prod
spring.profiles.include=proddb

▶ application-proddb.properties

grace.full-name=dbdbdb

이렇게 하면 prod일 때 name이 변경되면서 proddb 프로파일를 추가하게 되면서 full-name이 바뀌게 된다.


💡 부트 2.4 버전부터는 active와 include를 함께 사용할 수 없도록 변경되었다. 자세한 내용은 아래 블로그를 참조하도록 하자.

https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4


Reference