의존관계 주입 전 주의사항❗
의존관계 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다! 스프링 빈으로 등록되지 않은 일반 자바 클래스 Member 같은 클래스에서 @Autowired 를 아무리 해봐야 소용이 없다!!
생성자 주입
이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 또한, 생성자 호출 시점에 딱 1번만 호출되므로 불변, 필수 의존관계에 사용해야한다.
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired // ✅ 만약 생성자가 이것 하나뿐이라면 @Autowired 생략가능!!
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
Lombok 라이브러리가 제공해주는 @RequiredArgsConstructor 를 사용하는것을 추천❗❗❗
최근에는 생성자를 딱하나만 써서 @Autowired 를 생략하고 클래스 상단에 @RequiredArgsConstructor 를 붙여 자동으로 생성자 주입을 해주는 방식을 사용하고있다고 한다. 아래의 예시로 쉽게 이해해 보자.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
✅ 위의 해당코드를 @RequiredArgsConstructor 를 사용하여 간단히 변경할 수 있다. 아래 예시는 완전히 동일한 코드이다.
@Component
@RequiredArgsConstructor // final 이 붙은 의존관계에 대해 생성자를 만들어주는 어노테이션
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
✅ @RequiredArgsConstructor 를 사용하니 아주 간단한 코드가 되었다!!
Setter (수정자) 주입
선택, 변경 가능성이 있는 의존관계에 사용한다.
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
필드 주입
필드 앞에 @Autowired 를 붙이는 방식이다. 코드가 간결해서 편해보이지만 외부에서 변경이 불가능해서 테스트하기 힘들다! 스프링 설정을 목적으로하는 @Configuration 같은 곳에서만 특별한 용도로 사용하고 나머지에서는 사용하지 말자!!
@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
일반 메서드 주입
일반 메서드를 통해서 주입 받을 수 있다. 한번에 여러 필드를 주입 받을 수 있지만 일반적으로 잘 사용하지 않는다. (생성자 주입으로 대신할 수 있기 때문에!)
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
참고
인프런 - 김영한의 스프링 기본편
'Spring' 카테고리의 다른 글
조회 빈이 2개 이상일 때 해결방법! (0) | 2022.06.04 |
---|---|
[Springboot] Execution failed for task ':test' 에러 해결방법 (0) | 2022.06.04 |
의존관계가 아닐때 옵셔널처리 (0) | 2022.06.04 |
@ComponentScan 과 @Autowired (0) | 2022.06.04 |
자동 빈 VS 수동 빈 충돌!!! (0) | 2022.05.27 |
댓글