본문 바로가기
Java/Spring

[5] 스프링 프레임워크 핵심 - Autowired

by Riverandeye 2020. 12. 4.

IoC Container는 의존성을 주입할 때

필요한 의존 객체의 "타입"에 해당하는 빈을 찾아서 주입해줍니다. 

 

 생성자를 이용하기

@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

다음과 같이 생성자를 정의한 후 @Autowired 어노테이션을 명시하여 사용합니다.

 

Setter를 이용하기

@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired
    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

다음과 같이 Setter를 이용해서 주입을 할 수 있습니다. 

 

@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired(required = false)
    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

만약 없을 때 주입이 필요 없다, 그러면 @Autowired(required = false) 를 이용해서

꼭 주입이 되지 않아도 됨을 명시해줍니다. 

이렇게 하면 의존성 주입이 안 된 채로 Bean이 생성됩니다.

 

@Service
public class BookService {

    BookRepository bookRepository;

    @Autowired(required = false)
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

 

대신 생성자를 사용한 의존성 주입은 @Autowired(required = false) 를 수행해도

Bean을 생성할 수 없습니다. 

 

만약 인터페이스의 구현체가 여러개인데

인터페이스를 아무런 명시 없이 주입하려고 하면

어떤 Bean을 주입해야 하는지 모르기 때문에 이 경우엔 Bean이 생성되지 않습니다.

 

이런 경우엔

@Primary
@Repository
public class KwanHunBookRepository implements BookRepository {

1. @Primary 어노테이션으로 Bean에 우선순위를 부여하거나 (굳이 추천하자면 이거)

 

2. 모든 Bean을 다 받거나 (배열로 선언하고 @Autowired 걸면 다 받음)

 

@Service
public class BookService {

    @Autowired
    @Qualifier("kwanHunBookRepository")
    BookRepository bookRepository;
}

3. @Qualifier 어노테이션으로 원하는 Bean을 명시합니다.

 

@Service
public class BookService {

    @Autowired
    BookRepository kwanHunBookRepository;
}

4. @Autowired 의 2번쨰 기능인 이름을 이용하여 주입합니다 (좋은 방법은 아님)

필드 이름과 동일한 Bean을 주입받아서 사용합니다.

 

이러한 의존성 주입은

BeanPostProcessor 라는 Bean의 라이프사이클 인터페이스 내의 구현체에 의해 수행됩니다.

 

BeanPostProcessor

- 새로 만든 Bean 인스턴스를 수정할 수 있는 라이프사이클 인터페이스

- 정의된 Bean이 Initialized 된 이후의 작업을 수행해줍니다

AutowiredAnnotationBeanPostProcessor extends BeanPotProcessor

- 스프링이 제공하는 @Autowired와 @Value 어노테이션, JSR-330의 @Inject 어노테이션을 지원

댓글