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 를 주면 된다.
이 명령어는 prod 프로파일을 적용하여 앱을 패키지할것이고, spring.profiles.active 의 값도 prod 로 설정할것이다.
테스트 시 @ActiveProfiles 를 통한 방법
테스트할 땐 profile 를 명시하는것이 매우 쉽다. 테스트 클래스에 다음과 같이 어노테이션을 붙여주면 된다.
- 여러가지를 함께 사용할 경우
위의 모든 방식들을 동시에 여러개 사용하는 경우 다음의 우선순위에 따라 결정된다. (우선순위가 높은 순으로)
- Context parameter in web.xml
- WebApplicationInitializer
- JVM System parameter
- Environment variable
- 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 명령어로 앱을 실행하면된다.
하지만 스프링 부트의 profiles 에 관한 기능 중 가장 중요한 것이 다음 기능이다.
Profile 별 properties files
스프링 부트는 우선. application.properties 파일 내 모든 property 를 로드한 후,
active 된 profile 들에 대한 .properties 파일에 대해서만 property 를 로드한다.
참고: https://www.baeldung.com/spring-profiles