[Spring] EnvironmentCapable - Profile 사용하기
[Spring] EnvironmentCapable - Profile 사용하기
Spring의 ApplicationContext는 BeanFactory 기능만 하는건 아니다.
ApplicationContext가 상속받는 다양한 인터페이스들
ApplicationContext가 상속받는 다양한 인터페이스들 중 EnvironmentCapable 인터페이스는 'Profile(프로파일)' 이라는 기능을 제공한다.
Profile(프로파일)의 개념
프로파일 = 빈들의 묶음
프로파일은 특정 실행 환경에서 사용할 빈들의 묶음이다.
테스트 환경에서 사용할 빈 묶음과 프로덕션(운영) 환경에서 사용할 빈 묶음이 서로 다를 수 있다.
또 각 환경에 따라 서로 다른 빈들을 써야하는 경우, 특정 환경에서만 등록해야하는 빈들이 있는 경우가 있을 수 있다.
프로파일은 그러한 요구사항을 충족할 수 있는 기능이다.
프로파일 확인하기 - Environment
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(Arrays.toString(environment.getActiveProfiles()));
System.out.println(Arrays.toString(environment.getDefaultProfiles()));
}
}
ApplicationContext의 getEnvironment()로 Environment 객체를 가져올 수 있다.
📝 Environment의 역할
활성화 할 프로파일 확인 및 설정
실행 결과
Environment의 getActiveProfiles()로 현재 active한 프로파일을 가져올 수 있고 getDefaultProfiles()로는 어떤 프로파일이든 상관 없이 기본적으로 적용되는 프로파일을 가져온다.
프로파일 정의하기 - @Configuration 클래스에 정의
프로파일은 @Profile 애노테이션으로 정의할 수 있으며 클래스, 메소드에 붙일 수 있다.
다음과 같은 빈 설정파일을 새로 작성해보자.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
public BookRepository bookRepository() {
return new TestBookRepository();
}
}
@Profile("test")와 같이 지정해줌으로써 이 빈 설정파일은 test 프로파일일때만 사용된다.
즉 test 프로파일로 어플리케이션을 실행하지 않으면 이 빈 설정파일이 적용되지 않는다.
ApplicationRunner에서 위 설정파일에 등록된 빈을 주입받으려고 해보자.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
// BookRepository를 주입받을 수 없다.
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(Arrays.toString(environment.getActiveProfiles()));
System.out.println(Arrays.toString(environment.getDefaultProfiles()));
}
}
실행 결과
BookRepository 타입의 빈을 찾을 수 없다는 에러가 발생한다.
test 프로파일로 어플리케이션을 실행하지 않았으므로 BookRepository 빈을 등록한 설정파일이 읽히지 않았고 따라서 BookRepository 빈도 등록되지 않았기 때문이다.
프로파일 설정하기
1) Active profiles 설정
IDE의 실행 환경 설정에서 Active profiles에 프로파일을 설정한다.
2) VM Options 설정
Active profiles 설정 항목이 없을 경우 VM options에 설정해도 된다.
-Dspring.profiles.active="프로파일1,프로파일2,프로파일3,..."
IDE에서 active profiles을 'test'로 설정하고 어플리케이션을 다시 실행해보자.
에러가 발생하지 않고 정상적으로 실행되며 getActiveProfiles()로 test가 출력된다.
Active profile을 설정하는 방법을 알았으므로 나머지 프로파일 정의 방법을 알아보자.
프로파일 정의하기 - 나머지 방법들
1) @Bean 메소드에 정의
@Bean 메소드에 @Profile을 같이 붙여서 정의할 수 있다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class TestConfiguration {
@Bean @Profile("test")
public BookRepository bookRepository() {
return new TestBookRepository();
}
}
2) @Component 클래스에 정의
@Component 클래스에 @Profile을 같이 붙여서 정의할 수 있다.
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;
@Repository
@Profile("test")
public class TestBookRepository implements BookRepository {
}
References
'Spring Framework > Spring Core' 카테고리의 다른 글
[Spring] ResourceLoader로 텍스트 파일 출력하기 (Java 11) (0) | 2021.04.22 |
---|---|
[Spring] ApplicationEventPublisher를 이용한 이벤트 프로그래밍 (0) | 2021.04.21 |
[Spring] Spring 어플리케이션 메시지 다국어 및 재로딩 처리 (0) | 2021.04.21 |
[Spring] EnvironmentCapable - Property 사용하기 (0) | 2021.04.21 |
[Spring] 빈의 Scope - 싱글톤과 프로토타입 (0) | 2021.04.21 |
[Spring] Component Scan과 Function을 사용한 빈 등록 방법 (0) | 2021.04.21 |
[Spring] @Autowired 동작 원리 - BeanPostProcessor (0) | 2021.04.21 |
[Spring] @Autowired의 다양한 사용 방법 - required, Primary, Qualifier (0) | 2021.04.21 |