코딩관계론

Bean 의존관계 주입 방법 - 생성자 주입을 사용하자 본문

개발/Java

Bean 의존관계 주입 방법 - 생성자 주입을 사용하자

개발자_티모 2024. 7. 14. 16:45
반응형

1. 생성자 주입

의존관계 주입에는 여럭가지 방법이 있지만 생성자 주입을 선택하는 것이 베스트라고 한다. 그 이유는 아래와 같이 요약할 수 있습니다.

 

1. 단 한번만 호출되는 보장

생성자는 객체가 생성될 때 단 한번만 호출되며, 누군가가 생성자 변수를 강제로 변경할 수 없게 된다. 이러한 특성은 객체의 일관성과 안정성을 보장한다. 특히, 생성자 변수에 final 키워드를 설정하면, 초기화가 누락될 경우 컴파일 오류가 발생하므로 초기화의 정확성을 높일 수 있다.

 

2. 객체지향적 설계

객체지향적 관점에서는 객체가 생성될 때 의존관계를 주입하는 것이 바람직하다. 이는 객체가 생성될 때 그 동작을 결정짓는 요소들을 함께 설정하는 것이기 때문이다. 예를 들어, 자동차를 조립할 때 엔진과 바퀴를 처음부터 조립하는 것과 마찬가지로, 객체도 처음부터 필요한 의존성을 주입받는 것이 더 자연스럽다.

 

3. 코드 예시

생성자 주입을 사용하는 코드 예시는 다음과 같다. 참고로, 생성자가 하나인 경우에는 @Autowired 어노테이션은 생략 가능하다

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

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository,DiscountPolicy rateDiscountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = rateDiscountPolicy;
    }
}

 

 

2. 수정자 주입(setter)

1. 실시간 의존관계 변경

수정자 주입(setter 주입)은 객체의 의존관계를 실시간으로 변경해야 할 필요가 있을 때 유용하다. 이는 주로 의존성이 동적으로 변하거나 필요에 따라 변경될 가능성이 있는 경우에 사용된다.

 

2. 스프링 프레임워크의 동작 방식

스프링 프레임워크에서는 @Autowired 어노테이션을 사용하여 setter 메서드에 의존성을 주입할 수 있다. 스프링 컨테이너가 빈을 생성하고 주입할 때, @Autowired가 붙은 setter 메서드를 호출하여 필요한 의존성을 주입하는 것을 보장한다. 이는 빈 초기화 과정에서 스프링 컨테이너가 해당 메서드를 호출하여 필요한 객체를 주입하는 방식이다.

 

3. 코드 예시

생성자 주입을 사용하는 코드 예시는 다음과 같다. 참고로, 생성자가 하나인 경우에는 @Autowired 어노테이션은 생략 가능하다

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

1. 개요

필드 주입은 의존성을 클래스의 필드에 직접 주입하는 방법이다. 이는 주로 테스트 코드나 간단한 예제에서 사용되며, 필드에 직접 @Autowired 어노테이션을 붙여 의존성을 주입한다.

 

2. 스프링 프레임워크에서의 활용

스프링 프레임워크에서는 @Autowired 어노테이션을 필드에 직접 적용할 수 있다. 스프링 컨테이너가 빈을 생성할 때, 해당 필드에 필요한 의존성을 주입하는 방식이다.

 

2. 단점

필드 주입은 프레임워크에 의존하고, 외부에서 객체를 주입할 방법이 없기 때문에 순수한 테스트가 매우 힘들다.

 

3. 코드 예시

아래는 필드 주입을 사용하는 코드 예시이다.

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

 

반응형