[스프링 프레임워크 핵심기술] IoC 컨테이너 : Environment 프로파일 & 프로퍼티

Dayeon myeong·2021년 3월 17일
0

ApplicationContext는 BeanFactory 기능 이외에 Environment 기능이 있다.

  • ApplicationContext extends EnvironmentCapable

ApplicationContext는 EnvironmentCapable을 상속받아 Environment 기능이 사용이 가능한 것인데, 이 것에는 크게 2가지 기능이 있다.
1. 프로파일
2. 프로퍼티

프로파일

프로파일이란 빈들의 묶음을 말한다.

Environment은 활성화할 프로파일을 확인하고 설정해주는 것이다.

어떤 환경에서는 어떤 빈들을 쓰겠다, 각각의 환경에따라 다른 빈을 사용하는 경우 혹은 특정 환경에서 특정 빈을 사용해야 하는 경우 이런 경우에 프로파일 기능을 사용한다.

프로파일 설정을 따로 하지 않으면 default 프로파일에 해당한다. 직접 생성한 Bean들도 따로 어떤 프로파일에 들어가는지 설정하지 않았으면 전부 defualt 프로파일에 속한다.

Bean에 직접 프로파일을 설정하려면 @Profile("프로파일명")형식으로 지정해준다.

public interface BookRepository {

}

public class TestBookRepository implements BookRepository {

}

@Component
public class AppRunner implements ApplicationRunner {

  @Autowired
  ApplicationContext ctx;
  
  @Autowired
  BookRepository bookRepoistory; // test 프로파일이 아니니 빈 주입 못받음
	
  @Override
  public void run(ApplicationArguments args) throws Exception {
	  Environment environment = ctx.getEnvironment();
  	 					       System.out.println(Arrays.toString(environment.getDefualtProfiles()));
  }
}

test 프로파일일 때만 해당 TestConfiguration 빈 설정 파일이 사용된다. test 프로파일 경우가 아닐 경우에는 당연히 BookRepository를 주입 받을 수 없다.

프로파일을 설정/적용하는 방법은
인텔리제이 active profile에 test 설정을 해주면 된다.
1. active profile : test 설정
2. -Dspring.profiles.active="test" 설정 ( -Dspring.profiles.active="프로파일명1, 프로파일명2...")

프로파일 정의방법

  • 메소드 정의 : @Bean @Profile("test")
  • 클래스 정의1 : @Configuration @Profile("test")
  • 클래스 정의2 : @Component @Profile("test")

을 한 후 설정에서
-Dspring.profiles.active="test" 을 설정하면 컴포넌트 스캔으로 등록되는 빈에도 프로파일을 정의할 수 있다.

프로파일 표현식

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

@Profile("!prod")란 의미는 prod 프로파일이 아닌 경우 사용되는 프로파일이다.(defualt도 당연히 사용 가능하다.)

@Profile("!prod & test")는 prod 프로파일이 아니고, test 프로파일인 경우에 사용되는 프로파일이다.

프로퍼티

Environment가 제공하는 두 번째 기능, 프로퍼티.

어플리케이션에 등록되어 있는 여러 key-value로 제공되는 프로퍼티에 접근할 수 있는 기능이다.

프로퍼티란 다양한 방법으로 정의할 수 있는 설정값으로 environment는 프로퍼티 소스 설정 및 프로퍼티 값을 가져올 수 있다. (key/value쌍으로 되어있는 프로퍼티가 계층형으로 우선순위가 있게 정리되어있다.)

vm options에
-Dapp.name=spring5라고 준다면,(jvm 시스템 프로퍼티 경우)

이 프로퍼티에 접근하기 위해서

Environtmnet environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));// spring5 출력

위와 같이 접근 가능하다.

이 방식 말고도 @PropertySource를 사용하여 app.properties 파일을 참조하는 방식도 있다.

app.about = spring이란 app.properties 파일이 있을 때,
@Configuration 어노테이션이 있는 클래스에서

@PropertySource("classpath:/app.properties")를 통해 프로퍼티를 접근가능하다.

프로퍼티에는 우선 순위가 있는데,
위의 2가지 경우에서( jvm 시스템 프로퍼티 경우, propertysource 경우) 는 vm 옵션(jvm 시스템 프로퍼티 경우)이 더 우선순위가 높다.

추가적으로

스프링 부트의 경우

@Vale("${app.name}") // key 에 해당되는 값
Spring appName; 

처럼 사용가능하다.

profile
부족함을 당당히 마주하는 용기

0개의 댓글