<aside> 💡 글의 목적 필드 의존성 주입과 setter 의존성 주입, 생성자 의존성 주입에 관한 차이를 알아가기

</aside>

A. 문제의 발단

코드 컨밴션의 존재하지 않아, 프로젝트 내에 코드의 일관성이 일치하지 않는 현상이 발생하였다. 그 중 하나로 의존성 주입하는 방식이 거론되어, 의존성 주입 방식의 차이와 실제 오류가 발생하는지를 알아보게 되었다.

의존성 주입 방식에는 크게 3가지가 존재한다.

  1. 필드 의존성
  2. 생성자 의존성
  3. setter 의존성

1. 필드 의존성 주입 (Field Injection)

public class A {
	@Autowired
	private AService aService;
}

2. setter 의존성 주입 (Setter based Injection)

public class A {
	private AService aService;

	@Autowired
	public void setAService(AService aService){
		this.aService = aService;
	}
}

3. 생성자 의존성 주입 (Constructor based Injection)

// 의존성 주입 대상이 한 개일 경우, 생성자에 @Autowired 어노테이션을 붙이지 않아도 된다.
public class A {
	private final AService aService;

	public A(AService aService){
		this.aService = aService;
	}
}

// 의존성 주입 대상이 2개이상인 경우, 생성자에 @Autowired 어노테이션을 붙여야 한다.
public class A {
	private final AService aService;
	private final BService bService;

	@Autowired
	public A(AService aService, BSerivce bService){
		this.aService = aService;
		this.bService = vService;
	}
}

B. 차이점: Bean 주입 순서

1. 필드 의존성 주입

  1. 주입 받으려는 빈의 생성자를 호출하여, 빈을 찾거나 빈 팩토리에 등록한다.
  2. 생성자 인자를 사용하는 빈을 찾거나 만든다.
  3. 필드에 주입한다.

2. Setter 의존성 주입

  1. 주입받으려는 빈의 생성자를 호출하여, 빈을찾거나 빈 팩토리에 등록한다.