개요
스프링부트로 개발을 하면, 항상 여러 환경 속에서 개발을 하고 배포를 수행할 수 밖에 없다. 꼭 부트만이 아닌 모든 개발을 진행함에 있어서 아래의 환경은 항상 고려를 해야한다.
- local
내 컴퓨터 환경에서 수행 - develop
개발서버 환경에서 수행 - production
실제 운영서버 환경에서 수행 - test
테스트 서버 환경에서 수행 (qa 관련)
위와 같은 환경에서 서비스를 개발하다보면, 설정해놓은 database 나 server port 라던가 이러한 부분에 대해서 매번 조정을 하는 것은 번거로운 작업이다. ( 더 추가적인 부분이 있겠지만, 잘 모른다. ) 여튼 회사에 입사하고나서 이러한 부분을 크게 모르고 지내다가 이번에 이런게 있구나 싶어서 기록한다.
키워드
- spring.profile.active
- @Profile
- @Configuration
- @ActiveProfile
@Profile
해당 어노테이션은 @Configuration 과 같이 주석처리되는데, 일반적으로 IoC 컨테이너에 의해서 관리되는 Bean 을 만들고자 할 때, @Bean 어노테이션을 붙인다. 이 때 @Profile 을 통해서 만들고자 하는 Bean 을 분기처리하여 만들 수 있다. 예시를 바로 보자.
ClosetService (::Plain Old Java Object)
public class ClosetService {
String name;
public ClosetService(String name){
this.name = name;
}
public String getClosetName() {
return "closet Name is [" + name + "]";
}
}
일반적인 POJO 객체이다. 해당 객체를 Bean 으로 등록하려고 하는데 두 가지 경우을 고려해서 Bean 을 등록하려고 한다.
- dev 환경
- prod 환경
위의 두 환경에 따른 빈을 정의할 클래스가 필요하다.
DevConfiguration & ProdConfiguration
@Configuration
@Profile("dev")
public class DevConfiguration {
@Bean
public ClosetService closetService2() {
System.out.println("=====================================");
System.out.println("===== dev 환경에서 Bean 이 생성됩니다.");
System.out.println("=====================================");
return new ClosetService("dev");
}
}
@Configuration
@Profile("prod")
public class ProdConfiguration {
@Bean
public ClosetService closetService() {
System.out.println("=====================================");
System.out.println("===== prod 환경에서 Bean 이 생성됩니다.");
System.out.println("=====================================");
return new ClosetService("prod");
}
}
추가적으로 application.yml 파일에서 spring.profile.active 값을 설정해준다.
application.yml
spring:
profiles:
active: dev
spring.profiles.active
시스템 속성 또는 환경에 대해서 설정할 수 있다. 현재 스프링부트가 구동중인 환경이 ( dev | prod | test ) 에 대해 구별할 수 있음을 말한다. 모든 준비는 끝났고, 스프링부트를 실행하기 이전에 application.yml 의 active 값은 ( dev | prod ). 로 변경할 때마다 console 창에 출력되는 내용이 각각 다르게 나타남을 확인할 수 있다.
@ActiveProfile
해당 애노테이션은 테스트시에 활용할 수 있다. @SpringBootTest 를 통한 통합테스트시에 해당 애노테이션을 활용하여 ApplicationContext 가 로드되고, ApplicationContext 컨테이너 안에 빈이 등록되는 경우, @ActiveProfile 에 설정한 프로파일에 맞는 빈을 등록하는 것이다.
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("dev")
public class ConfigurationTest {
/**
* - @ActiveProfiles 는 application.yml 의 값을 따른다.
* - @ActiveProfiles 의 값이 "dev" 또는 "prod" 에 따라서 테스트에 출력되는 결과값은 다르다.
*/
@Autowired
private ClosetService closetService;
@Test
public void 환경설정_테스트() {
System.out.println(closetService.getClosetName());
}
}
+) ApplicationContext 란 ?
Bean Factory 를 확장한 IoC 컨테이너이다. 빈을 등록하고 관리하는 기본적인 기능은 Bean Factory 와 동일하다. Bean Factory 라고 부를 때는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고, ApplicationContext 라고 부를 때에는 애플리케이션 지원 기능을 모두 포함하는 것이다.
reference
https://www.baeldung.com/spring-profiles
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
'Spring' 카테고리의 다른 글
20191006 Request Payload & Form Data (SpringBoot & Vue) (0) | 2019.10.06 |
---|---|
20190925 ObjectMapper 싱글톤 설정 및 LocalDateTime 과의 관계. (0) | 2019.09.25 |
20190826 리버스 프록시 & nginx 이용 무중단배포 [여러가지 용어들] (0) | 2019.08.26 |
20190530 Server-Sent-Events (8) | 2019.06.05 |
20180705 properties 파일 사용기. (0) | 2018.07.05 |