@Autowired 어노테이션은 타입에 의한 자동와이어링 방식으로 bean을 가져오는 역할을 한다. 같은 타입의 Bean이 두 개 이상 존재하는 경우에는 변수의 이름과 같은 이름의 Bean을 가져온다. 변수 이름으로 Bean을 찾을 수 없는 경우에는 예외가 발생한다.
그리고 @Autowired는 필드, 수정자, 생성자, 일반 메소드에 사용할 수 있다.
간단한 예시를 통해 그 사용법을 알아보자.
1. 필드 주입
- 필드의 타입에 맞는 bean을 자동으로 찾아서 주입 시켜주는 방식이다.
@Autowired
private Printer printer;
2. 수정자 주입
- 수정자 메소드의 이름으로부터 프로퍼티 타입을 알아내고 프로퍼티 타입에 맞는 bean을 자동으로 찾아서 필드에 주입 시켜주는 방식이다.
- 소스 코드가 길어질 수 있고, 수정자를 빠뜨리고 작성할 위험이 있다.
private Printer printer;
@Autowired
public void setPrinter(Printer printer){
this.printer=printer;
}
3. 생성자 주입
- 생성자의 각 파라미터 타입에 맞는 bean을 모두 자동으로 찾아서 필드에 주입 시켜주는 방식이다.
- 선택적 DI가 어렵고, 하나의 생성자에만 사용 가능하다는 제한이 있다.
protected SqlReader sqlReader;
protected SqlRegistry sqlRegistry;
@Autowired
public ExampleSqlService(SqlReader sqlReader, SqlRegistry sqlRegistry){
this.sqlReader=sqlReader;
this.sqlRegistry=sqlRegistry;
}
4. 일반 메소드 주입
- 소스 코드가 길어진다는 수정자 주입 방식의 단점과 선택적 DI가 어려운 생성자 주입 방식의 단점을 극복하기 위한 방식이다.
- 파라미터를 가진 메소드에 @Autowired를 붙여서 각 파라미터의 타입에 맞는 bean을 자동으로 찾아서 가져오는 방식이다.
- XML을 이용하여 의존 관계를 설정할 수 없는 단점이 있다.
protected SqlReader sqlReader;
protected SqlRegistry sqlRegistry;
@Autowired
public void config(SqlReader sqlReader, SqlRegistry sqlRegistry){
this.sqlReader=sqlReader;
this.sqlRegistry=sqlRegistry;
}
+ 추가 개념 1) Collection
- 만약 동일한 타입의 bean이 2개 이상 존재하는 경우에는 Collection, List, Map 등을 이용하여 모든 bean들을 가져올 수도 있다.
@Autowired
Collection<Printer> printer;
@Autowired
Printer[] printers;
@Autowired
Map<String, Printer> printerMap;
- 주입할 bean의 타입 자체가 컬렉션인 경우에는 @Resource를 이용해야 한다.
+ 추가 개념 2) required 옵션
- @Autowired는 어떠한 bean도 찾지 못했을 경우에는 에러가 발생하지만, required 옵션을 false로 설정해줌으로써 DI를 선택적으로 가능하게 할 수 있다.
@Autowired(required=false) Printer printer;
+ 추가 개념 3) @Inject
- @Autowired와 비슷한 어노테이션으로 @Inject가 있는데, @Inject는 spring 외에도 JavaEE 6의 표준 스펙을 따르는 다른 프레임워크에서도 동일한 의미로 사용된다.
- @Autowired의 required 옵션에 해당하는 선택 기능은 없다.
■ 참고 자료: 토비의 스프링 3.1 vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] Collection 타입을 XML로 작성하기 (0) | 2022.06.21 |
---|---|
[Spring] @Qualifier 이란? (0) | 2022.06.17 |
[Spring] IoC 컨테이너를 통해 애플리케이션이 만들어지는 방식 (0) | 2022.06.07 |
[Spring] XML 설정 방식을 Annotation으로 바꾸기 (0) | 2022.05.06 |
[Spring] 리소스 추상화 (0) | 2022.05.01 |
댓글