최근에 사용하는 프로필이 dev, prod, local, test 4개가 존재하는 스프링 부트 어플리케이션을 개발하고 있다. 로컬에서 'mvn spring-boot:run' 명령어를 실행하면 local 프로필을 사용해서 부트 앱을 실행하고 싶었다. src/main/resources 폴더에 application-prod.properties, application-dev.properties, application-local.properties 파일이 함께 존재해서 src/main/resources의 application.properties 파일에 spring.profiles.active=local 설정을 줄 수 없었다.
'mvn spring-boot:run -Dspring-boot.run.profiles=local'와 같이 로컬에서 실행할 때 마다 프로필을 지정하려니까 귀찮았다. 그래서 프로필을 선택하지 않은 경우 기본으로 local 프로필을 활성화하는 설정을 추가했다.
먼저 EnvironmentPostProcessor 인터페이스를 구현한 클래스를 작성한다.
public class ProfileResolverEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
SpringApplication application) {
boolean isSomeProfileActive =
environment.acceptsProfiles(Profiles.of("prod", "dev", "test", "local"));
if (!isSomeProfileActive) {
environment.addActiveProfile("local");
Resource path = new ClassPathResource("application-local.properties");
if (path.exists()) {
try {
environment.getPropertySources().addLast(
new PropertiesPropertySourceLoader().load("application-local", path).get(0));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
} else {
log.info("Some of [prod, dev, test, local] is active: " + environment.getActiveProfiles());
}
}
}
이 코드는 ConfigurableEnvironment#acceptsProfiles() 메서드를 이용해서 "prod", "dev", "test", "local" 프로필 중 하나라도 활성화되어 있는지 검사한다. 활성화되어 있지 않으면 활성 프로필을 "local"을 추가하고, 사용할 프로퍼티 소스로 "application-local" 프로퍼티 파일을 추가한다.
다음 할 일은 META-INF/spring.factories 파일에 다음 설정을 추가하는 것이다.
org.springframework.boot.env.EnvironmentPostProcessor=\
demo.ProfileResolverEnvironmentPostProcessor
특정 프로필을 선택하지 않고 부트 어플리케이션을 실행하면 local 프로필이 활성화되는 것을 확인할 수 있다.