반응형
@Autowired란?
Autowired는 스프링 프레임워크에서 제공하는 어노테이션으로, 필드, 생성자, 메서드에 사용할 수 있습니다. 스프링 컨테이너가 자동으로 해당 타입의 빈을 찾아 주입해줍니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private EmailService emailService;
}
@RequiredArgsConstructor란?
@RequiredArgsConstructor는 Lombok 라이브러리에서 제공하는 어노테이션으로, final 또는 @NonNull로 표시된 필드에 대한 생성자를 자동으로 생성해줍니다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
}
차이점
1. 생성 시점
- @Autowired: 객체 생성 후 의존성 주입
- @RequiredArgsConstructor: 객체 생성 시점에 의존성 주입
2. 불변성
- @Autowired: 필드를 final로 선언할 수 없음
- @RequiredArgsConstructor: final 필드 사용 가능, 불변성 보장
3. 테스트 용이성
- @Autowired: 리플렉션을 사용한 의존성 주입으로 테스트가 어려울 수 있음
- @RequiredArgsConstructor: 생성자 기반 주입으로 테스트가 용이
@RequiredArgsConstructor 사용이 권장되는 경우
- 불변성이 필요한 경우
- 단위 테스트를 작성해야 하는 경우
- 명시적인 의존성 표현이 필요한 경우
- 순환 참조를 방지해야 하는 경우
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final PaymentService paymentService;
public void processOrder(Order order) {
// 비즈니스 로직
}
}
@Autowired가 유용한 경우
- 선택적 의존성이 필요한 경우
- 많은 의존성을 주입해야 하는 레거시 코드를 다룰 때
- 테스트에서 Mock 객체를 주입해야 하는 경우
@Component
public class LegacyComponent {
@Autowired(required = false)
private OptionalDependency optionalDependency;
@Autowired
private List<Plugin> plugins;
}
왜 생성자 주입을 선호하는가?
스프링 팀은 생성자 기반 주입을 권장하며, 이는 다음과 같은 이유가 있습니다
- 불변성 보장: final 필드 사용 가능
- 순환 참조 방지: 컴파일 시점에 순환 참조 감지
- 테스트 용이성: 명시적인 의존성으로 단위 테스트 작성 용이
- 컴파일 시점 오류 감지: 필요한 의존성이 누락된 경우 컴파일 오류 발생
참고 사항
- 스프링 프레임워크 5.0 이상에서는 생성자가 하나만 있는 경우 @Autowired를 생략할 수 있습니다.
- Lombok의 @RequiredArgsConstructor는 보일러플레이트 코드를 줄여주어 더 깔끔한 코드 작성을 가능하게 합니다.
의존관계 주입에대한 참고한 사이트
https://madplay.github.io/post/why-constructor-injection-is-better-than-field-injection
반응형
'Spring Boot' 카테고리의 다른 글
| [Spring Boot] 스프링부트에서 WebSocket, STOMP를 이용한 채팅기능 구현하기 (2) - 도메인 모델과 Redis 연동 (3) | 2024.11.29 |
|---|---|
| [Spring Boot] 스프링부트에서 WebSocket, STOMP를 이용한 채팅기능 구현하기 (1) (0) | 2024.11.25 |
| 단위 테스트에서 private 메소드 테스트가 필요한가? (4) | 2024.10.28 |