매일 조금씩

[IoC 컨테이너와 빈] 6. Environment 1부. 프로파일 본문

Spring Framework/스프링 프레임워크 핵심 기술

[IoC 컨테이너와 빈] 6. Environment 1부. 프로파일

mezo 2024. 11. 17. 18:42
728x90
반응형

 

 

 

 

[전체 목차]

  1. IoC 컨테이너와 빈
  2. Resource / Validation
  3. 데이터 바인딩
  4. SpEL
  5. 스프링 AOP
  6. Null-Safety

 

 

 

 

 

ApplicationContext 는 실제로 아주 많은 인터페이스들을 상속 받고 있다.

EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory ... 등

그 중 하나 EnvironmentCapable의 기능들에 대해 알아보자.

 

 

1. ApplicationContext extends EnvironmentCapable

  • getEnvironment()

EnvironmentCapable이 제공하는 여러가지의 기능 중 하나인 프로파일에 대해서 알아볼 것이다.

 

 

2. 프로파일

  • 빈들의 그룹
  • Environment 의 역할은 프로파일 확인 및 설정

프로파일은 빈들의 묶음이다. Maven에도 프로파일이 있고, Spring에도 프로파일이 있는데 어떠한 환경이다.

예를 들어, 어떤 환경에선 어떤 빈들을 쓰겠다는 것.

 

 

3. 프로파일 유즈케이스

  • 테스트 환경에서는 A라는 빈을 사용하고, 배포 환경에서는 B라는 빈을 쓰고 싶다.
  • 이 빈은 모니터링 용도니까 테스트

각각의 환경에 따라 다른 빈들을 써야 되는 경우 또는 특정 환경에서만 어떤 빈을 등록해야하는 경우 등이 요구사항을 충족시키기 위해 프로파일이 추가됨. 이는 spring의 Environment를 통해서 사용할 수 있다.

ApplicationContextEnvironmentCapable를 상속받기 때문에

우린 ApplicationContextgetEnvironment()를 호출해서 Environment를 가져올 수 있다.

package com.test.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment env = ctx.getEnvironment();
        System.out.println(Arrays.toString(env.getActiveProfiles()));
        System.out.println(Arrays.toString(env.getDefaultProfiles()));
    }
}

 

 

4. 프로파일 정의하기

1) 클래스에 정의

  • @Configuration @Profile("test")
  • @Component @Profile("test")

아래와 같이 @Profile("test")로 설정을 하면,

test라는 프로파일로 애플리케이션을 실행하지 않으면 아래 빈 설정 파일이 적용되지않는다.

package com.test.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

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

2) 메소드에 정의

  • @Bean @Profile("test)

빈에다가 일일이 다 붙여줘야해서 불편할거다..

 

 

5. 프로파일 설정하기

  • Active Profiles: "test"
  • VM options: -Dspring.profiles.active="test,A,B,..."
  • @ActiveProfiles (테스트용)

 

 

6. 프로파일 표현식

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

 

 

 

728x90
반응형