Spring 의 Profiles

Spring 의 Profiles

Profiles 을 사용하면 애플리케이션이 실행되는 환경에 따라 다른 Bean 들을 매핑할 수 있다.

예를 들어, 개발 환경, 스테이징 환경, 혹은 실 서비스 환경에 따라 다른 의존성을 주입할 수 있다.

Profiles 구분하기

Bean 에 @Profile 붙이기

@Component
@Profile("dev")
public class DevDatasourceConfig

다음과 같이 특정 profile 이 active 하지 않을 때만 container 에 포함시킬 수도 있다.

@Component
@Profile("!dev")
public class DevDatasourceConfig

XML 에 정의하기

태그의 ”profiles” 속성으로 설정이 가능하다.

<beans profile="dev">
<bean id="devDatasourceConfig"
class="org.baeldung.profiles.DevDatasourceConfig" />
</beans>

Profiles 설정하기

WebApplicationInitializer 인터페이스를 통한 방법

ServletContext 를 코드 기반으로 설정해주기 위해 다음과같이 WebApplicationInitializer 를 사용할 수 있다.

@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

servletContext.setInitParameter(
"spring.profiles.active", "dev");
}
}

ConfigurableEnvironment 를 통한 방법

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");

web.xml 를 통한 방법

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>

JVM 파라미터를 통한 방법

-Dspring.profiles.active=dev

환경변수를 통한 방법

export spring_profiles_active=dev

Maven profiles 를 통한 방법

이 방식은 매우 복잡하므로 그냥 참고만 하자.

<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>

위와같이 설정한 뒤에 application.properties 파일에서 @spring.profiles.active@ placeholder 를 사용하고

spring.profiles.active=@spring.profiles.active@

Resource filtering 을 활성화해주고

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>

마지막으로 메이븐에 -P parameter 를 주면 된다.

mvn clean package -Pprod

이 명령어는 prod 프로파일을 적용하여 앱을 패키지할것이고, spring.profiles.active 의 값도 prod 로 설정할것이다.

테스트 시 @ActiveProfiles 를 통한 방법

테스트할 땐 profile 를 명시하는것이 매우 쉽다. 테스트 클래스에 다음과 같이 어노테이션을 붙여주면 된다.

@ActiveProfiles("dev")
  • 여러가지를 함께 사용할 경우
    위의 모든 방식들을 동시에 여러개 사용하는 경우 다음의 우선순위에 따라 결정된다. (우선순위가 높은 순으로)
  1. Context parameter in web.xml
  2. WebApplicationInitializer
  3. JVM System parameter
  4. Environment variable
  5. Maven profile
  • 디폴트 Profile
    만약 Profiles 를 지정하지 않으면 "default" profile 로 설정되며,
    spring.profiles.default 프로퍼티를 통해 디폴트 profile 를 "default" 에서 다른 값으로 변경할 수 있다.

활성화된 Profiles 사용하기

Environment 를 통한 방법

public class ProfileManager {
@Autowired
private Environment environment;

public void getActiveProfiles() {
for (String profileName : environment.getActiveProfiles()) {
System.out.println("Currently active profile - " + profileName);
}
}
}

spring.active.profile 을 통한 방법

@Value("${spring.profiles.active}")
private String activeProfile;

그런데 만약 현재 active 한 profile 이 없는 경우에는 IllegalArgumentException 이 발생할 수 있으므로 default 값을 줘야한다.

@Value("${spring.profiles.active:}")
private String activeProfile;

Spring Boot 에서의 Profiles

스프링 부트는 위에 언급된 모든 profile 설정 방식은 물론, 몇가지 추가적인 기능을 제공한다.

properties 파일을 통한 방법

우선, 다음과같이 properties 파일에서 설정이 가능하다.

spring.profiles.active=dev

SpringApplication 클래스를 통한 방법

또한, 다음과같이 SpringApplication class 를 사용하여 코드 기반의 설정도 가능하다.

SpringApplication.setAdditionalProfiles("dev");

Maven 을 통한 방법

마지막으로, 메이븐으로도 설정 가능하다.
pom.xml 의 spring-boot-maven-plugin 내에 프로파일 이름을 명시할 수 있다.

<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<profiles>
<profile>dev</profile>
</profiles>
</configuration>
</plugin>
...
</plugins>

그리고 mvn 명령어로 앱을 실행하면된다.

man spring-boot:run

하지만 스프링 부트의 profiles 에 관한 기능 중 가장 중요한 것이 다음 기능이다.

Profile 별 properties files

스프링 부트는 우선. application.properties 파일 내 모든 property 를 로드한 후,
active 된 profile 들에 대한 .properties 파일에 대해서만 property 를 로드한다.

참고: https://www.baeldung.com/spring-profiles

Comments