applicationocontext는 bean factory 기능만 하는 것이 아니라 여러 기능이 더 있다.
그 중 EnvironmentCapable이 제공하는 기능 2가지에서 1가지인 프로파일 기능에 대해 살펴보자.
프로파일은 bean들의 묶음으로 maven에도 프로파일이라는 기능이 있고, 스프링의 프로파일도 마찬가지로 어떠한 환경이다. 테스트 환경에서는 이런 bean들을 쓰겠다, 실제 프로덕션에서는 이런 bean들을 쓰겠다...등등
각각의 환경에 따라 다른 bean들을 사용해야하는 경우 또는 특정 환경에서만 어떤 bean을 등록해야하는 경우 그런 요구사항을 충족시키기 위해 프로파일이라는 기능이 생겼고, 프로파일은 스프링 applicationcontext에 environment라는 인터페이스를 통해서 사용할 수 있다.
ApplicationContext ctx;
public void run(ApplicationArguments args) throws Exception{
Environment environment = ctx.getEnvironment();
}
}
getEnvironment()는 EnvironmentCapable에서 온 것으로 ApplicationContext가 이 interface를 상속받았기 때문에 우리는 getEnvironment를 호출해서 Environment를 가져올 수 있다.
프로파일 정의 방법
1-1) 클래스에 정의 - @Configuration @Profile("test")
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
public BookRepository bookRepository(){
return new TestBookRepository();
}
}
이 bean 설정 파일은 test 프로파일일 때만 사용이 되는 bean 설정파일이 된다. 즉, 우리가 test라는 프로파일로 이 application을 실행하기 전까지는 이 bean설정파일이 적용이 안되고, 위의 예시인 BookRepository는 주입 받을 수 없게 된다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository; //주입받지 못해서 빌드시 오류 발생
@Override
public void run(ApplicationArguments args) throws Exception{
Environment environment = ctx.getEnvironment();
}
}
1-2) Bean에 바로 정의하는 방법 - @Component @Profile("test")
@Repository
@Profile("test")
public class TestBookRepository implement BookRepository{
}
Bean 설정파일 없이 이렇게 componentScan으로 등록되는 bean에도 프로파일을 지정할 수 있다.
1-3) 메소드에 정의 - @Bean @Profile("test")
@Configuration
public class TestConfiguration {
@Bean
@Profile("test")
public BookRepository bookRepository(){
return new TestBookRepository();
}
}
프로파일 설정 방법
application에 프로파일을 지정하는 방법은
spring.profiles.active를 실행할 때 옵션에 주어야한다.
실행 설정 -> Active profiles: test라고 입력해주면 된다. (인텔리J ULTIMATE버전에만 있을 수도 있다...)
없을 경우에는
VM options: -Dspring.profiles.active="test"
프로파일 표현식
1) ! (not)
@Profile("!prod") 이렇게 문자열을 쓰면 prod가 아닌 경우에 등록해라는 의미가 된다.
2) & (and)
3) | (or)
댓글