Goal
- ApplicationContext의 Environment기능에 대해 알아본다
- 프로파일에 대해 알아본다
- 프로퍼티에 대해 알아본다
Environment란?
스프링 환경이자 설정과 관련된 인터페이스이다
public interface ApplicationContext extends EnvironmentCapable
- getEnvironment()
Environment이 제공하는 두가지 기능
1. 프로파일
빈들의 그룹으로, Environment의 역할은 활성화할 프로파일 확인 및 설정한다.
: 디폴트 프로파일은 어떤 프로파일과 상관없이 기본적으로 적용되는 프로파일
@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.getDefaultProfiles()));
}
}
결과
[default]
유즈케이스
만약 테스트 환경에서는 A라는 빈을 사용하고, 배포 환경에서는 B라는 빈을 사용하고 싶다.
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
public BookRepository bookRepository(){
return new TestBookRepository();
}
}
위의 빈 설정파일은 test 프로파일일 때만 설정되는 프로파일이다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(Arrays.toString(environment.getDefaultProfiles()));
System.out.println(Arrays.toString(environment.getActiveProfiles()));
}
}
결과
***************************
APPLICATION FAILED TO START
***************************
Description:
Field bookRepository in com.example.demosping51.AppRunner required a bean of type 'com.example.demosping51.BookRepository' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.example.demosping51.BookRepository' in your configuration.
=>프로파일이 test인 경우에만 해당 설정파일을 실행하도록 했으므로, BookRepository 빈 주입 실패
프로파일 설정 방법
1. @Configuration @Profile("test")
vm option을 Dspring.profiles.activ="test"
결과
[default]
[test]
=> test를 프로파일로 설정 했으므로, BookRepository 빈 주입 성공
2. @Component @Profile("test")
@Repository
@Profile("test")
public class TestBookRepository implements BookRepository{
}
@Configuration
public class TestConfiguration {
@Bean
public BookRepository bookRepository(){
return new TestBookRepository();
}
}
프로파일 표현식
- Ex. @Profile("!prod")
- ! (not)
- & (and)
- | (or)
2. 프로퍼티
다양한 방벙으로 정의할 수 있는 설정 값으로, Environment의 역할은 프로퍼티 소스 설정 및 프로퍼티 값을 가져온다.
또한, 계층형으로 key-value 형태이다.
- getProperty()
프로퍼티의 우선 순위
- StandardServletEnvrionment의 우선순위
- ServletConfig 매개변수
- ServletContext 매개변수
- JNDI (java:comp/env/)
- JVM 시스템 프로퍼티(-Dkey="value")
- JVM 시스템 환경변수 (운영 체제 환경 변수)
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
결과
spring5
@PropertySource
Environment를 통해 프로퍼티를 추가하는 방법
app.properties 파일
app.name=spring
@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Demosping51Application {
public static void main(String[] args) {
SpringApplication.run(Demosping51Application.class, args);
}
}
classpath에 app.properties파일을 놓겠다는 의미
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
결과
spring5
=> but 이 방법보다 JVM 옵션이 우선순위가 더 높기 때문에 JVM에 설정한 프로퍼티로 출력이 된다.
또는
@Value
@Value("${app.name}")
String appName;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(appName);
}
결과
spring5
=> @Value를 사용하여 출력 가능
참고
스프링입문 강의 by 백기선
https://www.inflearn.com/course/lecture?courseSlug=spring&unitId=15538 https://www.inflearn.com/course/spring_revised_edition/dashboard
https://www.inflearn.com/course/spring_revised_edition/dashboard
'Spring > about spring' 카테고리의 다른 글
[IoC 컨테이너와 빈] ApplicationEvent Publisher (0) | 2023.07.24 |
---|---|
[IoC 컨테이너와 빈] MessageSource (0) | 2023.07.24 |
[IoC 컨테이너와 빈] 빈의 스코프 (0) | 2023.07.22 |
[IoC 컨테이너와 빈] @Component Scan (0) | 2023.07.22 |
[IoC 컨테이너와 빈] @Autowired (0) | 2023.07.22 |