[Spring] 의존관계 주입 방법

hi·2022년 11월 5일
  1. 생성자 주입
  2. 수정자 주입 (setter 주입)
  3. 필드 주입
  4. 일반 메서드 주입

생성자 주입

  • 생성자를 통해 의존 관계 주입
  • 생성자 호출 시점에 딱 한번만 호출되는 것이 보장
  • 불변, 필수 의존관계에 사용
  • 생성자가 한개이면 @Autowired 생략 가능
  • 주입 데이터 누락시 컴파일 오류 발생
@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;
   }
}

수정자 주입

  • setter 수정자 메서드를 통해 의존 관계 주입
  • 선택, 변경 가능성이 있는 의존관계에 사용
  • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법
  • @Autowired 의 기본 동작은 주입할 대상이 없으면 오류가 발생
    주입할 대상이 없어도 동작하려면 @Autowired(required = false) 로 지정
@Component
public class OrderServiceImpl implements OrderService {

   private final MemberRepository memberRepository;
   private final DiscountPolicy discountPolicy;
   
   @Autowired
   public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
   }
   
   @Autowired
   public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
   }
}

필드 주입

  • 필드에 바로 주입하는 방법
  • 코드가 간결하지만 외부에서 변경이 불가능하여 테스트 어려움
  • DI 프레임워크가 없으면 사용 불가
  • 애플리케이션의 실제 코드와 관계 없는 테스트 코드 ,
    스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용
@Component
public class OrderServiceImpl implements OrderService {

   @Autowired
   private MemberRepository memberRepository;
   
   @Autowired
   private DiscountPolicy discountPolicy;
}

메서드 주입

  • 일반 메서드를 통해 주입
  • 한번에 여러 필드를 주입 받을 수 있음
  • 일반적으로 잘 사용하지 않음


🔎 참고

  • 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다
    스프링 빈이 아닌 클래스에서 @Autowired 코드를 적용하면 동작하지 않음

  • 생성자 주입을 제외한 주입 방식들은 모두 생성자 이후에 호출되므로,
    필드에 final 키워드 사용 불가


정리

기본으로 생성자 주입을 사용하되,
필수값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하여 사용

0개의 댓글