본문 바로가기

Spring Boot

@requiredargsconstructor @autowired 차이

반응형

@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 사용이 권장되는 경우

  1. 불변성이 필요한 경우
  2. 단위 테스트를 작성해야 하는 경우
  3. 명시적인 의존성 표현이 필요한 경우
  4. 순환 참조를 방지해야 하는 경우
@Service
@RequiredArgsConstructor
public class OrderService {
    private final OrderRepository orderRepository;
    private final PaymentService paymentService;
    
    public void processOrder(Order order) {
        // 비즈니스 로직
    }
}

 

 


@Autowired가 유용한 경우

  1. 선택적 의존성이 필요한 경우
  2. 많은 의존성을 주입해야 하는 레거시 코드를 다룰 때
  3. 테스트에서 Mock 객체를 주입해야 하는 경우
@Component
public class LegacyComponent {
    @Autowired(required = false)
    private OptionalDependency optionalDependency;
    
    @Autowired
    private List<Plugin> plugins;
}

 


왜 생성자 주입을 선호하는가?

스프링 팀은 생성자 기반 주입을 권장하며, 이는 다음과 같은 이유가 있습니다

  1. 불변성 보장: final 필드 사용 가능
  2. 순환 참조 방지: 컴파일 시점에 순환 참조 감지
  3. 테스트 용이성: 명시적인 의존성으로 단위 테스트 작성 용이
  4. 컴파일 시점 오류 감지: 필요한 의존성이 누락된 경우 컴파일 오류 발생

참고 사항

  • 스프링 프레임워크 5.0 이상에서는 생성자가 하나만 있는 경우 @Autowired를 생략할 수 있습니다.
  • Lombok의 @RequiredArgsConstructor는 보일러플레이트 코드를 줄여주어 더 깔끔한 코드 작성을 가능하게 합니다.

의존관계 주입에대한 참고한 사이트

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

반응형