Developer Cafe

생성자 주입(@RequiredArgsConstructor) vs 필드 주입(@Autowired) 차이 본문

Spring/어노테이션

생성자 주입(@RequiredArgsConstructor) vs 필드 주입(@Autowired) 차이

개발자 카페 2021. 5. 11. 17:23
728x90

취업전 공부할땐 @Autowired를 통해 의존성을 주입했는데,

public class AB {
	@Autowired
	private A a;
}

회사에선 @RequiredArgsConstructor을 이용해 의존성을 주입하더라고요...

@RequiredArgsConstructor
public class AB {
	private final A a;
}
오늘 그 차이점에 대해 기술하고자 합니다.


우선 스프링 프레임 워크에서 의존성을 주입하는 방법엔 3가지가 있습니다.

 

  • 생성자 주입
  • 필드 주입
  • 수정자 주입

스프링팀에선 생성자 주입이 아니라면 아래의 문구를 보여줍니다.

"스프링 팀에서는 생성자 주입(constructor injection) 방식을 추천하고 있습니다."

Spring Team recommends:
"Always use constructor based dependency injection in your beans.
Always use assertions for mandatory dependencies".

그 이유는 3가지가 있습니다.

 

  1.  순환 참조 방지
  2.  final 선언이 가능 (런타임에 객체 불변성을 보장한다.)
  3.  테스트 코드 작성 용이 (단순히 원하는 객체를 생성한 후, 생성자에 넣어주면 된다.)

순환 참조 방지

객체의 의존성을 추가하다 보면 순환 참조 문제가 발생할 수 있습니다. A가 B를 참조하고, B가 A를 참조하는데 이러면 서버가 죽어버립니다.

그 이유는 필드 주입과 수정자 주입은 먼저 빈을 생성한 후, 주입하려는 빈을 찾아 주입합니다.

따라서 객체 생성 시점에 빈을 주입하기 때문에 서로 참조하는 객체가 생성되지 않은 상태에서 그 빈을 참조하기 때문에 오류가 발생합니다.

그리고 생성자 주입은 먼저 생성자의 인자에 사용되는 빈을 찾거나 빈 팩토리에서 만듭니다.

즉, 먼저 빈을 생성하지 않고 주입하려는 빈을 먼저 찾습니다.

728x90

'Spring > 어노테이션' 카테고리의 다른 글

@Deprecated  (0) 2021.05.13
@RestController  (0) 2021.05.13
@NOARGSCONSTRUCTOR , @ALLARGSCONSTRUCTOR , @REQUIREDARGSCONSTRUCTOR 차이  (0) 2021.05.04
@After, @postsRepository.save  (0) 2021.03.22
@Column, @NoArgsConstructor  (0) 2021.03.18
Comments