스프링이 제공하는 environment abstraction(환경 추상화)이란 무엇인가?
애플리케이션이 동작하는 환경은 목적이나 사용자에 따라서 조금씩 다르다. 스프링은 동작 환경에 맞춰서 코드를 매번 수정하지 않더라도, 애플리케이션의 구성 설정을 바꿀 수 있는 매커니즘을 제공한다.
어떤 빈들을 사용할 것인지 프로파일(또는 프로필)이라 부르는 애노테이션을 이용해서 이름을 지정해주면, 특정 조건을 만족하는 프로파일일 때만 빈들이 생성되거나 무시되도록 구성이 가능하다.
프로파일 말고 스프링에서 환경 추상화에서 중요한 축을 담당하는 게 Property(프로퍼티) 값을 읽어오는 것이다. 애플리케이션의 프로퍼티라 하면 다양한 것들이 떠오를 수 있다. 커멘드 라인 명령에서 뒤에 argument에 값을 지정한다거나, 환경 변수, 클라우드의 중앙화된 설정값을 사용하기도 한다.
스프링은 자바, 서블릿에 존재하는 다양한 방법으로 접근이 가능한 프로퍼티티를 environment라는 것으로 단일화(추상화) 해 놓았다.
스프링이 제공하는 environment는 크게 3가지로 나눌 수 있다.
자주 사용하는 것들의 적용되는 순위를 살펴보면 아래와 같다.(숫자가 작을수록 우선순위 높음)
System Properties
System Environment Variables
_
) 을 조합해서 만든다.application.properties(xml, yml)
// application.properties
my.name=ApplicationProperties
application.properties
에 기본이 되는 값을 넣고, System Properties로 디테일하게 환경 변수 값을 조절하는게 대표적인 사용 패턴이다.
스프링의 기본 빈으로 등록되는 Environment
타입의 객체에서 .getProperty({설정이름})
으로 가져올 수 있다.
public void method(Environment env){
String contextPath = env.getProperty("contextPath");
String port = env.getProperty("port");
}
또는 아래와 같이 빈(Bean) 클래스 필드에서 값을 주입받을 수 있다.
@Value("${contextPath}")
String contextPath;
@Value("${port:8080}") // "${ {이름}:{디폴트값} }"
int port; // 자동 컨버팅
만약 사용자가 “property.name”의 설정값을 사용하고 싶다면, 스프링에서는 아래 4가지의 설정을 모두 찾아본다.
reference
해당 게시물은 인프런 - 토비의 스프링 부트 이해와 원리을 기반으로 작성되었습니다.
강의 내용을 축약하고 생략한 부분도 많기 때문에, 게시물만으로 해당 개념을 이해하지 못할 수 있습니다.
스프링 부트를 사용하시는 분들에게 해당 강의를 적극적으로 추천합니다.