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")
지금까지 프로필을 활성화하는 여러 방법을 살펴 보았습니다. 이제 어떤 것이 다른 것보다 우선 순위가 높은지, 그리고 가장 높은 우선 순위에서 가장 낮은 우선 순위까지 둘 이상을 사용하면 어떻게되는지 살펴 보겠습니다.
- web.xml의 컨텍스트 매개 변수
- WebApplicationInitializer
- JVM 시스템 매개 변수
- 환경 변수
- 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.properties 및 application-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 프로젝트 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-profiles
'Java' 카테고리의 다른 글
Java에서 Map iterate 사용방법 (0) | 2021.03.13 |
---|---|
Spring과 CORS (0) | 2021.03.13 |
Spring REST API + OAuth2 + Angular (0) | 2021.03.13 |
Spring의 @Scheduled Annotation (0) | 2021.03.12 |
Spring Boot의 유효성 검사(validation 예제) (0) | 2021.03.12 |