티스토리 뷰
Study/SpringBoot
[SpringBoot] 스프링 핵심 원리 섹션 7 - 1 | 의존관계 자동 주입 | 생성자 주입 | 수정자 주입 | 필드 주입 | 일반 메서드 주입
YouJungJang 2023. 12. 5. 15:51본 포스팅은 인프런 김영한 강사님의 스프링 부트 핵심 원리 강의 섹션 7을 수강하고 배운 점을 정리했습니다.
다양한 의존관계 주입 방법
1. 생성자 주입
✅ 생성자를 통해서 의존 관계를 주입받는 방법이다.
✅ 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
✅ 불변, 필수 의존관계에 사용
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
➡️ 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입 된다
2. 수정자 주입 (setter 주입)
✅ setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다
✅ 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
✅ 선택, 변경 가능성이 있는 의존관계에 사용
@Component
public class OrderServiceImpl implements OrderService {
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의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하
려면 @Autowired(required = false)로 지정하면 된다.
3. 필드 주입
✅ 이름 그대로 필드에 바로 주입하는 방법이다.
✅ 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점이 있다.
✅ 애플리케이션의 실제 코드와 관계없는 테스트 코드나 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용한다.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
➡️ 사용하지 말자!
4. 일반 메서드 주입
✅ 일반 메서드를 통해서 주입받을 수 있다.
✅ 한 번에 여러 필드를 주입받을 수 있다.
✅ 일반적으로 잘 사용하지 않는다.
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}