[Spring] @Autowired 어노테이션
객체 간 의존 자동 연결
스프링은 개발자가 일일이 의존 정보를 설정하지 않아도 자동으로 스프링 빈 객체 간의 의존을 설정해주는 기능 제공하고 있는데, 이 기능을 사용하면 스프링 코드 설정을 짧게 유지할 수 있게 된다. 이 방법 중에서 @Autowired에 대해서 알아보자.
@Autowired 어노테이션을 사용하려면 XML 설정에 다음과 같은 코드를 추가해주어야 한다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
// 이하 생략
...
</beans>
<context:annotation-config> 태그는 다수의 스프링 전처리기 빈을 등록해주는데, 이 중 의존 자동 연결과 관련된 스프링 빈은 다음과 같다.
- AutowiredAnnotationBeanPostProcessor : @Autowired, JSR-330에 정의된 @Inject 어노테이션 처리
- CommonAnnotationBeanPostProcessor : @Resource, @PostConstruct 등 JSR-250에 정의된 어노테이션 처리
- QualifierAnnotationAutowireCandidateResolver : @Qualifier 어노테이션 처리
참고로 @Configuration 어노테이션을 이용한 자바 설정을 사용할 경우 별도의 추가 설정을 하지 않아도 어노테이션을 알맞게 처리해준다.
@Autowired 어노테이션은 생성자, 필드, 메서드의 세 곳에 적용이 가능하다. 다음 코드를 보자.
public class OrderService {
private ErpClientFactory erpClientFactory;
@Autowired
public void setErpClientFactory(ErpClientFactory erpClientFactory) {
this.erpClientFactory = erpClientFactory;
}
// 이하 생략
...
}
<context:annotation-config />
<bean id="orderService" class="net.madvirus.spring4.chap02.shop.OrderService">
<!--erpClientFactory 프로퍼티에 대한 설정이 없음 -->
</bean>
<bean id="ecFactory" class="net.madvirus.spring4.chap02.erp.ErpClientFactory">
...
</bean>
XML에서 erpClientFactory 프로퍼티 설정이 없지만, @Autowired 어노테이션이 적용되어 있으므로 스프링은 동일한 타입을 갖는 "ecFactory" 빈을 erpClientFactory 프로퍼티의 값으로 사용한다.
생성자나 필드에 적용해도 동일하게 동작한다. @Autowired 어노테이션을 필드에 적용하면 의존 객체를 전달받기 위한 메서드를 추가하지 않아도 되지만, 단위 테스트와 같은 환경에서 사용될 수 있으니 메서드나 생성자는 남겨두는 것이 좋다.
XML 설정뿐만 아니라 자바 설정을 사용하는 경우에도 동일하게 동작한다. 단, XML 설정에서는 스프링이 생성자를 호출하는데 자바 설정에서는 코드에서 생성자를 직접 호출한다. 그렇기 때문에 자바 설정에서는 생성자에 @Autowired 어노테이션을 적용해도 의존 객체가 전달되지 않는다.
@Autowired 어노테이션 적용 프로퍼티의 필수 여부 지정
@Autowired 어노테이션에 해당하는 타입의 빈 객체가 존재하지 않으면 스프링은 컨테이너를 초기화하는 과정에서 NoSuchBeanDefinitionException을 발생시킨다. 익셉션을 발생시키지 않고 단순히 null로 값을 유지하고 싶다면 다음과 같이 @Autowired 어노테이션의 required 속성 값을 false로 지정하면 된다.
public class OrderService {
@Autowired(required = false)
private ErpClientFactory erpClientFactory;
// 이하 생략
...
}
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)