web/SpringBoot

[REST API] @Autowired vs @RequiredArgsConstructor

뽀리님 2023. 11. 16. 15:32

일단 시작하기전에

스프링 공식 문서에서는 생성자를 통한 의존성(@RequiredArgsConstructor) 주입 (DI) 권장하고 있다.

 

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

(번역하자면 대충 쓰지말란 소리다)

 

 

@Autowired도  예전에 나는 많이 썼었다. 일단 편하기때문이지!

하지만  final 옵션을 사용할 수 없기에, 의존성 주입하고 코드가 변질되어도 알 수가 없다.

또한 중복으로 참조가 가능하다.-> 런타임시 에러발생

아래에 예제 참조가 잘나와있다.

https://madplay.github.io/post/why-constructor-injection-is-better-than-field-injection

 

생성자 주입을 @Autowired를 사용하는 필드 주입보다 권장하는 하는 이유

@Autowired를 사용하는 의존성 주입보다 생성자 주입(Constructor Injection)을 더 권장하는 이유는 무엇일까?

madplay.github.io

 

 

그래서 우린 생성자주입을 써야 한단것이에오.

 

@RequiredArgsConstructor의 특징은 다음과 같다.

  • 이 어노테이션은 Lombok에서 지원하는 어노테이션이다.
  • 필드 주입처럼 보이지만 @RequiredArgsConstructor를 사용하면 생성자로 의존성 주입을 한다.
  • final 키워드가 붙은 필드에 대해 생성자를 만들어준다.
  • 스프링 개발팀에서 생성자 주입을 사용할 것을 권장하는 이유는 한번 의존성 주입을 받은 객체는 프로그램이 끝날 때까지 변하지 않는 특징을 가지므로 불변성을 표시해주는 것이 좋기 때문이다. -> 객체의 불변성(Immutability) 보장

 

결론,

@Bean 이 하나만 있다면 상관없지만, 같은 타입의 다른이름의 @Bean 이 있을 경우 @Autowired 를 쓰게된다면, 런타임시 에러가 발생하지만, @RequiredArgsConstructor 이용은 컴파일시에 이걸 알려주므로 (final) 그만큼 위험부담이 더 적고 안전하게 개발할 수 있겠다,

 

 

 

참조

https://backendcode.tistory.com/209

https://upcake.tistory.com/417