공부해봅시당
[Spring] @Autowired와 @ RequiredArgsConstructor 중 더 선호되는 것은? 본문
@Autowired와 @RequiredArgsConstructor
@Autowired와 @RequiredArgsConstructor는
스프링(Spring) 프레임워크에서 의존성 주입(Dependency Injection)을 위해 사용되는 어노테이션
기준 | @Autowired | @RequiredArgsConstructor |
정의 | 스프링 컨테이너가 자동으로 의존성을 주입해주는 어노테이션. 필드, 생성자, Setter 메소드에 사용될 수 있음. |
Lombok 라이브러리의 어노테이션으로, final이나 @NonNull 어노테이션이 붙은 필드에 대해 생성자를 자동으로 생성함. |
공통점 | 의존성 주입을 자동화하여 개발자가 수동으로 의존성을 관리하는 부담을 줄임. | |
차이점 | - 다양한 방식(필드, 메소드, 생성자)의 의존성 주입 제공 - 스프링 프레임워크에 종속적 |
- 생성자 주입만을 지원 - Lombok 라이브러리에 종속적 |
장점 | - 사용이 간편함 - 다양한 주입 방식을 지원하여 유연성 제공 |
- 생성자 주입을 통해 불변성 확보 - 의존성 주입 코드의 양을 줄여줌 - 순환 참조 방지에 유리 |
단점 | - 필드 주입의 경우 순환 참조 문제 발생 가능 - 테스트가 어려울 수 있음 |
- Lombok 추가 설정 필요 - IDE에 Lombok 플러그인 설치 필요 |
사용처 | - 스프링 프로젝트 전반적으로 널리 사용됨 - 개발자가 직접 의존성 관리를 피하고 싶을 때 사용 |
- 불변 객체를 선호하는 경우 - 생성자 주입을 선호하며 코드를 간결하게 유지하고 싶을 때 사용 |
@Autowired는 스프링의 강력한 의존성 주입 기능을 다양한 방식으로 활용하고자 할 때 유용
특히, 간단한 프로토타입이나 스프링 기반의 애플리케이션에서 광범위하게 사용
@RequiredArgsConstructor는 Lombok을 사용하여 생성자 기반의 의존성 주입을 간결하게 하고 싶을 때 선택하는 방식
이는 불변 객체의 사용을 촉진하고, 생성자 주입을 통해 테스트 용이성과 순환 참조 방지 등의 이점을 제공
더 선호되는 것은?
@Autowired와 @RequiredArgsConstructor 중 어느 것이 더 선호되는지는 프로젝트의 요구사항, 개발 팀의 선호도, 프로젝트의 복잡성 등 여러 요소에 따라 달라질 수 있음
그러나 최근의 개발 트렌드와 스프링 커뮤니티의 권장 사항을 고려할 때, 더 선호되는 어노테이션이 있음
생성자 주입(Constructor Injection)의 선호
스프링 팀의 권장사항
스프링 프레임워크 개발팀은 생성자 기반의 의존성 주입을 권장
생성자 주입은 불변성(immutability)을 보장하고, 의존성이 명시적이며, 테스트 용이성을 향상시키기 때문
코드의 명확성과 안정성
생성자 주입은 필요한 의존성이 누락되었을 때 컴파일 타임에 이를 알아챌 수 있게 해, 더 안정적인 코드를 작성할 수 있도록 도움
@RequiredArgsConstructor의 인기
Lombok 라이브러리의 활용
@RequiredArgsConstructor는 Lombok 라이브러리를 통해 제공되는 어노테이션으로, 필요한 final 필드나 @NonNull 필드에 대한 생성자를 자동으로 생성
이는 코드의 양을 상당히 줄여주며, 개발자가 의존성 주입 코드에 대해 걱정할 필요가 없게 만들어 줌
유지보수성과 가독성 향상
자동 생성된 생성자를 통해 코드의 가독성과 유지보수성이 향상됨
개발자는 클래스가 어떤 의존성을 요구하는지 한눈에 파악할 수 있고, Lombok이 생성자 코드를 관리해줌으로써 코드 베이스를 깔끔하게 유지할 수 있음
결론
개발 커뮤니티와 스프링 팀의 권장 사항에 따르면, @RequiredArgsConstructor를 사용한 생성자 주입 방식이 더 선호되는 경향이 있음
이 방식은 코드의 안정성과 유지보수성을 높이고, 불변 객체의 사용을 장려하며, 순환 참조 문제를 방지하는 등의 이점을 제공
그러나 프로젝트의 특정 상황이나 개발자의 선호도에 따라 @Autowired를 사용할 수도 있으며, 특히 단순하거나 소규모 프로젝트에서는 @Autowired의 유연성이 유리할 수 있으므로 상황에 따라 선택하여 작성할 수 있어야 함
참조
https://madplay.github.io/post/why-constructor-injection-is-better-than-field-injection
생성자 주입을 @Autowired를 사용하는 필드 주입보다 권장하는 하는 이유
@Autowired를 사용하는 의존성 주입보다 생성자 주입(Constructor Injection)을 더 권장하는 이유는 무엇일까?
madplay.github.io
'STUDY > Spring' 카테고리의 다른 글
[Spring] 필터(Filter) vs 인터셉터(Intercepter) (2) | 2024.02.28 |
---|---|
[Spring] @SpringBootTest와 @DataJpaTest (0) | 2024.02.23 |
[Spring] EJB(Enterprise JavaBeans) (0) | 2024.02.23 |
[쉽게 배우자! Spring Triangle 3] PSA에 대해서 쉽게 이해해보자 (0) | 2024.02.23 |
[쉽게 배우자! Spring Triangle 2] AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)를 쉽게 이해해보자(feat. IoC/DI) (0) | 2024.02.23 |