스프링 프로퍼티 값 설정 방법
DI를 통해 빈에 주입되는 것은 두가지가 존재한다. (다른 빈 오브젝트의 레퍼런스, 단순 값)
단순 값은 스프링이 관리하는 빈이 아닌 모든것을 의미한다.
@Value 애노테이션의 주요 용도는 자바 코드 외부의 리소스나 환경정보에 담긴 값을 사용하도록 지정해주는 데 있다.
@Value("#")
String username;
이 때는 database.username 속성이 정의된 database.properties파일을 XML에 지정해둬야 한다.
<context:property-placeholder location="classpath:database.properties"/>
스프링 프로퍼티 파일을 이용한 값 설정
설정정보를 XML로 분리해두면 빈 클래스나 의존관계 정보를 소스코드 수정 없이도 간단히 조작할 수 있다.
때로는 XML에서 다시 일부 설정정보를 별도의 파일로 분리해두면 유용할 때가 있다. 서버환경에 종속적인 정보가 있다면 이를 애플리케이션의 구성정보에서 분리하기 위해서다. (로컬, 개발, 운영에 대한 DB정보가 다를때)
프로퍼티 파일에서 설정 값을 분리하면 얻을 수 있는 장점은 @Value를 효과적으로 사용할 수 있다는 점이다.
@Value는 소스코드 안에 포함되는 애노테이션이어서 값을 수정하면 매번 새로 컴파일해야한다. 하지만 @Value에서 프로퍼티 파일의 내용을 참조하게 해주면 소스코드의 수정 없이 @Value를 통해 프로퍼티에 주입되는 값을 변경할 수 있다.
프로퍼티 파일을 이용해서 값을 주입하는 방법은 2가지가 존재한다.
일단, 아래처럼 database.properties 파일이 있다고 가정해보자.
1. 수동변환 : PropertyPlaceHolderConfigurer
첫 번째는 프로퍼티 치환자(placeholder)를 이용하는 방법이다.
프로퍼티 치환자는 프로퍼티 파일의 키 값을 ${ }안에 넣어서 만들어 준다. 이렇게 만들어진 치환자를 value 애트리뷰트에 넣어준다.
1
2
3
4
|
<bean id="dataSource" class="...DataSource">
<property name="driverClass" value="$"/>
...
</bean>
|
cs |
다음은 context 네임스페이스의 property-placeholder 태그를 추가하고 앞에서 만든 프로퍼티 파일의 위치를 지정한다.
1
|
<context:property-placeholder location="classpath:database.properties"/>
|
cs |
이제 스프링 컨테이너는 초기화 작업 중에 database.properties 파일을 읽고, 각 키에 ${ }을 붙인 값과 동일한 value를 찾아서 프로퍼티 파일에 정해둔 값으로 바꿔치기 한다.
이런 치환은 <context:property-placeholder>태그에 의해 자동으로 등록되는 PropertyPlaceHolderConfigurer 빈이 담당한다. (빈 팩토리 후처리기)
=> 수동방식이기 때문에 만약에 프로퍼티에 $가 없으면 driverClass value에 $가 그대로 들어가게 된다. 치환자의 값이 변경되지 않더라도 예외가 발생하지 않는다.
2. 능동 변환 : SpEL
두 번째는 SpEL(Spring Expression Language)를 이용하는 방법이다.
빈 팩토리 후처리기에서 치환을 해주는 수동적인 방법과 달리, 빈 오브젝트에 직접 접근할 수 있는 표현식을 이용해 원하는 프로퍼티 값을 능동적으로 가져오는 방법이다. (스프링 3.0 에서 소개됨)
SpEL은 다른 빈의 프로퍼티에 접근, 메소드 호출, 다양한 연산도 지원하며 클래스 정보에도 접근할 수 있다. (생성자를 호출해서 오브젝트를 만들 수도 있음)
<util:properties> 태그를 이용하면 프로퍼티 파일을 읽어서 Properties 타입의 빈으로 만들 수 있다.
1
|
<util:properties id="database" location="classpath:database.properties"/>
|
cs |
<context:property-placeholder> 처럼 빈 팩토리 후처리기로 동작해서 빈의 값을 변경하는 것이 아니라, 단순히 프로퍼티 파일의 내용을 담은 Properties 타입의 빈을 만들어 준다.
이렇게 database.properties의 내용을 빈으로 만들어두고, dataSource 빈에서는 SpEL을 이용해서 database 빈 오브젝트에서 원하는 정보를 읽어오게 한다. (SpEL에서는 Map의 get() 메소드를 호출해주는 표현식이 존재하는데, []안에 키 값을 넣어주면 된다.)
1
2
3
4
5
|
<bean id="dataSource" class="..DataSource">
<!-- database 빈 오브젝트에서 db.driverclass를 키로 갖는 값을 가져오라는 표현식 -->
<property name="driverClass" value="#"/>
...
</bean>
|
cs |
@Value("#") 로도 가능하다.
(출처 : 토비의 스프링)
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 빈(bean)생명주기 메소드 (0) | 2018.09.09 |
---|---|
[Spring] 컨테이너가 자동등록하는 빈 (0) | 2018.09.07 |
[Spring] IoC(InversionOfControl) 컨테이너 6 (빈 등록 메타정보 구성 전략) (0) | 2018.08.28 |
[Spring] IoC(InversionOfControl) 컨테이너 5 (빈 등록방법) (0) | 2018.08.27 |
[Spring] IoC(InversionOfControl) 컨테이너 4 (0) | 2018.08.27 |