Spring Ch 1. IoC 컨테이너(4) - Profile과 Property


Profile

  • 프로파일으로 런타임 환경을 설정할 수 있다.
  • 빈들을 하나의 환경으로 묶어 선언함으로서 테스트 환경에서 테스트를 수행하고 신속하게 배포 환경으로 전환할 수 있다.
  • @Component 어노테이션으로 등록된 빈들은 DefaultProfile에 존재한다.
  • @Profile 어노테이션으로 프로파일을 등록할 수 있고 !, &, |의 논리 설정을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@Profile("test")//클래스에 정의하여 프로파일 설정
public class TestConfiguration {
@Bean
@Profile("test")//메소드에 정의하여 프로파일 설정
public Repository epository() {
return new Repository();
}
}
@Repository
@Profile("!prod | test")//prod라는 환경이 아닐때 bean으로 등록
public class Repository {
}

Property

  • 프로퍼티는 다양한 방법으로 정의할 수 있는 키 값이다.
  • 변경 가능성이 있는 문자열을 클래스 내부 객체에 저장하여 사용할 경우 문자열을 수정하는 것만으로도 컴파일을 다시 해야하는 불편함이 존재한다.
  • 이때 별도의 파일이나 데이터베이스를 통해 프로퍼티를 설정하고 이를 프로그램에서 호출하도록 한다면 컴파일을 하지 않고 문자열을 수정할 수 있다.
  • 프로퍼티 설정을 위해 .properties 확장자 파일이 존재하며 Application 컴포넌트에서 @PropertySource 어노테이션을 통해 properties 파일에 저장된 프로퍼티 값을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
@PropertySource("classpath:/application.properties")//프로퍼티 파일을 불러온다.
public class AppRunner implements ApplicationRunner{
@Autowired
ApplicationContext ctx;
@Autowired
Repository repository;
@Value("${app.name}") //@Value로 환경 정보에 등록된 값을 찾아 주입한다. 지정된 값이 없을 경우 에러 발생.
String appName;
@Override
public void run(ApplicationArguments args) throws Exception{
//프로퍼티 값을 가져오기 위해 Environment 객체 사용
Environment environment = ctx.getEnvironment();
//Environment 객체에 저장된 app.name 프로퍼티를 얻는다.
System.out.println(environment.getProperty("app.name"));
System.out.println(appName);
}
}

프로퍼티의 우선순위

  • 프로퍼티는 다양한 방법으로 설정할 수 있는 만큼 우선순위가 높은 프로퍼티 설정 값을 사용한다.
  • 다음은 프로퍼티 우선순위이다.
  1. ServletConfig 매개변수
  2. ServletContext 매개변수
  3. JNDI (java:comp/env/)
  4. JVM 시스템 프로퍼티
  5. JVM 시스템 환경 변수
  6. 사용자 프로퍼티 설정 파일(properties 파일)

Eclipse 환경에서의 VM 속성 설정

  • Run > Run Configurations > 사용하는 애플리케이션 선택 > VM arguments의 Variables추가

댓글