스프링 프레임워크 Environment profile, property 설정
22 Feb 2022백기선님의 ‘스프링 프레임워크 핵심 기술’ 강의 정리
Profile
- ApplicationContext가 상속받는 인터페이스 중에
EnvironmentCapable
- 프로파일과 프로퍼티를 다루는 인터페이스
- 프로파일
- 빈의 그룹
- Environment의 역할은 활성화할 프로파일 확인 및 설정
- 프로파일 사용
- 테스트 환경에서는 A 빈을 쓰지만, 배포 환경에서는 B 빈을 쓰고 싶을 때
- 테스트 할 때는 필요 없는 빈이지만 배포할 때는 등록되어야 할 때
- 특정 환경에서만 빈을 등록해야 하는 경우
- 각각의 환경마다 다른 빈을 사용하는 경우
- 정의하기
- 클래스에 정의
@Configuration @Profile("test")
@Component @Profile("test")
- 메소드에 정의
@Bean @Profile("test")
- 클래스에 정의
- 설정
-Dspring.profiles.active="test"
- 표현
!
(not)&
(and)|
(or)
BookRepository 인터페이스와 이를 구현하는 TestBookRepository 클래스를 생성한다. 그리고 TestConfiguration에서 test라는 프로파일을 설정해주고 빈을 주입해주도록 한다.
// BookRepository
public interface BookRepository {
}
// TestBookRepository
public class TestBookRepository implements BookRepository {
}
// TestConfiguration
@Configuration
@Profile("test")
public class TestConfiguration {
@Bean
public BookRepository bookRepository() {
return new TestBookRepository();
}
}
TestConfiguration은 테스트 프로파일일때만 BookRepository 빈을 주입해준다. 그렇기 때문에 아래의 코드처럼 BookRepository를 @Autowired를 통해 주입 받으려고 하면 에러가 발생한다. ‘Consider defining a bean of type ‘BookRepository’ in your configuration’이라는 에러 문구에서도 확인할 수 있다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
}
프로파일을 설정하기 위해서는 Edit Configurations
에 들어간다. Ultimate 버전을 사용하고 있다면 Active profiles
에 위에서 설정한 프로파일 값인 test를 넣어주면 된다. Community 버전일 경우에는 Modify options
- Add VM options
를 선택해서 VM 옵션을 추가할 수 있는 칸이 생기면 -Dspring.profiles.active="test"
이렇게 추가해주도록 한다. 그런 후에 다시 어플리케이션을 실행하면 에러메세지 없이 실행된다.
configuration 파일에서 설정하지 않고 클래스 자체에서 등록할수도 있다. TestBookRepository에 컨포넌트 스캔의 대상이 될 수 있도록 @Repository 어노테이션을 추가하고 @Profile 어노테이션도 추가해주도록 한다.
@Repository
@Profile("test")
public class TestBookRepository implements BookRepository {
}
프로파일을 설정할 때 !, &, | 을 이용해서 지정할 수도 있다. !prod는 prod가 아닌 모든 프로파일, !prod & test는 prod가 아니고 test일 경우로 생각하면 된다. 복잡하게 쓰는 것보다 간단한 것이 가장 좋으니 프로파일 설정은 최대한 간단하게 하도록 한다. |
Property
- property
- 다양한 방법으로 정의할 수 있는 설정값
Environment
의 역할이 프로퍼티 소스 설정과 값을 가져오는 것
- 우선순위
- StandardServletEnvironment 우선순위
- ServletConfig 매개변수
- ServletContext 매개변수
- JNDI (java.comp/env/)
- JVM 시스템 프러퍼티 (-Dkey=”value”)
- JVM 시스템 환경 변수 (운영 체제 환경 변수)
- StandardServletEnvironment 우선순위
@PropertySource
- Environment를 통해 프로퍼티 추가
- 스프링 부트의 외부 설정
- 기본 프로퍼티 소스 지원 (application.properties)
- 프로팔일까지 고려한 계층형 프로퍼티 우선 순위 제공
프로파일을 설정했던 것처럼 프로퍼티도 Run/Debug Configurations
- VM Options
에서 설정할 수 있다. -Dapp.name=spring5
라는 값을 넣고 AppRunner에서 확인해보도록 한다. 앱을 실행하면 spring5가 출력되는 것을 확인할 수 있다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
VM Options에 설정하는 방법 말고도 이미 익숙하게 프로퍼티를 설정하는 방법이 있다. 스프링 앱을 생성하면 resources 폴더에 application.properties라는 파일이 있다. 지금은 테스트를 위해서 app.properties를 만들어보도록 한다.
app.about=spring
프로퍼티 파일을 생성했으니 스프링 앱에도 추가해줘야 한다. 그 다음 AppRunner에서 app.about을 출력하도록 하면 프로퍼티 파일에 추가한 값을 확인할 수 있다.
@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class SpringCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCoreApplication.class, args);
}
}
프로퍼티 파일과 VM Options 값이 같을 경우에는 하나의 값만 나오게 될텐데 어떤 설정이 우선순위가 높을까? 프로퍼티 파일을 VM Options와 같도록 app.name으로 바꿔주고 값을 구분되게 변경한 후 앱을 실행해보면 VM Options 값이 출력되는 것을 알 수 있다.