Autowiring Collaborators(한글)

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

  • Autowiring을 사용하면 속성이나 생성자 인수를 지정할 필요성을 크게 줄일 수 있습니다. (이 장의 다른 곳에서 설명하는 Bean 템플릿과 같은 다른 메커니즘도 이와 관련하여 유용합니다.).

  • Autowiring은 객체가 진화함에 따라 구성을 업데이트할 수 있습니다. 예를 들어 클래스에 종속성을 추가해야 하는 경우 구성을 수정할 필요 없이 해당 종속성을 자동으로 충족시킬 수 있습니다. 따라서 Autowiring은 코드 기반이 안정화되면 명시적 연결로 전환하는 옵션을 부정하지 않으면서 개발 중에 특히 유용할 수 있습니다.

XML 기반 구성 메타데이터를 사용하는 경우(의존성 주입 참조), <bean/> 요소의 autowire 속성을 사용하여 Bean 정의에 대한 Autowiring 모드를 지정할 수 있습니다. Autowiring 기능에는 네 가지 모드가 있습니다. Bean별로 Autowiring을 지정하여 어떤 것을 자동 와이어링할지 선택할 수 있습니다. 다음 표에서는 네 가지 Autowiring 모드에 대해 설명합니다:

Table 1. Autowiring modes
Mode Explanation

no

(기본값) No Autowiring. Bean 참조는 ref 요소로 정의해야 합니다. 협업자를 명시적으로 지정하면 제어 및 명확성이 향상되므로 대규모 배포의 경우 기본 설정을 변경하지 않는 것이 좋습니다. 어느 정도는 시스템의 구조를 문서화합니다.

byName

속성 이름별 Autowiring. Spring은 Autowiring이 필요한 프로퍼티와 이름이 같은 Bean을 찾습니다. 예를 들어, 이름별로 Autowiring이 설정된 Bean 정의에 master 속성이 포함된 경우(즉, setMaster(..) 메서드가 있는 경우) Spring은 master 라는 이름의 Bean 정의를 찾아서 속성을 설정하는 데 사용합니다.

byType

컨테이너에 속성 유형의 Bean이 정확히 하나만 존재하는 경우 속성을 Autowiring할 수 있습니다. 둘 이상 존재하면 치명적인 예외가 발생하며, 이는 해당 Bean에 대해 byType Autowiring을 사용할 수 없음을 나타냅니다. 일치하는 Bean이 없으면 아무 일도 일어나지 않습니다(프로퍼티가 설정되지 않음).

constructor

byType 과 유사하지만 생성자 인자에 적용됩니다. 컨테이너에 생성자 인자 타입의 Bean이 정확히 하나도 없으면 치명적인 에러가 발생합니다.

byType 또는 constructor Autowiring 모드를 사용하면 배열과 타입이 지정된 컬렉션을 연결할 수 있습니다. 이러한 경우 컨테이너 내에서 예상 유형과 일치하는 모든 Autowiring 후보가 종속성을 충족하기 위해 제공됩니다. 예상 키 유형이 String`인 경우 강력하게 유형화된 `Map 인스턴스를 Autowiring할 수 있습니다. Autowiring된 Map 인스턴스의 값은 예상 유형과 일치하는 모든 Bean 인스턴스로 구성되며, Map 인스턴스의 키에는 해당 Bean 이름이 포함됩니다.

Autowiring의 한계와 단점(Limitations and Disadvantages of Autowiring)

Autowiring은 프로젝트 전체에서 일관되게 사용할 때 가장 효과적입니다. 일반적으로 Autowiring을 사용하지 않는 경우 개발자가 한두 개의 Bean 정의만 연결하는 데 사용하는 것은 혼란스러울 수 있습니다.

Autowiring의 한계와 단점을 고려하세요:

  • 명시적 종속성 propertyconstructor-arg 설정은 항상 Autowiring을 재정의합니다. (역자설명 : 원시적인)프리미티브, Strings, Class(및 이러한 단순 프로퍼티의 배열)와 같은 단순 프로퍼티는 Autowiring할 수 없습니다. 이 제한은 설계상입니다.

  • Autowiring은 명시적 연결보다 정확도가 떨어집니다. 하지만 앞의 표에서 언급했듯이 Spring은 모호한 경우 예기치 않은 결과를 초래할 수 있는 추측을 피하기 위해 주의를 기울입니다. Spring에서 관리되는 객체 간의 관계는 더 이상 명시적으로 문서화되지 않습니다.

  • Spring 컨테이너에서 문서를 생성할 수 있는 도구에서 연결 정보를 사용하지 못할 수 있습니다.

  • 컨테이너 내의 여러 Bean 정의가 설정자 메서드 또는 생성자 인수에 의해 지정된 유형과 일치할 수 있으며 Autowiring될 수 있습니다. 배열, 컬렉션 또는 Map 인스턴스의 경우 이것이 반드시 문제가 되는 것은 아닙니다. 그러나 단일 값을 기대하는 종속성의 경우 이러한 모호성이 임의로 해결되지 않습니다. 고유한 Bean 정의를 사용할 수 없는 경우 예외가 발생합니다.

후자의 시나리오에서는 몇 가지 옵션이 있습니다:

  • 명시적 연결을 위해 Autowiring을 포기합니다.

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

  • 해당 <bean/> 요소의 primary 속성을 `true`로 설정하여 단일 Bean 정의를 기본 후보로 지정합니다.

  • 어노테이션 기반 컨테이너 구성에 설명된 대로 어노테이션 기반 구성에서 사용할 수 있는 보다 세분화된 제어를 구현합니다.

Autowiring에서 Bean 제외시키기(Excluding a Bean from Autowiring)

Bean 단위로 Autowiring에서 Bean을 제외할 수 있습니다. Spring의 XML 형식에서 <bean/> 요소의 autowire-candidate 속성을 false 로 설정합니다. 컨테이너는 해당 특정 Bean 정의를 Autowiring 인프라에서 사용할 수 없게 만듭니다(@Autowired 등의 어노테이션 스타일 구성 포함).

참고: autowire-candidate 속성은 유형 기반 Autowiring에만 영향을 주도록 설계되었습니다. 이름에 의한 명시적 참조에는 영향을 미치지 않으며, 지정된 Bean이 Autowiring 후보로 표시되지 않더라도 해결됩니다. 따라서 이름별 Autowiring은 이름이 일치하는 경우 Bean을 주입합니다.

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

이러한 기법은 Autowiring을 통해 다른 Bean에 주입하지 않으려는 Bean에 유용합니다. 그렇다고 해서 제외된 Bean 자체를 Autowiring을 사용하여 구성할 수 없다는 의미는 아닙니다. 오히려 Bean 자체는 다른 Bean을 Autowiring할 수 있는 후보가 아닙니다.