본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] @Autowired의 4가지 사용 방법

by 김코더 김주역 2022. 6. 17.
반응형

@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

반응형

댓글