프로파일

프로파일을 지정하면 해당 프로파일에서만 특정한 빈을 등록하는 것처럼 애플리케이션의 동작을 다르게 수행할 수 있다. @Profile의 value 속성에 프로파일명을 명시함으로써 해당 프로파일에서만 특정 작업을 수행한다.

Profile 애노테이션은 어디에?

@Configuration 혹은 @Component가 지정된 빈에 @Profile을 지정할 수 있다.

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

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

@Profile("test")
@Configuration
public class TestConfiguration {
    @Bean
    public String hello() {
        return "test:";
    }
}

어떤 프로파일을 활성화 할 것인가?

spring.profiles.active

properties 파일에서 spring.profiles.active를 이용하여 활성화할 프로파일을 지정할 수 있다.

# application.properties
jch.name = jcheolho
jch.age = ${random.int(0,100)}
jch.full_name = ${jch.name} Jung
jch.sessionTimeout = 25s

# 프로파일 지정
spring.profiles.active = prod

외부설정 우선순위 에서 공부한 것처럼 우선순위가 높은 방법으로 spring.profiles.active을 지정할 수도 있다. (jvm 옵션, program arguments 등)

프로파일용 프로퍼티

application-{profile}.properties

프로파일 전용 properties 파일을 만들 수 있다. application-prod.properties, application-test.properties 와 같이 -뒤에 프로파일명으로 properties 파일을 생성한다.

# application.properties
jch.name = jcheolho
jch.age = ${random.int(0,100)}
jch.full_name = ${jch.name} Jung
jch.sessionTimeout = 25s
spring.profiles.active = prod

# application-prod.properties
jch.name = jch prod

# application-test.properties
jch.name = jch test
@Component
public class SampleListener implements ApplicationRunner {

    @Autowired
    private String hello;

    @Autowired
    JchProperties jchProperties;

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

getName() 메소드는 prod 프로파일이 활성화된 경우 "jch prod", test 프로파일이 활성화된 경우 "jch test"가 반환될 것이다.

어떤 프로파일을 추가할 것인가?

spring.profiles.include

spring.profiles.include를 이용해서 다른 프로파일의 properties를 가져올 수 있다.

# application-prod.properties
jch.name = jch prod
spring.profiles.include=proddb

# application-proddb.properties
jch.full-name = dbdbdb

prod 프로파일에서는 getFullName()이 proddb 프로파일의 "dbdbdb"로 덮어씌워져 반환될 것이다.

해당 포스팅은 스프링 부트 개념과 활용 강의 내용을 토대로 작성하였습니다.