반응형
의존관계 자동 주입
다양한 의존관계 주입 방법
- 생성자 주입
- 생성자가 1개만 있으면 @Autowired 생략가능
- 생성자를 통해 의존관계를 주입
- 특징
- 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
- 불변/필수 의존관계에 사용
- 수정자 주입(setter)
- 수정자 메서드(setter)를 통해 의존관계를 주입
- 옵션처리를 통해 주입할 대상 없어도 동작가능
- 특징
- 선택/변경 가능성이 있는 의존관계에 사용
- 필드 주입 (비추)
- 필드에 바로 주입
- 특징
- 코드가 간결. 단, 외부에서 변경이 불가능해서 테스트 힘들다. (스프링 없이 단위 테스트 불가능)
- DI 프레임워크가 없으면 아무것도 못한다.
- 설정 목적인 @Configuration 같은 곳, 테스트코드에서만 사용
- 일반 메서드 주입
- 생서자가 아닌 일반 메서드를 통해 주입
- 특징
- 한번에 여러 필드를 주입
- 일반적으론 사용하지 않는다
옵션 처리
주입할 스프링 빈이 없어도 동작해야 할 때, 아래와 같이 처리할 수 있다.
class TestBean {
//호출 안됨
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("setNoBean1 = " + member);
}
//null 호출
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("setNoBean2 = " + member);
}
//Optional.empty 호출
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("setNoBean3 = " + member);
}
}
생성자 주입을 사용하는 이유
- 불변
- 종료시점까지 의존관계를 변경할 일이 없다.
- 수정자 주입은 변경점을 열어놓는 셈
- 생성자 주입은 생성시 1번 호출 되므로 불변을 제공
- 누락
- 스프링없이 단위 테스트 할 경우, 생성자를 통해 의존성을 주입하여 테스트 할 수 있다.
- 생성자 주입을 사용하면 필드 데이터 주입 누락시, 컴파일 오류로 확인 가능
- final 키워드
- 혹시라도 초기화값이 설정되지 않는 필드가 있다면 컴파일 오류로 확인 가능
기본으로 생성자 주입을 선택하고, 선택값이 필요한 경우엔 수정자 주입방식을 옵션 부여를 통해 주입한다.
생성자 주입과 롬복
대부분 final이 대부분이고, 생성자를 만들기는 번거롭다!
@RequiredArgsConstructor은 final이 붙은 필드를 모아서 생성자를 자동으로 만들어 준다. (.class 파일에서 확인 가능)
여기에 생성자가 1개면 @Autowire.d 생략이 가능하므로 코드가 간결해진다.
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
...
}
728x90
반응형
'스프링' 카테고리의 다른 글
스프링 핵심 원리 - (8) (0) | 2022.08.05 |
---|---|
스프링 핵심 원리 - (7) (0) | 2022.08.05 |
스프링 핵심 원리 - (6) (0) | 2022.08.04 |
스프링 핵심 원리 - (5) (0) | 2022.08.04 |
스프링 핵심 원리 - (4) (0) | 2022.08.03 |
댓글