새소식

개발

[Spring] Bean을 주입받을때, @Autowired는 권장되지 않음

  • -

Bean을 주입받을때, @Autowired는 권장되지 않음

IntelliJ에서 @Autowired를 사용하다보면 다음과 같은 메세지를 종종 보게된다.

필드주입은 권장되지 않는다. 생성자 주입을 사용.

Spring에서 Bean을 주입받는 방법은 아래와 같다.

  • @Autowired
  • setter
  • 생성자

이중 가장 권장하는 방식이 생성자로 주입받는 방식이다.

생성자 주입을 권고하는 이유

  1. 순환참조 방지
  2. final 선언
  3. 테스트코드 작성의 용이

1. 순환참조방지

생성자 주입방식은 먼저 생성자의 인자에 사용되는 Bean을 찾거나 Bean Factory에서 만든다. 그 후에 찾은 인자 Bean으로 주입하려는 Bean의 생성자를 호출한다.
⇒ 먼저 Bean을 생성하지 않고 주입하려는 Bean을 먼저 찾는다.
setter@Autowired 방식은 먼저 Bean을 생성한 후, 주입하려는 Bean을 찾아 주입

2. final 선언

생성자 주입의 경우 필드를 final로 선언할 수 있다.
⇒ 런타임에 객체 불변성을 보장받는다.

3. 테스트 코드 작성의 용이

생성자 주입의 경우 단순히 원하는 객체를 생성한 후 생성자에 넣어줌
Mocking없이 테스트코드를 작성

결론

Lombok의 @RequiredArgsConstructor 은 그 번거로움을 해결해준다. final이 선언된 모든 필드를 인자값으로 하는 생성자를 롬복의 @RequiredArgsConstructor가 대신 생성해주기 때문에 위 와 같은 상황을 나도 모르게 방지 할 수 있다.

번외 @AllArgsConstructor

@AllArgsConstructor 는 클래스 내 모든 필드의 생성자를 생성해주는데 이 어노테이션을 사용하면 final이 없이도 생성자 주입이 가능하다. 하지만 위에서 언급한 내용과 같이 객체의 불변성을 보장받을수 없고 불필요한 의존성이 추가되어 코드의 복잡도가 높아질 수 있으므로 되도록이면 final을 곁들인 @RequiredArgsConstructor를 사용하는것이 좋아보인다.

출처
https://jackjeong.tistory.com/41

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.