책을 읽으며
따라하다 보니까
의문이 생겼습니다.
어떤 클래스에서는
@ 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
2. 테스트에 용이합니다.
: 테스트하고자 하는 클래스에 필드 주입이나 수정자 주입으로 빈이 주입되어 있다면,
Mockito를 통해 테스트를 진행해야 합니다.
하지만 생성자 주입은
단순히 원하는 객체를 생성하고,
생성자에 넣어주면 됩니다!
3. final 선언 가능 = 불변성 보장
: 필드 주입과 수정자 주입은 final로 선언이 불가합니다.즉 언제든 변경이 될 수 있다는 의미입니다.하지만 생성자 주입은 final로 필드 선언이 가능합니다!즉 런타임에 객체 불변성을 보장합니다.
참고서적 및 링크
: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
https://jackjeong.tistory.com/41
https://ch4njun.tistory.com/269
'여니의 프로그래밍 study > Spring & Spring Boot' 카테고리의 다른 글
[스프링부트] PostApiControllerTest.java (게시글 등록) (0) | 2022.03.22 |
---|---|
[스프링부트] given - when - then 패턴 (0) | 2022.03.22 |
[스프링부트] 순환 참조 문제란? (0) | 2022.03.22 |
[스프링부트] 트랜잭션의 의미와 사용 이유 (0) | 2022.03.22 |
[스프링부트] 실제로 실행된 쿼리 보는 방법 (0) | 2022.03.21 |