본문 바로가기

[Spring] Dependency Injection : 의존 관계 주입의 4가지 방법

@xuv22025. 6. 19. 15:41

의존 관계 주입 방법

의존 관계를 주입 하는 방법은 4가지 방법이 있다 -> [생성자 주입, 수정자(setter) 주입, 필드 주입, 일반 메서드 주입]


생성자 주입

이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방식 -> 즉 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.

final 키워드가 붙어있는 불변, 필수 의존관계에 사용한다.

(참고로 생성자가 밑에처럼 하나면 @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) 주입

자바 프로퍼티 규약에 따른 Getter 와 Setter 메서드 방식을 사용하는 방법으로, 선택이나 변경 가능성이 있는 의존 관계에 사용한다.

@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

	@AutoWired
	public setMemberRepository(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
    }
    
	@AutoWired
	public setDiscountPolicy(DiscountPolicy discountPolicy) {
		this.discountPolicy = discountPolicy;
    }
}

참고로 자바빈 프로퍼티란 자바에서 필드의 값에 직접 접근하여 변경하는 대신 setXXX 와 getXXX 라는 메서드를 통해 값을 읽거나 수정하는 규칙을 의미한다.


필드 주입

필드에 바로 주입하는 방법인데 ,이는 권장하지 않는 방법이다(DI 프레임워크가 없으면 아무것도 할 수 없기 때문).

사용 법은 필드에 @AutoWired를 붙이는 것이다.

@Component
public class OrderServiceImpl implements OrderService {

	@AutoWired
	private final MemberRepository memberRepository;
	@AutoWired
	private final DiscountPolicy discountPolicy;
}

순수 자바 코드(DI 프레임워크 X) 로 테스트시 @AutoWired는 동작하지 않기 때문에 테스트 작성에도 불리하다.

 


일반 메서드 주입

일반 메서드로 주입 받는 방법 -> 한번에 여러 필드 주입 가능하지만 잘 사용하진 않는다.

@Component
public class OrderServiceImpl implements OrderService {
	
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;
    
    @AutorWired
    public void init(MemberRepository memberRepository , DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
	}
}

 


당연하지만 중요한 내용

의존 관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 한다. 일반 자바 객체(Member) 처럼 스프링 빈이 아닌 일반 자바 객체에 @AutoWired를 적용해도 아무 기능도 동작하지 않는다.

xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차