6.Environment 프로파일, 프로퍼티

지금까진 빈과 빈을 등록하는 방법에 대해 알아봤는데 applicationContext에 대해 더 알아보겠다.

Environment

ApplicationContext는 빈 보관 외 다양한 기능을 갖고있는데 그 중 EnvironmentCapable(ApplicationContext가 EnvironmentCapable를 구현한다)는 두가지 기능을 제공하는 데 그 중 프로파일이라는 기능에 대해 알아보겠다.

프로파일: 빈들의 묶음이다. 어떤 환경을 의미한다. 즉 각각의 환경에 따라 다른 빈을 써야하는 경우 유용(ex. 테스트 서버에서는 a빈을 쓰겠다.)

TestConfiguration.java
1
2
3
4
5
6
7
8
9
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
public BookRepository bookRepository () {
return new TestBookRepository();
}
}

위처럼 할 경우 다른곳에서

1
2
@Autowired
BookRepository bookRepository;

위와같이 호출할 경우 BookRepository 빈을 못찾게 된다. 왜? test프로파일 일 때만 실행하도록 설정했기 때문(@Profile(“test”))

그렇다면 프로파일을 설정해보자
IDE에서 Active profile 설정을 줄 수 있다.
해당 옵션이 없으면
VM option에다 -Dspring.profiles.avtive=”test” 와 같이 주면 된다.

TestConfiguration 없이 빈에다 바로 프로파일 설정하는 방법은?
TestConfiguration방법은 불편하긴 하다. @profile를 붙여주자.

TestBookRepository.java
1
2
3
@Repository
@Profile("test")
public class TestBookRepository implements BookRepository {}

프로파일 표현식
! - not
& - and
| - or
위와같이 표현식을 쓸 수 있다.
@Profile(“!prod & test”) 일 경우 prod가 아니고 test인 경우에만 실행되는것이다.

다음과 같이 프로파일을 적용해 보며 확인해볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
@Autowired
ApplicationContext ctx;

@Autowired
BookRepository bookRepository;

public class AppRunner implements ApplicationRunner{
..run(){
Environment environment = ctx.getEnvironment();
print(environment.getActiveProfile);
}
}

Property

어플리케이션에 등록되어있는 키 밸류 쌍에 접근하는 것으로 계층형으로 접근한다. 프로퍼티는 여러가지 형태로 제공될 수 있는데 OS에 있는 환경변수, 자바 실행할 때의 -D로 넘겨주는 옵션, 서블릿 컨텍스트, 서블릿 콘텍스트 등에도 들어갈 수 있다.

Property 설정방법 1
vm 옵션으로 -Dapp.name=spring5 을 입력하자.

1
2
3
4
5
6
7
8
9
@Autowired
ApplicationContext ctx;

public class AppRunner implements ApplicationRunner{
...run(){
Environment environment = ctx.getEnvironment();
print(environment.getProperty("app.name"));
}
}

Property 설정방법 2
application.properties 파일 생성하고 app.name=spring 을 입력하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Demospring51Application
....
}

@Autowired
ApplicationContext ctx;

public class AppRunner implements ApplicationRunner{
...run(){
Environment environment = ctx.getEnvironment();
print(environment.getProperty("app.name"));
}
}

두 방법을 사용하여 app.name을 설정하여 출력할경우 누가 출력될까
vm 옵션이 이긴다.

아래처럼도 설정이 가능하다.

1
2
3
4
5
6
7
public class AppRunner implements ApplicationRunner{

@Value("${app.name}")
String appName;

...
}
Share