[Spring] 스프링 의존관계 주입 방법

2022. 10. 24. 21:17

스프링 컨테이너에서 관리하는 스프링 빈들의 의존관계를 주입하는 방법은 크게 네 가지가 있다.

생성자 주입 (Constructor Injection)
수정자 주입(Setter Injection)
필드 주입 (field Injection)
일반 메서드 주입

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 주입)

settr 메서드를 통해 의존관계를 주입하는 방법

선택, 변경 가능성이 있는 의존관계에 사용된다.

@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. 필드 주입

필드에 바로 의존관계를 주입하는 방법

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

코드가 간결하지만 외부에서 변경이 불가능해 테스트하기 힘들고 DI 프레임워크가 없으면 아무것도 할 수 없다. 

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

 

위처럼 의존관계를 주입하는 방법에는 네 가지 방법이 있지만 스프링은 생성자 주입을 권장한다.

이유는 다음과 같다.

 

1. 불변

대부분의 의존관계 주입은 한 번 일어나면 종료 시점까지 의존관계를 변경할 일이 거의 없다. 따라서 객체를 생성할 때 한 번만 호출되는 생성자 주입을 사용한다.

 

2. 누락

final 키워드로 필드를 만들고 생성자 주입을 통해 의존관계를 주입하기 때문에 누락 시 컴파일 오류가 발생해서 개발자가 알기 쉽다.

(생성자 주입만 final 키워드를 사용한다.)

 

따라서 항상 생성자 주입을 선택하고, 가끔 옵션이 필요하면 수정자 주입을 선택하면 된다. 

 

 

참고 자료  : 김영한님 스프링 핵심 원리 - 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

BELATED ARTICLES

more