여니의 프로그래밍 study/Spring & Spring Boot

[스프링부트] @Autowired와 private final 차이점

여니's 2022. 3. 22. 11:35

 

 

책을 읽으며

따라하다 보니까

의문이 생겼습니다. 

 

어떤 클래스에서는

@ Autowired를 쓰고,

 

또 어떤 클래스에서는

private final을 이용해서 의존성을 주입하고,,

 

둘의 차이가 궁금해졌습니다. 

 


일단 스프링 프레임워크에서

의존성을 주입하는 방식은 총 3가지 입니다 .

 

 

 

private final (생성자 주입 : Constructor Injection)

> 생성자 기반 DI

 

 

@Autowired ( 필드 주입 : Field Injection)

> 필드에 자동으로 의존성이 주입됩니다.

 

 

setter (수정자 주입 : Setter Injection)

> 수정자 주입

 

 

참고로 @Autowired와 seeter는 

필드를 final로 선언할 수 없습니다.

 


 

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

@Autowired보다

private final 방식이 더 권장하는 방식이라는 말이죠!

 

 

 

생성자로 Bean 객체를 받도록 하면

@Autowired와 동일한 효과를 볼 수 있습니다. 

 

 

 

 

@RequiredArgsConstructor은

final이 선언된 모든 필드를 인자값으로 하는 생성자를 

생성해줍니다.

 

 

 

생성자를 직접 안 쓰고 롬북 어노테이션인

@RequiredArgsConstructor을

사용하는 이유는

해당 클래스의 의존성 관계가 변경될 때마다

생성자 코드를 계속해서 수정하는 번거로움을 해결하기 위함입니다. 

 

 


 

생성자 주입 방법이 더 권장되는 이유에 대해

좀 더 자세히 알아봤습니다.

 

 

< 생성자 주입(Constructor Injection) 방식의 장점>

1. 순환 참조 방지

2. 테스트 용이

3. final 선언 가능 = 불변성 보장

 

 

 

1. 순환 참조를 방지할 수 있습니다.

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

그러나 생성자 주입은 먼저 빈을 생성하지 않고, 주입하려는 빈을 찾습니다.

따라서 생성자 주입을 사용하면 

서버 자체가 구동이 되지 않으므로 순환 참조가 실행되면서 방지할 수 있습니다. 

(사전에 순환 참조 방지 가능)

 

https://eboong.tistory.com/524

 

[스프링부트] 순환 참조 문제란?

순환 참조 문제란 정확히 무엇일까요? A 클래스가 B 클래스의 Bean을 주입받고, B 클래스가 A 클래스의 Bean을 주입받는 상황으로 서로 순환되어 참조할 경우, 발생하는 문제입니다. 이 문제가 왜 일

eboong.tistory.com

 

2. 테스트에 용이합니다. 

: 테스트하고자 하는 클래스에 필드 주입이나 수정자 주입으로 빈이 주입되어 있다면,

Mockito를 통해 테스트를 진행해야 합니다.

 

하지만 생성자 주입은 

단순히 원하는 객체를 생성하고, 

생성자에 넣어주면 됩니다! 

 

 

 

3. final 선언 가능 = 불변성 보장

: 필드 주입과 수정자 주입은 final로 선언이 불가합니다.즉 언제든 변경이 될 수 있다는 의미입니다.하지만 생성자 주입은 final로 필드 선언이 가능합니다!즉 런타임에 객체 불변성을 보장합니다. 

 

 

 

 

 

 

 


 

참고서적 및 링크

: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

https://jackjeong.tistory.com/41

 

[Spring] 생성자 주입 vs 필드 주입 (@Autowired)

안녕하세요~ 잭코딩입니다! 이번에는 스프링 프레임워크에서 의존성을 주입하는 방법을 살펴보고 어떤 방식으로 주입하는 게 좋은지 살펴볼까요? 우선 결론부터 말하자면 생성자 주입 (Constructo

jackjeong.tistory.com

https://ch4njun.tistory.com/269

 

[Spring Boot] 순환참조문제

순환참조문제란? 위 예외는 애플리케이션 로딩 과정에서 순환참조가 발생함을 알리는 예외이다. 순환참조 문제란 A 클래스가 B 클래스의 Bean 을 주입받고, B 클래스가 A 클래스의 Bean 을 주입받는

ch4njun.tistory.com