@Autowired 를 무심코 쓴다. 무심코 쓰기 때문에 이후 이것이 무의식적인 코딩이 될까 걱정이다. 그래서 알아야 한다고 생각한다.


스프링 프레임워크는 많은 기능들을 지원하고 있다. 하지만 스프링이 내포하고 있는 의미를 진정으로 깨닫는 것은 어렵다. 그 와중에 많은 특징이 있고 스프링에서 그 특징 중의 핵심은 IoC(Inversion of Control) 컨테이너라고 한다.


우리는 애플리케이션을 만들면서 구성 파일들을 통해 객체 의존성(Object dependencies) 을 나타낼 수 있다. 현재 내가 하고있는 방식의 최신버전의 방식이다. 즉 개발자 본인이 원하는 경우에 스프링 프로젝트에서 @Autowired 라는 애노테이션을 통해 의존성 주입을 하고 있는 것이다.


이전 전통적인 접근 방식은 빈 설정 XML 파일에서 ref 키워드를 이용하여 수동으로 빈을 연결하는 것이다. 아래의 내용을 보자.



전통적인 방식 application-config.XML 내용  ]




처음 사진은 본인 프로젝트 디렉토리 상태이다. 빨간색 박스 테두리 되어있는 application-config.xml 이 빈 설정 XML 파일이다. 두번째 사진은 해당 파일 내부이며 EmpManager 객체 내부에 EmpDao 가 빈으로 주입(Injection) 되고 있다. ref 키워드를 통해 수동으로 빈을 연결하고 있는 것이다.


위의 autowiredexample 패키지 내의 EmpManager.java 코드를 살펴보면 아래의 내용이 있다.


[ EmpManager.java 내용 ]



따라서 위의 내용이 전통적인 접근 방식이었다면 이번에는 @Autowired 를 이용한 접근 방식을 보자. 해당 애노테이션을 사용하게 되면, 두 객체 간의 사이를 연결하는 추가XML 내용을 제거할 수 있다.


[ @Autowired를 이용, application-config.XML 내용 ]



[ EmpManager.java ]




@Autowired 는 속성 삽입만을 위해서만 사용되는 것이 아니다. 메소드와 생성자에서도 사용이 가능하다. 해당 애노테이션을 사용하게 되면 XML 코드의 내용들을 대폭 줄일 수 있다. 하지만 아래와 같은 사항에 에러를 일으킨다.

  1. 해당 빈 객체가 존재하지 않는 경우 ( XML 내부에 빈 객체 없음 ) or 클래스에서 타입이 다른 경우
    - 위의 EmpDao 클래스 EmpDaoTest 클래스 두 개를 만들어놓고 EmpManager 클래스 내부 필드의 타입명을 변경해보자.

    @Autowired
    private EmpDao empDao 를

    @Autowired
    private EmpDaoTest empDao 로 변경


    그리고 실행하면 아래와 같은 에러가 난다

    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.java.lec.EmpDaoTest] found for dependency


    해당 EmpDaoTest 타입의 빈을 찾을 수 없다고 나타난다. 왜냐하면 application-config.XML 에는 EmpDao 로 빈 객체를 만들어주었기 때문이다. 

    또한 xml 내부에 빈 객체가 없이 실행하여도 위에 내용과 동일한 에러가 나온다.

    +) 에러를 띄우지 않으려면 해당 애노테이션에 required 속성을 false로 지정하면 된다. @Autowired(required=false), 직접 해보았는데 따로 에러내용은 뜨지 않았다. 기본값은 true 이다.


  2. 해당 빈 객체가 두 개 이상 존재하는 경우 ( XML 파일 내부에 빈 객체 중복 )
    - application-config.XML 에 "<bean id="empDao" class="com.java.lec.EmpDao"></bean>" 를 한 개 더 넣어주었다. 총 2개의 빈 객체가 XML 파일에 존재하는데 실행시키니 에러가 나타난다.

위의 문제점에 대해 옵션을 줄 수 있다. @Autowired의 목적으로 동일 타입의 빈 객체가 존재하는 경우 특정 빈 을 삽입하게 해준다. @Qualifier 라는 애노테이션을 이용해서 타입과 이름을 식별할 수 있다.

ex)
위의 내용에서 타입이 맞는 빈 객체 이름을 그대로 넣어준다.

@Autowired
@Qualifier("empDao")


Posted by doubler
,