[Spring][IoC] Environment, 프로파일 및 프로퍼티
2022. 9. 1. 17:22ㆍJAVA/Spring
1. 프로파일(Profile)이란 무엇인가?
- 프로파일은 빈(Bean)들의 그룹을 의미하는데 애플리케이션 실행시 프로파일을 설정하여 특정한 빈들의 그룹을 실행시킬 수도 있고 아니면 프로파일을 설정하지 않아서 런타임시 빈들을 활성화시키지 않을 수 있습니다.
- 예를 들어 테스트 환경에서는 A라는 빈을 사용하고, 배포환경에서는 A 빈을 사용하지 않고 싶다면 A 빈에 프로파일을 정의하여 배포시 비활성화 시킬 수 있습니다.
2. 프로파일 정의하기
프로파일을 정의하는 방법
- 클래스에 정의
- @Configuration @Profile("test")
- @Component @Profile("test")
- 메서드에 정의
- @Bean @Profile("test")
@Repository
@Profile("test") // 프로파일 정의 방법 3
public class BookRepository {
}
@Configuration
@Profile("test") // 프로파일 정의 방법1
public class TestConfiguration {
// 이 빈설정은 테스트 프로파일일때만 활성화되는 빈입니다.
@Bean
// @Profile("test") // 프로파일 정의 방법 2
public TestBookRepository testBookRepository(){
return new TestBookRepository();
}
}
3. 프로파일 설정하기
런타임 실행 환경에서 다음과 같이 프로파일을 설정하고 애플리케이션을 실행하면 특정환 환경에서 빈들을 활성화시킬 수 있습니다.
- 프로파일 설정 방법 1 : VM 옵션 입력창에 -Dspring.profiles.active="test, A, B, ...", 입력하고 실행
- 프로파일 설정 방법 2 : 인텔리제이 얼티메이트에서는 활성화된 프로파일 입력창에 활성화할 프로파일을 입력할 수 있습니다. 설정할 프로파일이 여러개라면 쉼표를 통해 구분할 수 있습니다. "test, A, B, ..."
테스트 코드는 다음과 같습니다.
@Repository
@Profile("test") // 프로파일 정의 방법 3
//@Profile("!prod") // 프로파일 설정이 prod가 아닌 경우에 이 빈을 활성화시킴
//@Profile("!prod && test") // 논리식 사용 가능
public class BookRepository {
}
public class TestBookRepository {
}
@Configuration
@Profile("test") // 프로파일 정의 방법1
public class TestConfiguration {
// 이 빈설정은 테스트 프로파일일때만 활성화되는 빈입니다.
@Bean
// @Profile("test") // 프로파일 정의 방법 2
public TestBookRepository testBookRepository(){
return new TestBookRepository();
}
}
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
TestBookRepository testBookRepository;
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
//given
Environment environment = ctx.getEnvironment();
//when
String[] activeProfiles = environment.getActiveProfiles();
String[] defaultProfiles = environment.getDefaultProfiles();
//then
System.out.println(Arrays.toString(activeProfiles)); // [test]
System.out.println(Arrays.toString(defaultProfiles)); // [default]
}
}
[test]
[default]
위 실행결과를 통해 활성화된 프로파일이 test인 것을 볼 수 있습니다.
4. 프로퍼티(Property)
*.properties 파일과 같은 곳에 설정 값을 저장해두고 Environemnt가 프로퍼티 소스를 설정하거나 가져올 수 있습니다.
프로퍼티 우선순위
- StandardServletEnvironment의 우선순위
- ServletConfig 매개변수
- ServletContext 매개변수
- JNDI(java:comp/env/)
- JVM 시스템 프로퍼티(-Dkey=”value”)
- JVM 시스템 환경 변수 (운영체제 환경변수)
@PropertySource
@PropertySource 어노테이션을 적용하여 프로퍼티 파일의 값을 가져올 수 있습니다.
@SpringBootApplication
@PropertySource(value = "classpath:/app.properties")
public class ProfileApplication {
public static void main(String[] args) {
SpringApplication.run(ProfileApplication.class, args);
}
}
app.properties
app.name=spring
테스트코드
@Component
public class AppRunner implements ApplicationRunner {
...
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name")); // output : spring
}
}
spring
References
source code : https://github.com/yonghwankim-dev/spring_study/tree/master/profile/src/main/java/kr/yh/profile
[인프런] 스프링 프레임워크 핵심기술
'JAVA > Spring' 카테고리의 다른 글
[Springboot] 내장 웹 서버(Embedded Web Servers) #1 (0) | 2022.09.23 |
---|---|
[Spring][IoC] MessageSource (0) | 2022.09.13 |
빈(Bean)의 스코프 (0) | 2022.08.31 |
[Spring][IoC] @Autowired 어노테이션 (0) | 2022.08.29 |
[springboot][Gradle] 자동 설정 만들기 #2 @ConfigurationProperties (0) | 2022.08.17 |