어노테이션을 사용하지 않고, xml에서 autowire 지시자를 통한 의존성 주입을 위해서는
해당 클래스에 주입을 원하는 변수의 setter 메소드가 반드시 존재해야 한다.
(어노테이션을 사용할 경우 setter 메소드가 별도로 필요하지 않다.)


대부분의 서적이나 인터넷 자료들을 보면 이러한 setter메소드의 필요성은 누락하고
autowire의 옵션별 설명만을 서술한다. 이러한 서술자료를 보면 아래와 같다.


autowire 옵션
 - byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정
 - byType : 프로퍼티의 타입과 같은 타입을 갖는 빈객체를 설정
 - constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈객체를 생성자에 전달
 - autodetect : constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정


설명만 보면 간단하게 이해할 수 있다.

하지만 실제로 의존성 주입을 통한 어플리케이션을 구현하려고 하면
setter 메소드가 없다면 절대 의존성주입은 이루어지지 않는다.
더군다나 setter 메소드에 대한 설명없이는 어노테이션을 사용하지 않는 의존성주입은 설명되기 어렵다.

예를 들어 일반적으로 의존성주입을 위한 클래스를 만들라고 하면 아래와 같을 것이다.

------------------------------------------------
...java...

public class Service{

...

  protected DAO dao;
  public setDAO(DAO dao){
    this.dao = dao;
  }

...


}

...xml...
<bean id="service" class="com.Service" autowire="byName"/>
<bean id="dao" class="com.DAO"/>
--------------------------------------------------------

위와 같이 설정되었다고 한다면 Service 클래스의 맴버변수인 dao에는 com.DAO 의 인스턴스가 주입될 것이다.
autowire 설명만 본다면 당연한 결과이다.
byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정
자 그렇다면 Service 클래스에서 맴버변수인 dao의 이름을 dao2로 바꾼다면 어떻게 될까?
dao2라는 빈이 존재하지 않기 때문에 주입이 되지 않을까?
결과는 아무런 이상이 없이 정상적으로 의존성주입이 수행된다.
단순히 autowire 옵션에 대한 설명만 본다면
이러한 현상은 어떻게 설명될 수 있을까?


어노테이션을 사용하지 않는 의존성 주입 방식의 경우
기본적으로 해당 클래스에 정의한 setter 메소드에 의해 의존성 주입이 수행된다.
결국 의존성 주입시 바라보는 것은 해당 프로퍼티의 이름이 아닌
해당 프로퍼티의 setter 메소드라는 말이다.
autowire="byName" 으로 설정할 경우 set을 접두어로 사용하는 메소드 중에서
접미어로 지정된 명칭을 기준으로 빈 객체를 찾게된다.


결국 byName 에 대한 설명은 아래와 같이 바뀌어야 한다.
byName : 프로퍼티의 setter 메소드의 set을 제외한 이름과 같은 이름을 갖는 빈 객체를 설정

byType의 경우도 마찬가지이다.
프로퍼티의 타입이 아니라 정의된 setter 메소드의 파라미터 타입에 의해
의존성 주입이 결정된다. 이러한 이유로  byType의 경우 setter메소드의 명칭은
set만 접두어로 사용되면 되고 이후 접미어는 어떤 것이 와도 상관없다.
어차피 의존성주입시에는 파라미터의 타입만 확인하기 때문이다.


이렇게 어노테이션을 사용하지 않는 의존성주입의 경우
단순히 해당 맴버변수의 명칭이나 타입이 아닌 해당 setter 메소드의
관점에서 바라봐야만 명확한 정의를 내릴 수 있다.

 

Posted by mypiece
,