@Autowired
이 에너테이션은 스프링 컨테이너에 등록된 빈들 중에서 타입이 일치하는 빈을 찾아와 자동으로 주입시킨다.
생성자 주입
- 생성자 호출 시점에 한번만 주입됨이 보장된다.
- 의존관계를 처음 셋팅할 때 한번만 설정하고 이후에는 변경하고 싶지 않을때.
- 의존 객체가 불변이 된다. (final 도 붙이자.)
- final 이 붙은 필드는 초기화가 무조건 필요하다. (하지 않으면 컴파일타임에 에러남)
- 생성자 주입이니 생성자에서 초기화해주며, 필수값임을 나타낼 수 있다.
- 생성자가 하나라면, @Autowired 를 생략할 수 있다.
- 생성자 오버로딩으로 두개 이상이라면 어떤 것을 의존관계 설정에 이용할 것인지 모르기 떄문에 생략하면 안되고 지정해줘야한다.
수정자(Setter) 주입
- 선택적이다. 주입을 해도 되고 안해도 될 때 사용한다.
- 생성자는 무조건 실행되므로 생성자 주입은 필수의 특징인 반면에의 특징이다.
- @Autowired 는 기본 동작이 주입할 대상이 없으면 오류가 발생한다.
- @Autowired(required = false) 를 쓸 수 있다.
- 변경 가능성이 있을 때 쓴다. 불변이 아니다.
- 자바 빈 프로퍼티 규약에 맞다.
- 보통 생성자 주입을 쓰고, 선택적이 필요가 있을 때 가끔 쓴다.
스프링 빈은 크게 두가지 과정이 있다,
1. 빈을 등록하는 과정
2. 등록된 빈들의 의존관계를 주입하는 과정
하지만 생성자 주입은 해당 빈 객체를 등록하기 위해 생성할 때 주입되므로 위 두 과정이 같이 되긴한다.
또, 수동 빈 등록에서도 두 과정이 같이 일어난다.
생성자 주입과 setter 주입이 같이 있다면, 둘다 주입을 한다. 위의 두 과정이 일어나면서.
뭐, 스프링이 싱글톤을 보장해주므로 같은 빈이 주입되긴 한다.
반면에, Setter 주입이나 필드주입은 위의 과정이 따로 일어난다.
필드 주입
- 필드가 private 이라도 주입을 해준다.
- 치명적인 단점이 있다.
- 단위테스트를 할 수 없다. (스프링 컨테이너를 띄우지 않고서는 테스트하기가 어렵다)
- 다른 의존성을 단위테스트에서 주입해줄 방법이 없다.
- 생성자 주입을 쓰자.
- 필드 주입 괜찮은 경우
- 테스트에서 간단히 사용할 때
- @Configuration 에서 수동 등록할 때. (물론 다른 방법도 있다. 그래서 이 것도 사실 별로긴 하다.)
일반 메서드 주입
일반 메서드에 @Autowired 를 붙여서 주입할 수도 있다.
일반적으로 잘 쓰지 않는다.
@Autowired 는 @Component, @Controller 등등 스프링이 관리하는 빈이어야 동작한다.
'spring' 카테고리의 다른 글
스프링 빈의 생명주기와 초기화 분리 (0) | 2021.03.20 |
---|---|
자동 주입시 빈이 2개 이상일 때 문제 해결 (0) | 2021.03.19 |
생성자 자동 주입의 장점, @RequiredArgsConstructor (0) | 2021.03.19 |
@ComponentScan (0) | 2021.03.18 |
DTO 는 어떻게 써야하나 (0) | 2021.03.15 |