본문 바로가기

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

4.5. 협력자들 Autowiring하기

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

 

 

스프링 컨테이너는 협력하는 bean들의 관계를 autowire할 수 있다. 스프링이 ApplicationContext의 내용물들을 훑어보면서, 자동적으로 협력자들 사이의 관계를 맺어주도록 할 수 있다. Autowiring은 다음의 장점들이 있다.

  • Autowiring은 프로퍼티와 생성자 매개변수들을 설정해줘야할 필요성을 크게 줄여준다(이 챕터에서 논의되는 'bean template' 같은 메커니즘들이 이와 관련하여 의미가 있다).

  • Autowiring은 객체들이 진화함에 따라 설정을 업데이트 시켜준다. 예를 들어, 만약 클래스에 의존성을 추가해야한다면, 그 의존성은 설정을 변경하지 않아도 자동적으로 만족된다. autowiring은 개발 중에 특히 유용하다. 코드들이 안정화되어갈 때, 명확한 wiring을 위해 선택지들을 무효화하는 일을 하지 않아도 되기 때문이다.

XML 기반의 설정 메타데이터를 사용할 때는 <bean/> 요소의 'autowire' 속성을 사용하여 autowire 모드를 설정할 수 있다. autowiring 기능은 4가지 모드가 있다. bean마다 autowiring을 설정할 수 있기 때문에 각각에 대해 어떤 bean을 autowire할 지 선택할 수 있다. 다음 테이블은 4가지 autowiring 모드에 대해 설명한다.

모드 설명
no 기본값인 'autowiring 없음'. bean 참조는 반드시 ref 요소를 통해 정의되어야만 한다. 큰 규모의 배포 시에는 이 기본 세팅을 바꾸지 않는 것을 권장한다. 왜냐하면 협력자들을 명확히 설정하는 것이 더 큰 제어능력과 명확함을 주기 때문이다. 명확한 설정은 어느정도 시스템 구조에 대해 시사하는 바가 있다.
byName 프로퍼티 이름을 통한 Autowiring. 스프링은 autowired되어야 하는 프로퍼티와 같은 이름의 bean을 찾는다. 예를 들어, 어떤 bean이 이름을 통해 autowire되도록 세팅되어있으며, 'master'라는 프로퍼티(setMaster()와 함께)를 포함하고 있다면  스프링은 'master'라는 이름의 bean을 찾아 프로퍼티를 세팅하는 데 사용한다.
byType 필요한 프로퍼티 타입과 일치하는 bean이 컨테이너에 딱 하나만 있을 때에는 프로퍼티를 통해 autowired 될 수 있다. 만약 둘 이상이 있다면 해당 bean에 대해서는 'byType'으로 autowiring을 할 수 없다는 내용의 심각한 예외가 발생한다. 만약 일치하는 bean이 없다면 프로퍼티는 세팅되지 않은 채 아무 일도 일어나지 않는다. 
constructor byType과 유사하지만 생성자 매개변수에 적용한다. 컨테이너에 생성자 매개변수의 타입과 일치하는 bean이 없다면 심각한 에러가 발생한다.

'byType'이나 'constructor' autowiring 모드를 통해, 배열과 typed 컬렉션을 wire할 수 있다. 그런 경우들에서는, 컨테이너 내에서 의존성을 만족시킬 수 있는 타입에 해당되는 모든 autowire 후보들이 제공된다. 만약 기대되는 키 타입이 String이라면, 엄격한 타입의 Map 인스턴스를 autowire할 수 있다. autowired된 Map의 인스턴스의 값들은 기대되는 타입과 일치하는 모든 bean 인스턴스들로 구성되어 있다. 그리고 그 Map 인스턴스들은 해당 bean들의 이름을 키로 가진다.