육감적 코딩

Environment 1부. 프로파일 본문

정리/Spring

Environment 1부. 프로파일

감감감감감감 2020. 8. 12. 20:39

여태까지 빈과 빈을 등록하는 방법에 대해 알아보았습니다.

다시 애플리케이션 컨텍스트로 돌아가서, 애플리케이션 컨텍스트가 가진 기능들을 구체적으로 알아보겠습니다.

Environment

애플리케이션 컨텍스트는 빈팩토리 기능만 하는것은 아닙니다.

여러가지 다른 기능들을 가지고있습니다.

ApplicationContext 인터페이스를 살펴보면

많은 인터페이스를 상속하고 있는걸 볼 수 있습니다.

그 중 이번에 알아볼 내용은 EnvironmentCapable 입니다

EnvironmentCapable

EnnvironmentCapable은 크게 두 가지 기능으로 나누어 볼 수있습니다.

그 중 하나인 프로파일에 대해 알아보겠습니다.

 

프로파일

간단히 설명하면 프로파일은 환경입니다. 혹은 빈들의 그룹으로 볼 수 있습니다.

테스트 환경에선 이러한 설정을 쓰겠다. 실제 환경에선 이렇게 쓰겠다. 즉, 특정 환경에선 이런 빈을 등록하겠다. 라고 말 할 수있습니다.

Environment는 ApplicaitionContext의 getEnvironment()로 가져올 수 있습니다. 내용을 살펴보면

getEnvironment는 EnvironmentCapable에서 온 걸 확인할 수 있습니다.

ApplicaitionContext가 EnvironmentCapable 을 상속받았기 때문에 우리는 getEnvironment 를 통해서 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.getActiveProfiles()));

    }
}

그리고 getActiveProfiles() 를통해 현재 액티브되어있는 프로파일들이 무엇이있는지 출력해볼 수 있습니다.

현재 아무것도 설정하지 않았기 때문에 아무것도 찍히지않습니다.

모든 프로파일에 공통으로 적용되는 프로파일 확인을 위해 defaultProfiles를 가져와 봅시다.

System.out.println(Arrays.toString(environment.getDefaultProfiles()));

우리가 선언한 빈 들도(Single, Proto 등등) 다 default 프로파일에 들어가 있는 빈들로 볼 수 있습니다.

그럼 일단 클래스 파일로 빼서 따로 프로파일을 설정하는 법에 대해 알아보겠습니다.

@Configuration
@Profile("test")
public class TestConfiguration {
        @Bean
    public BookRepository bookRepository(){
        return new TestBookRepository();
    }
}

@Profile("test") 의 의미는 test라는 프로파일로 이 애플리케이션을 실행하기 전까지는 해당 클래스의 내용이 적용되지않습니다.

즉, test라는 프로파일로 애플리케이션을 실행할 떈 TestBookRepository를 리턴합니다.

public interface BookRepository {
}
@Repository
public class TestBookRepository implements BookRepository{
}

확인을 위해 AppRunner 클래스에 BookRepository를 Autowired 받아 봅시다.

@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.getActiveProfiles()));
        System.out.println(Arrays.toString(environment.getDefaultProfiles()));
    }
}

test 프로파일로 애플리케이션이 실행된게 아니므로 예상했던 BookRepository에 주입이 되지않고 에러를 확인 할 수 있습니다.

프로파일 설정하는 법 1.

오른쪽 상단의 SpringdemoApplication(이름은 다를 수 있음) 을 눌러 EditConfigurations... 를 누르면

Run/Debug Configurations 창을 킬 수 있습니다.

여기서 VM options 에 -Dspring.profiles.active="(적용할 프로퍼티)" 을 넣어주고 Active profiles 에 적용할 프로퍼티 를 넣어주면됩니다.

프로퍼티를 적용하고 실행을 해보면,

test 프로퍼티가 적용된 걸 확인할 수 있습니다.

이렇게 프로퍼티를 설정 할 수도 있지만 역시 번거로움을 지울 수 없습니다.

또 다른 프로퍼티 설정법에대해 알아보겠습니다.

프로퍼티 설정하는 법 2.

Configuration 클래스를 만들고 빈들을 일일이 등록하는 일은 번거롭습니다.

간단하게, @Profile 애노테이션을 사용해 봅시다.

기존의 Configuration 클래스를 삭제해주고, Repository로 등록한 TestBookRepository에 @Profile 애노테이션만 추가해 주면 됩니다.

@Repository
@Profile("test")
public class TestBookRepository implements BookRepository{
}

기존의 VM옵션은 유지해 주시면됩니다.

이렇게 Component 빈에 포함된 빈들을 Profile에 등록해줄 수 있습니다.

추가로 프로파일 @Profile("test") 사용할 수 있는 간단한 표현식이 존재합니다.

예를들어 @Profile("!prod") 라고 한다면 "prod" 가 아닌 프로파일에 적용된다는 표현입니다. (test 프로파일은 !prod 이기 때문에 적용)

프로파일 표현식

  • ! (not)
  • & (and)
  • | (or)
Comments