본문 바로가기

SpringFramework Core - I. IoC 컨테이너/4. 의존성

4.2.2. idref 요소

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-idref-element

 

 

idref 요소는 다른 bean의 id를 <constructor-arg/>나 <property/> 요소로 에러 없이 전달할 수 있게 해주는 간단한 방법이다. 다음 예시는 그 사용법을 보여준다.

<bean id="theTargetBean" class="..." />

<bean id="theClientBean" class="..." />
    <property name="targetName">
        <idref bean="theTargetBean" />
    </property>
</bean>

위의 bean 정의 부분은 다음의 예시의 bean 정의 부분과 (런타임 동안에는) 정확히 동일하다.

<bean id="theTargetBean" class="..." />

<bean id="client" class="...">
    <property name="targetName" value="theTargetBean" />
</bean>

전자의 방식이 후자의 방식보다 더 낫다. 왜냐하면 idref 태그를 사용하는 것은 컨테이너로 하여금 배포 시점에, 참조된 bean이 실제로 존재하는지 유효성을 검사하게 만들기 때문이다. 후자에서는, 클라이언트 bean의 프로퍼티인 targetName에 값이 전달될 때에 아무런 유효성 검사가 이루어지지 않는다. 보통 심각한 결과를 초래하는 오류들은 클라이언트 bean이 실제로 인스턴스화될 때에서야 발견된다. 만약 클라이언트 bean이 프로토타입 bean이라면 이 오류와 그에 따르는 예외는 컨테이너가 배포까지 되고 나서야 발견될 것이다.

 

idref 요소의 local 속성은 4.0 beans XSD에서는 더 이상 지원되지 않는다. 보통의 bean 참조에 더 이상 값을 제공하지 않기 때문이다. idref local 참조들이 있다면 4.0 스키마로 업그레이드할 때 모두 idref bean으로 변경해줘야 한다.

 

최소한 스프링 2.0 이전 버전들에서는, ProxyFactoryBean의 bean 정의 내에 있던 AOP 인터셉터 설정에서 <idref/> 요소가 값을 가져오는 일이 흔했다. 인터셉터 이름을 특정할 때 <idref/> 요소를 사용하면 인터셉터 ID의 오탈자를 예방해준다.