본문으로 바로가기
반응형

 

 

 

스프링에서 의존관계 주입은 크게 4가지 방법이 있다.

 

 

 - 생성자 주입

 - 수정자 주입(setter 주입)

 - 필드 주입

 - 일반 메서드 주

 

 

 

 

 

 

 


● 생성자 주입  

 

 

 

 

이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법이다

 

특징으로는 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.

추가로 불변, 필수 의존관계에 사용된다.

 

 

 

예시를 통해 알아보자.

 

 

 

Ex) OrderServiceImpl 생성자에 MemberRepository, DicsountPolicy 의존관계 연결

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

 

의존관계를 연결할 필드를 final을 통해 필수로 입력을 받도록 하고,

 

생성자에서 의존관계를 주입 해준다.

 

일반적인 의존관계 방법이다.

 

 

 

 

 

※ 참고로 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입된다.

   물론 스프링 빈에만 해당한다.

 

 

 

 

 

 

 

 

 


● 수정자 주입(setter 주입)  

 

 

 

 

 

setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.

 

 

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

자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.

 

 

 

 

예시를 통해 알아보자.

 

 

 

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

 

 

 

이 방법은 외부에서 set 메서드를 수정할 수도 있기에(public 클래스여서)

권장하지는 않는다.

 

 

 

 

 

※참고: @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다.

          주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정하면 된다.

 

 

 

 

 

 

 

 

 


● 필드 주입  

 

 

 

 

 

필드 주입은 이름 그대로 필드에 바로 주입하는 방법이다.

 

 

특징으로는, 코드가 간결하지만 외부에서 변경이 불가능해서

테스트하기 힘들다는 치명적인 단점이 있다.

 

 

 

필드 주입은 애플리케이션의 실제 코드와 관계없는 테스트 코드나

스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만

특별한 용도로 사용한다.

 

 

 

 

 

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

 

 

 

 

 

 

 

 


● 일반 메서드 주입 

 

 

 

 

 

 

일반 메서드를 통해서 주입받을 수 있다.

 

특징은 한 번에 여러 필드를 주입받을 수 있다.

 

 

일반적으로 잘 사용하지 않는다

 

 

 

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

 

 

 

 

 

 

 

 

 


 

 

 

 

지금까지 의존관계 주입 방법에 대해 알아보았다.

 

일반적인 경우 생성자 주입을 사용한다.

 

 

 

 

 

 

 

 

참고: 어쩌면 당연한 이야기이지만

의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다.

스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코드를 적용해도

아무 기능도 동작하지 않는다.

 

 

 

 

 

 

 

반응형