· 약 9분 AI assisted

Autowiring Collaborators

Spring IoC Container (24편)
  1. Spring Framework Overview
  2. Core Technologies
  3. Container Overview
  4. Bean Overview
  5. Dependencies and Configuration in Detail
  6. Using depends-on
  7. Lazy-initialized Beans
  8. Method Injection
  9. Bean Scopes
  10. Customizing the Nature of a Bean
  11. Bean Definition Inheritance
  12. Container Extension Points
  13. Annotation-based Container Configuration
  14. Classpath Scanning and Managed Components
  15. Using JSR-330 Standard Annotations
  16. Basic Concepts: @Bean and @Configuration
  17. Using the @Bean Annotation
  18. Using the @Configuration annotation
  19. Instantiating the Spring Container by Using AnnotationConfigApplicationContext
  20. Autowiring Collaborators
  21. Environment Abstraction
  22. Registering a LoadTimeWeaver
  23. Additional Capabilities of the ApplicationContext
  24. The BeanFactory API
목차

원문: Autowiring Collaborators

전문 번역

Autowiring Collaborators (협력자 자동 와이어링)

Spring 컨테이너는 협력하는 빈(Bean) 간의 관계를 자동으로 와이어링(autowire)할 수 있다. ApplicationContext의 내용을 검사하여 빈에 대한 협력자(다른 빈)를 자동으로 Spring이 해결하도록 할 수 있다. 자동 와이어링에는 다음과 같은 장점이 있다:

  • 자동 와이어링은 프로퍼티(property) 또는 생성자 인자(constructor argument)를 명시해야 할 필요성을 크게 줄일 수 있다. (이 장의 다른 곳에서 논의된 빈 템플릿(bean template)과 같은 다른 메커니즘도 이러한 측면에서 가치가 있다.)

  • 자동 와이어링은 객체가 진화함에 따라 설정을 업데이트할 수 있다. 예를 들어, 클래스에 의존성을 추가해야 하는 경우, 설정을 수정할 필요 없이 해당 의존성이 자동으로 충족될 수 있다. 따라서 자동 와이어링은 개발 중에 특히 유용할 수 있으며, 코드 베이스가 더 안정화되면 명시적 와이어링(explicit wiring)으로 전환하는 옵션을 부정하지 않는다.

XML 기반 설정 메타데이터(Dependency Injection 참조)를 사용할 때, <bean/> 요소의 autowire 속성을 사용하여 빈 정의의 자동 와이어링 모드를 지정할 수 있다. 자동 와이어링 기능에는 네 가지 모드가 있다. 빈별로 자동 와이어링을 지정하므로 어떤 것을 자동 와이어링할지 선택할 수 있다. 다음 표는 네 가지 자동 와이어링 모드를 설명한다:

Table 1. Autowiring modes (자동 와이어링 모드)

Mode (모드)Explanation (설명)
no(기본값) 자동 와이어링 없음. 빈 참조는 ref 요소로 정의해야 한다. 기본 설정 변경은 더 큰 배포에는 권장되지 않는다. 왜냐하면 협력자를 명시적으로 지정하면 더 큰 제어와 명확성을 제공하기 때문이다. 어느 정도는 시스템의 구조를 문서화하는 역할을 한다.
byName프로퍼티 이름으로 자동 와이어링. Spring은 자동 와이어링이 필요한 프로퍼티와 동일한 이름을 가진 빈을 찾는다. 예를 들어, 빈 정의가 이름으로 자동 와이어링하도록 설정되어 있고 master 프로퍼티를 포함하는 경우(즉, setMaster(..) 메서드를 가지고 있는 경우), Spring은 master라는 이름의 빈 정의를 찾아서 프로퍼티를 설정하는 데 사용한다.
byType컨테이너에 프로퍼티 타입의 빈이 정확히 하나 존재하는 경우 프로퍼티가 자동 와이어링될 수 있도록 한다. 두 개 이상 존재하는 경우, 치명적인 예외가 발생하며, 이는 해당 빈에 대해 byType 자동 와이어링을 사용할 수 없음을 나타낸다. 일치하는 빈이 없으면 아무 일도 일어나지 않는다(프로퍼티가 설정되지 않음).
constructorbyType과 유사하지만 생성자 인자에 적용된다. 컨테이너에 생성자 인자 타입의 빈이 정확히 하나 존재하지 않으면 치명적인 오류가 발생한다.

byType 또는 constructor 자동 와이어링 모드를 사용하면 배열(array)과 타입이 지정된 컬렉션(typed collection)을 와이어링할 수 있다. 이러한 경우, 예상 타입과 일치하는 컨테이너 내의 모든 자동 와이어링 후보가 의존성을 충족하기 위해 제공된다. 예상 키 타입이 String인 경우 강력하게 타입이 지정된 Map 인스턴스를 자동 와이어링할 수 있다. 자동 와이어링된 Map 인스턴스의 값(value)은 예상 타입과 일치하는 모든 빈 인스턴스로 구성되며, Map 인스턴스의 키(key)는 해당 빈 이름을 포함한다.

Limitations and Disadvantages of Autowiring (자동 와이어링의 제한 사항 및 단점)

자동 와이어링은 프로젝트 전체에 일관되게 사용될 때 가장 잘 작동한다. 자동 와이어링이 일반적으로 사용되지 않는 경우, 한두 개의 빈 정의만 와이어링하는 데 사용하는 것은 개발자에게 혼란스러울 수 있다.

자동 와이어링의 제한 사항 및 단점을 고려하라:

  • propertyconstructor-arg 설정의 명시적 의존성은 항상 자동 와이어링을 재정의한다. 원시 타입(primitive), Strings, Classes(및 이러한 단순 프로퍼티의 배열)와 같은 단순 프로퍼티는 자동 와이어링할 수 없다. 이 제한은 의도된 설계이다.

  • 자동 와이어링은 명시적 와이어링보다 덜 정확하다. 앞의 표에서 언급했듯이, Spring은 예상치 못한 결과를 초래할 수 있는 모호성의 경우 추측을 피하도록 주의한다. Spring이 관리하는 객체 간의 관계는 더 이상 명시적으로 문서화되지 않는다.

  • 와이어링 정보는 Spring 컨테이너로부터 문서를 생성할 수 있는 도구에 사용할 수 없을 수 있다.

  • 컨테이너 내의 여러 빈 정의가 자동 와이어링될 setter 메서드 또는 생성자 인자에 의해 지정된 타입과 일치할 수 있다. 배열, 컬렉션 또는 Map 인스턴스의 경우, 이것이 반드시 문제는 아니다. 그러나 단일 값을 기대하는 의존성의 경우, 이 모호성은 임의로 해결되지 않는다. 고유한 빈 정의가 없으면 예외가 발생한다.

후자의 시나리오에서는 여러 옵션이 있다:

  • 명시적 와이어링을 선호하여 자동 와이어링을 포기한다.

  • 다음 섹션에 설명된 대로 autowire-candidate 속성을 false로 설정하여 빈 정의에 대한 자동 와이어링을 피한다.

  • <bean/> 요소의 primary 속성을 true로 설정하여 단일 빈 정의를 기본 후보로 지정한다.

  • Annotation-based Container Configuration에 설명된 대로 어노테이션 기반 설정으로 사용 가능한 더 세밀한 제어를 구현한다.

Excluding a Bean from Autowiring (빈을 자동 와이어링에서 제외하기)

빈별로 빈을 자동 와이어링에서 제외할 수 있다. Spring의 XML 형식에서는 <bean/> 요소의 autowire-candidate 속성을 false로 설정한다. @Bean 어노테이션의 경우, 속성 이름은 autowireCandidate이다. 컨테이너는 해당 특정 빈 정의를 @Autowired와 같은 어노테이션 기반 주입 지점을 포함하여 자동 와이어링 인프라에서 사용할 수 없게 만든다.

Note (참고)

autowire-candidate 속성은 타입 기반 자동 와이어링에만 영향을 주도록 설계되었다. 지정된 빈이 자동 와이어링 후보로 표시되지 않은 경우에도 해결되는 이름에 의한 명시적 참조에는 영향을 미치지 않는다. 결과적으로, 이름이 일치하면 이름에 의한 자동 와이어링은 그럼에도 불구하고 빈을 주입한다.

빈 이름에 대한 패턴 매칭을 기반으로 자동 와이어링 후보를 제한할 수도 있다. 최상위 <beans/> 요소는 default-autowire-candidates 속성 내에서 하나 이상의 패턴을 허용한다. 예를 들어, 이름이 Repository로 끝나는 빈으로 자동 와이어링 후보 상태를 제한하려면 *Repository 값을 제공한다. 여러 패턴을 제공하려면 쉼표로 구분된 목록으로 정의한다. 빈 정의의 autowire-candidate 속성에 대한 명시적 값 true 또는 false는 항상 우선한다. 이러한 빈의 경우, 패턴 매칭 규칙은 적용되지 않는다.

이러한 기술은 자동 와이어링에 의해 다른 빈에 주입되는 것을 원하지 않는 빈에 유용하다. 제외된 빈이 자동 와이어링을 사용하여 자체적으로 구성될 수 없다는 의미는 아니다. 오히려, 빈 자체가 다른 빈을 자동 와이어링하는 후보가 아니다.

Note (참고)

6.2부터 @Bean 메서드는 두 가지 변형의 자동 와이어링 후보 플래그를 지원한다: autowireCandidatedefaultCandidate.

qualifier를 사용할 때, defaultCandidate=false로 표시된 빈은 추가 qualifier 표시가 있는 주입 지점에서만 사용할 수 있다. 이것은 특정 영역에서 주입 가능해야 하지만 다른 곳에서 동일한 타입의 빈을 방해하지 않아야 하는 제한된 위임(delegate)에 유용하다. 이러한 빈은 선언된 타입만으로는 결코 주입되지 않으며, 오히려 타입과 특정 qualifier를 통해서만 주입된다.

반면에, autowireCandidate=false는 위에서 설명한 autowire-candidate 속성과 정확히 동일하게 동작한다: 이러한 빈은 타입으로는 전혀 주입되지 않는다.

공유

관련 글