본문 바로가기

스프링 부트

스프링 부트 Profile별로 다른 환경 구성

반응형

2021-06-09글

Profile?

  • 애플리케이션 일부 configuration을 분리하고 싶을 때 사용
  • 애플리케이션 일부 configuration을 특정 환경에서만 가능하게 하고 싶을 때 사용
  • 개발 환경에 따라 설정값을 달르게 로딩할 때

@Profile

  • @Component, @Configuration, @ConfigurationProperties@Profile와 함께 선언
@Configuration
@Profile("production")
public class ProductionConfiguration {

    // ...

}
  • 어플리케이션 실행시 spring.profiles.active 프로퍼티로 프로파일을 지정하면 해당 프로파일일 경우에만 해당 빈이 등록됨

application-properties

spring.profiles.active=dev,hsqldb

Example

  1. application-properties에 다음과 같이 정의
spring.profiles.active=prod
  1. @Profile 어노테이션과 함께 @Configuration 등록

imageimage

  1. 어플리케이션 실행시 active한 prod에 등록된 hello 빈이 출력됨

image

@Profile과 @ActiveProfiles

  • 서로 다른 환경에서 서로 다른 profile을 활성화하여 필요한 빈만 등록하도록 하는 어노테이션
  • @Profile은 SpringBootApplication을 실행할 때 사용
  • @ActiveProfiles은 테스트 환경에서 사용

application.properties

  • application-{profile}.properties 형식으로 파일 생성
  • 이는 @ConfigurationProperties로 간주되고 로드됨
    • *.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션
  • application-{profile}.properties은 application.properties 보다 우선순위가 높게됨
  • 빌드할 때 다음과 같은 명령어와 함께 특정 환경설정을 적용할 수 있음
--spring.profiles.active=production
  • properties 파일에 spring.profiles.include를 통해 추가할 프로파일을 설정할 수 있음

Example

application-properties

spring.profiles.active=dev
profile-common.name = default_name_mazzi
defaultonly.name = defualt_name

application-prod.properties

profile-common.name = test_name_mazzi
testonly.name = test_name

application-dev.properties

profile-common.name = dev_name_mazzi
devonly.name = dev_name

AppRunner

@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    Environment env;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("=====================================================");
        System.out.println("spring.profiles.active : " + args.getOptionValues("spring.profiles.active"));
        System.out.println("Enviroment's Active Profile : " + Arrays.toString(env.getActiveProfiles()));
        System.out.println("defaultonly.name : " + env.getProperty("defaultonly.name"));
        System.out.println("testonly.name : " + env.getProperty("testonly.name"));
        System.out.println("devonly.name : " + env.getProperty("devonly.name"));
        System.out.println("profile-common.name : " + env.getProperty("profile-common.name"));
        System.out.println("=====================================================");
    }
}

실행 결과

image

  • profile-common.name는 모든 프로퍼티 파일이 공통으로 가진 프로퍼티
  • dev 프로파일을 활성화
  • 공통 속성인 profile-common.name은 우선순위가 높은 dev 프로파일의 것으로 오버라이드 됨

참고자료

반응형