개요

스프링부트로 개발을 하면, 항상 여러 환경 속에서 개발을 하고 배포를 수행할 수 밖에 없다. 꼭 부트만이 아닌 모든 개발을 진행함에 있어서 아래의 환경은 항상 고려를 해야한다.

  • 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

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

Posted by doubler
,