1. 개요

이 튜토리얼에서는 Spring에 프로파일을 소개하는 데 초점을 맞출 것입니다.

프로필은 프레임 워크의 핵심 기능으로, 빈을 다른 프로필 ( 예 : dev , test , prod) 에 매핑 할 수 있습니다.

그런 다음 다른 환경에서 다른 프로필을 활성화하여 필요한 빈만 부트 스트랩 할 수 있습니다.

2. Bean에서 @Profile 사용

간단하게 시작하여 특정 프로파일에 속하는 Bean을 만드는 방법을 살펴 보겠습니다. 우리는 @Profile 어노테이션을 사용합니다 . 빈을 특정 프로파일에 매핑합니다 . 어노테이션은 단순히 하나 (또는 ​​여러) 프로필의 이름을 사용합니다.

기본 시나리오를 고려하십시오. 개발 중에 만 활성화되어야하지만 프로덕션에 배치되지 않는 Bean이 있습니다.

우리는 그 빈에 dev  프로필로 어노테이션을 달고 , 개발 중에 만 컨테이너에있을 것입니다. 프로덕션에서 개발자는 단순히 활성화되지 않습니다.

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

참고로, 프로필 이름은 NOT 연산자 (예 : ! dev )를 접두사로 붙여 프로필에서 제외 할 수도 있습니다.

예에서 구성 요소는 dev  프로필이 활성화되지 않은 경우에만 활성화됩니다 .

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

3. XML로 프로필 선언

프로필은 XML로 구성 할 수도 있습니다. <Bean> 태그가 갖는 정보의  해당 정보의 쉼표로 구분 된 값을 얻어 특성 :

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

4. 프로필 설정

다음 단계는 각 Bean이 컨테이너에 등록되도록 프로파일을 활성화하고 설정하는 것입니다.

이는 다양한 방법으로 수행 할 수 있으며 다음 섹션에서 살펴볼 것입니다.

4.1. WebApplicationInitializer 인터페이스 를 통해 프로그래밍 방식으로

웹 애플리케이션에서 WebApplicationInitializer 를 사용하여 ServletContext를 프로그래밍 방식 으로 구성 할 수 있습니다 .

또한 프로그래밍 방식으로 활성 프로필을 설정할 수있는 매우 편리한 위치입니다.

@Configuration
public class MyWebApplicationInitializer 
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
 
        servletContext.setInitParameter(
          "spring.profiles.active", "dev");
    }
}

4.2. ConfigurableEnvironment 를 통한 프로그래밍 방식

환경에서 직접 프로필을 설정할 수도 있습니다.

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

4.3. web.xml의 컨텍스트 매개 변수

마찬가지로 컨텍스트 매개 변수를 사용하여 웹 애플리케이션 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>

4.4. JVM 시스템 매개 변수

프로파일 이름은 JVM 시스템 매개 변수를 통해 전달할 수도 있습니다. 이러한 프로필은 응용 프로그램 시작 중에 활성화됩니다.

-Dspring.profiles.active=dev

4.5. 환경 변수

Unix 환경에서는 환경 변수를 통해 프로필을 활성화 할 수도 있습니다 .

export spring_profiles_active=dev

4.6. Maven 프로필

Spring 프로파일은 spring.profiles.active  구성 특성지정하여 Maven 프로파일을 통해 활성화 할 수도 있습니다 .

모든 Maven 프로필에서 spring.profiles.active 속성을 설정할 수 있습니다 .

<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 @ 자리 표시자를 대체하는 데 사용됩니다 .

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

이제 pom.xml 에서 리소스 필터링을 활성화해야합니다 .

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

-P 매개 변수를 추가하여 적용 할 Maven 프로필을 전환합니다.

mvn clean package -Pprod

이 명령은 prod 프로필 용 응용 프로그램을 패키징합니다 . 또한  실행 중일 때이 애플리케이션에 대한 spring.profiles.active prod적용합니다  .

4.7. 테스트의 @ActiveProfile

테스트를 통해 @ActiveProfile 어노테이션을 사용 하여 활성 상태 인 프로필을 매우 쉽게 지정 하여 특정 프로필을 활성화 할 수 있습니다.

@ActiveProfiles("dev")

지금까지 프로필을 활성화하는 여러 방법을 살펴 보았습니다. 이제 어떤 것이 다른 것보다 우선 순위가 높은지, 그리고 가장 높은 우선 순위에서 가장 낮은 우선 순위까지 ​​둘 이상을 사용하면 어떻게되는지 살펴 보겠습니다.

  1. web.xml의 컨텍스트 매개 변수
  2. WebApplicationInitializer
  3. JVM 시스템 매개 변수
  4. 환경 변수
  5. Maven 프로필

5. 기본 프로필

프로파일을 지정하지 않는 모든 Bean은 기본  프로파일에 속합니다 .

Spring은 spring.profiles.default  속성 을 사용하여 다른 프로파일이 활성화되지 않은 경우 기본 프로파일을 설정하는 방법도 제공 합니다.

6. 활성 프로필 가져 오기

Spring의 활성 프로필은 빈 활성화 / 비활성화를위한 @Profile 어노테이션 의 동작을 유도합니다 . 그러나 프로그래밍 방식으로 활성 프로필 List에 액세스 할 수도 있습니다.

우리는 두 가지 방법,이 사용 환경 또는 spring.active.profile을 .

6.1. 환경 사용

환경 개체를 삽입 하여 활성 프로필에 액세스 할 수 있습니다 .

public class ProfileManager {
    @Autowired
    private Environment environment;

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

6.2. spring.active.profile 사용

또는 spring.profiles.active 속성을 주입하여 프로파일에 접근 할 수 있습니다  .

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

여기서 activeProfile  변수 에는 현재 활성화 된 프로필의 이름이 포함 되며 여러 개가있는 경우 쉼표로 구분 된 이름이 포함됩니다.

그러나 활성 프로필이 전혀 없으면 어떤 일이 발생할지 고려해야합니다. 위의 코드에서 활성 프로필이 없으면 응용 프로그램 컨텍스트가 생성되지 않습니다. 이로 인해 변수에 삽입 할 자리 표시자가 누락되어 IllegalArgumentException이 발생합니다.

이를 방지하기 위해 기본값을 정의 할 수 있습니다 .

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

이제 활성화 된 프로필이 없으면 activeProfile 에 빈 문자열 만 포함됩니다.

이전 예제와 같이 List에 액세스 하려면 activeProfile 변수 분할 하여 수행 할 수 있습니다 .

public class ProfileManager {
    @Value("${spring.profiles.active:}")
    private String activeProfiles;

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

7. 예 : 프로필을 사용하여 데이터 소스 구성 분리

이제 기본 사항을 벗어 났으므로 실제 예제를 살펴 보겠습니다.

개발 및 프로덕션 환경 모두에 대해 데이터 소스 구성을 유지해야하는 시나리오를 고려하십시오 .

두 데이터 소스 구현에서 구현해야하는 공통 인터페이스 DatasourceConfig만들어 보겠습니다 .

public interface DatasourceConfig {
    public void setup();
}

다음은 개발 환경에 대한 구성입니다.

@Component
@Profile("dev")
public class DevDatasourceConfig implements DatasourceConfig {
    @Override
    public void setup() {
        System.out.println("Setting up datasource for DEV environment. ");
    }
}

프로덕션 환경을위한 구성 :

@Component
@Profile("production")
public class ProductionDatasourceConfig implements DatasourceConfig {
    @Override
    public void setup() {
       System.out.println("Setting up datasource for PRODUCTION environment. ");
    }
}

이제 테스트를 만들고 DatasourceConfig 인터페이스를 삽입 해 보겠습니다. 활성 프로필에 따라 Spring은 DevDatasourceConfig 또는 ProductionDatasourceConfig 빈을 주입합니다 .

public class SpringProfilesWithMavenPropertiesIntegrationTest {
    @Autowired
    DatasourceConfig datasourceConfig;

    public void setupDatasource() {
        datasourceConfig.setup();
    }
}

디바이스의  프로파일이 활성화되면 스프링 주입 DevDatasourceConfig의 목적을 다음 호출 할 때 설정 () 메소드에서 다음의 출력 :

Setting up datasource for DEV environment.

8. 스프링 부트의 프로필

Spring Boot는 몇 가지 추가 기능과 함께 지금까지 설명한 모든 프로필 구성을 지원합니다.

섹션 4에서 소개 한 초기화 매개 변수 spring.profiles.active 는 현재 활성화 된 프로필을 정의하기 위해 Spring Boot의 속성으로 설정 될 수도 있습니다. 이것은 Spring Boot가 자동으로 선택하는 표준 속성입니다.

spring.profiles.active=dev

프로그래밍 방식으로 프로필을 설정하기 위해 SpringApplication 클래스를 사용할 수도 있습니다 .

SpringApplication.setAdditionalProfiles("dev");

Spring 부팅에 메이븐을 사용하여 설정 프로파일을 위해, 우리는 아래에 프로파일 이름을 지정할 수 있습니다  스프링 부팅 받는다는 - 플러그인 에서 pom.xm의 리터를 :

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

Spring Boot 전용 Maven 목표를 실행하십시오.

mvn spring-boot:run

그러나 Spring Boot가 제공하는 가장 중요한 프로필 관련 기능은 프로필 별 속성 파일입니다. 이는 application- {profile} .properties 형식으로 이름을 지정해야합니다 .

Spring Boot는 모든 프로필 에 대해 application.properties 파일 의 속성을 자동으로로드 하고 지정된 프로필에 대해서만 프로필 별 .properties 파일 에있는 속성을로드합니다 .

예를 들어 application-dev.propertiesapplication-production.properties 라는 두 파일을 사용하여 개발프로덕션 프로필에 대해 서로 다른 데이터 소스를 구성 할 수 있습니다 .

에서 application-production.properties 파일, 우리는 설정할 수 있습니다 MySQL을의 데이터 소스를 :

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root

그런 다음 application-dev.properties 파일 에서 dev 프로필에 대해 동일한 속성을 구성하여 메모리 내 H2 데이터베이스 를 사용할 수 있습니다.

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

이러한 방식으로 다양한 환경에 대해 다양한 구성을 쉽게 제공 할 수 있습니다.

9. 결론

이 기사에서는 에서 프로파일정의하는 방법과 애플리케이션에서 올바른 프로파일활성화하는 방법에 대해 논의 했습니다 .

마지막으로 간단하지만 실제 사례를 통해 프로필에 대한 이해를 검증했습니다.

이 튜토리얼의 구현은 GitHub 프로젝트 에서 찾을 수 있습니다 .