1. 생성자 주입 (가장 많이 사용)
생성자에 @Autowired 를 사용해 주입한다.
클래스가 ComponentScan 범위에 들어오면 빈이 생성되면서 생성자가 호출된다. 이때 @Autowired를 통해 DI가 이루어진다.
생성자가 하나만 있을 경우 @Autowired는 생략이 가능하다.
생성자는 한 번만 호출되기 때문에 불변, 필수 의존성 주입에 사용하는 방식이다. (객체가 절대로 바뀔 일이 없고 반드시 null이 아니어야 하는 의존성)
2. setter 주입
setter에 @Autowired 를 사용해 주입한다.
setter는 계속해서 호출이 가능하기 때문에 선택, 변경의 가능성이 있는 의존성 주입에 사용하는 방식이다.
필수값인 객체는 생성자 주입을 사용하고 필수가 아닌 객체는 setter 주입을 따로 사용하는 방법도 있다.
3. 필드 주입 (그냥 쓰지 말자)
그냥 필드 변수 선언 시에 필드측에 @Autowired로 박아버린다.
생성자, setter 주입 방식은 테스트 코드에서 순수 자바코드로도 생성자 주입이 가능하지만 필드 주입은 오로지 스프링 컨테이너를 통해서만 의존성 주입이 가능함.
스프링 컨테이너를 띄우지 않고 순수 자바코드로 단위 테스트를 실행할 때 의존성을 주입할 수 있는 방법이 없어져 곤란해질 수 있다.
(규모가 큰 프로젝트에서 스프링 컨테이너를 띄우고 테스트하는 것은 속도가 느리기 때문에 순수 자바 코드만 사용하는 단위테스트를 사용하는 경우도 많다. 필드 주입은 이 상황에서 의존성을 주입할 수 없게 된다.)
굳이 필드주입을 사용하고 순수 자바 코드 테스트를 진행하려면 별도의 setter를 만들어서 의존성을 주입해주어야 한다.
(근데 이럴거면 그냥 생성자 주입 or setter 주입을 쓰고 말지..)
단, 애플리케이션 설계와 전혀 관계가 없는 테스트 코드 내에서는 필드 주입으로 빠르게 의존성을 주입하고 사용하는 게 더 좋을 수도 있다.
4. 일반 메서드 주입
그냥 일반 메서드에 @Autowired 달고 주입받는 방식
거의 쓰지 않는다. 쓰지 말자.
(옵션 처리 설정)
@Autowired로 의존성 주입을 실시할 때 자동주입할 객체가 없는 경우가 있을 수도 있다.
이때 아무런 조치를 취하지 않은 채로 그냥 @Autowired만 사용한다면 에러가 발생한다.
주입할 빈이 없어도 문제없이 동작하게 하기 위해선 다음과 같은 처리들을 해줄 수 있다.
1. required
@Autowired(required = false) 로 옵션 지정을 해준다.
required의 디폴트 값은 true이다.
false로 지정될 경우, 주입할 빈이 없으면 해당 메서드를 실행하지 않고 바로 넘어간다.
2. @Nullable
method(@Nullable Member member)
파라미터 앞에 @Nullable을 추가할 수 있다. 들어올 빈이 없어도 메서드 호출은 이루어지지만 null이 주입된다.
3. Optional
method(Optional<Member> member)
자바8의 Optional을 사용하는 방법이다. (Optional.empty 주입됨)
'김영한님 스프링 강의 정리 > 핵심원리 기본편' 카테고리의 다른 글
조회한 빈이 두 개 이상일 때? 필드명, @Qualifier, @Primary (0) | 2021.01.11 |
---|---|
Lombok 라이브러리를 사용한 생성자 주입 (0) | 2021.01.11 |
빈 이름 중복에 의한 충돌 (0) | 2021.01.10 |
컴포넌트 스캔 - @Component, @Autowired, @Qualifier (0) | 2021.01.09 |
@Configuration과 싱글톤 패턴 (0) | 2021.01.08 |