[Spring] 의존 관계 주입(DI)

노아카프카·2022년 6월 9일
0

의존관계 주입 방법


1. 생성자 주입

  • 불변, 필수 의존관계에 사용

  • 생성자 호출 시점에 딱 한 번만 생성된다.

  • 생성자가 하나면 @Autowired 안 해줘도 자동으로 의존관계 주입이 일어남.

  • final을 통해서 반드시 값이 있어야 한다.

@component
public class OrderServiceImpl implements OrderService{
	private final MemberRepository memberRepository;
    
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
}

2. Setter 주입(수정자 주입)

  • set 메소드에서 의존관계 주입을 한다.
  • 선택적, 변경가능한 의존관계에 사용.
  • 주입할 대상이 없으면 오류가 발생함. 대상이 없어도 동작하게 하려면 아래와 같이 지정
    --> @Autowired(required = false)
  • @Autowired 어노테이션을 반드시! 붙여야 한다.
@component
public class OrderServiceImpl implements OrderService{
	private final MemberRepository memberRepository;
 	
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
}

e.g) 자바빈 프로퍼티 : 필드의 값을 직접 변경하지 않고, set,get Method를 활용해서 값을 읽거나 수정하는 규칙.


3. 필드 주입

  • 필드 자체에 직접 주입하는 방식.
  • 권장되지 않는 방식.
  • Why? 외부에서 변경할 수가 없다. -> 테스트 하기가 힘들다.
  • DI 프레임워크에 의존적이다.
    - 애플리케이션 코드와 관련없는 테스트코드
    • 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별히 사용
@component
public class OrderServiceImpl implements OrderService{
	@Autowired private final MemberRepository memberRepository;   
}

4. 일반 메서드 주입

  • 아무 메서드에 @Autowired를 쓸 수 있다.
  • 사실상 setter 주입과 유사하다고 생각하면 된다.
  • 한번에 여러 필드를 주입받는다.
@component
public class OrderServiceImpl implements OrderService{
	private MemberRepository memberRepository;
 	
    @Autowired
    public void init(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
}

0개의 댓글