Spring - 의존성 주입 방식

목차

의존성 주입

@Autowired@Inject를 이용해서 의존성을 주입해준다.

@Autowired와 @Inject를 붙일 수 있는 위치

  1. 생성자
  2. Setter
  3. 필드

생성자 주입

생성자를 통해서 의존 관계를 주입하는 방법

스프링 컨테이너가 Bean 을 생성할때 객체의 생성자를 이용해 의존관계를 주입하는 방식입니다. 생성자를 통한 의존성 주입 방식은 스프링에서 가장 권장하는 방식입니다.

생성자를 통한 의존관계 주입은 객체 생성시 단 한번만 호출돼 객체간 의존관계의 불변성이 보장됩니다. 초기화 시점에 의존관계가 설정되고 변경되지 않기 때문에 final 키워드를 사용할 수 있습니다.

또한, 생성자를 통한 의존 관계 주입시 생성자가 1개인 경우 @Autowried 를 생략할 수 있습니다.

@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

@Autowired // 생성자가 1개일 경우 생략 가능
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}

Setter 주입

Setter 메소드를 이용해 객체의 의존 관계를 주입하는 방법입니다. 변경 가능성이 있는 의존관계에 사용합니다. 값이 초기화 후 의존관게가 변경될 수 있어 final 키워드 사용이 불가능 합니다

@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;
}
}

필드 주입

필드에 직접 의존관계를 주입하는 방식입니다. 필드 주입은 DI 프레임워크가 없으면 의존 관계를 주입할 수 없습니다. 또한 필드 주입방식은 테스트 시 의존관계가 있는 객체에 접근할 수 없어 테스트하기 어렵습니다.

@Component
public class OrderServiceImpl implements OrderService {

@Autowired
private MemberRepository memberRepository;

@Autowired
private DiscountPolicy discountPolicy;
}

메서드 주입

일반 메소드를 이용해 의존 관계를 주입하는 방식입니다. 메소드에 @Autowired 를 붙여 의존 객체를 주입합니다.

@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;
}
}
Share