Spring Core - 의존성 주입 방식

목차

스프링 의존성 주입 (Dependency Injection)

의존성 주입은 객체간의 의존성을 관리하기 위한 디자인 패턴

한 객체가 직접 의존성하는 다른 객체를 생성하거나 관리하지 않고, 프레임워크와 같은 외부로부터 필요한 의존성을 주입받는방식 입니다. 이를 통해 객체간 의존성을 수정하기 위해 직접 코드를 수정할 필요가 없어 객체간 결합도 를 낮춰줍니다.

스프링에서는 스프링 컨테이너가 객체의 의존성을 관리하고 주입해줍니다. 이때, 스프링 컨테이너가 의존성을 관리 및 주입을 위해 관리하는 객체들을 스프링 Bean 이라 부릅니다.

스프링에서 의존성 주입을 위해서는 우선, 스프링 컨테이너에 객체들을 스프링 Bean 으로 등록해야 합나다. 의존성 주입은 스프링 Bean 으로 등록된 객체들을 기준으로 주입이 이뤄집니다.

스프링에서 의존성 주입을 위해 @Autowired@Inject 를 사용하고 생성자, Setter, 필드, 메소드 에 붙일 수 있습니다.

위 어노테이션이 객체의 의존성을 주입할때는 타입을 기준으로 주입합니다.

의존성 주입방식

1. 생성자 주입

생성자를 통한 의존성 주입 방식은 스프링에서 가장 권장하는 방식입니다.

스프링 컨테이너가 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;
}
}

2. 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;
}
}

3. 필드 주입

DI 프레임워크를 통한 의존 관계 주입

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

@Component
public class OrderServiceImpl implements OrderService {

@Autowired
private MemberRepository memberRepository;

@Autowired
private DiscountPolicy discountPolicy;
}

4. 메서드 주입

일반 메소드를 이용해 의존 관계를 주입하는 방식입니다. 메소드에 @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