@AutoWired 랑 @RequiredArgsConstructor 차이

Yeeun·2025년 6월 2일
0

SpringBoot

목록 보기
42/46

위에껀 public SecurityConfig(OAuth2SuccessHandler successHandler)라는 생성자가 자동 생성되어 매개변수로 final붙은 필드애들을 자동 생성하여 주입하는것이고

만약 final 없애고, @RequiredArgsConstructor 없애고
@Autowired
private OAuth2SuccessHandler successHandler;
라고 했다면 세터처럼 ( 생성자가 아니라 이 객체를 따로 호출, 생성하는 메소드)
해당 객체를 생성하는 메소드가 실행되어 해당 객체가 이 클래스 내에 사용될 수 있도록 인스턴스화 되는 것.

아무튼 RequiredArgsConstructor 는 생성자의 매개변수로 해당 객체를 필요로 하므로 , 위와 아래는 차이가 있음.


1. @RequiredArgsConstructor 사용 (생성자 주입, Constructor Injection)

private final OAuth2SuccessHandler successHandler;

@RequiredArgsConstructor 어노테이션이 있으면,
Lombok이 final 필드 또는 @NonNull 필드만을 매개변수로 받는 생성자를 자동으로 만들어줍니다.
즉, 아래와 같이 변환됩니다:

public SecurityConfig(OAuth2SuccessHandler successHandler) {
    this.successHandler = successHandler;
}

이 방식은 생성자 주입(Constructor Injection)이며,
객체가 생성될 때 반드시 필요한 의존성을 받아야 하므로,
Spring이 해당 빈을 생성할 때 의존성 주입이 한 번에 이루어집니다[5][9].


2. @Autowired 필드 주입 (Field Injection)

@Autowired
private OAuth2SuccessHandler successHandler;

이 방식은 필드 주입(Field Injection)입니다.
Spring이 빈을 생성한 이후,
필드에 직접 의존성을 주입합니다.
즉, 객체를 생성할 때는 의존성이 없고,
나중에 Spring이 Reflection을 통해 직접 필드에 주입합니다[6][9].


3. 차이점 요약

구분@RequiredArgsConstructor (생성자 주입)@Autowired (필드 주입)
주입 방식생성자로 의존성 주입필드에 직접 의존성 주입
객체 생성 시점객체 생성 시점에 필수 의존성 주입객체 생성 후, Spring이 주입
불변성final 필드 사용 가능, 불변성 보장불변성 보장 불가
테스트 용이성테스트 시 의존성 주입 쉬움테스트 시 의존성 주입 어려움
순환 참조컴파일/런타임 시 순환 참조 체크 가능순환 참조가 더 쉽게 발생할 수 있음
권장 여부권장됨권장되지 않음

4. 추가 설명

  • @RequiredArgsConstructor는 생성자 주입을 간편하게 만들어주는 Lombok 기능입니다.
    생성자 주입은 Spring에서 권장하는 방식이며,
    테스트 용이성과 불변성, 순환 참조 체크 등 여러 장점이 있습니다[3][7][9].
  • @Autowired 필드 주입은 코드가 간단하지만,
    테스트가 어렵고, 불변성을 보장할 수 없으며,
    순환 참조가 발생하기 쉽습니다[6][9].

결론

  • @RequiredArgsConstructor는 생성자 주입을 자동화해주어,
    객체 생성 시점에 의존성을 주입받는 방식입니다.
  • @Autowired 필드 주입은 객체 생성 후 Spring이 Reflection으로 의존성을 주입하는 방식입니다.
  • 두 방식은 의존성 주입 시점, 불변성, 테스트 용이성, 순환 참조 체크 등에서 차이가 있습니다.
  • 생성자 주입(즉, @RequiredArgsConstructor 사용)이 더 권장됩니다.[3][7][9]

Citations:
[1] https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/54916126/0b43d128-5718-4cc6-b9d5-b2567ec30b56/paste.txt
[2] https://velog.velcdn.com/images/yeeun234/post/6e9b5724-8086-4c28-bea8-6eaefde51243/image.png
[3] https://www.linkedin.com/pulse/comparing-autowired-requiredargsconstructor-software-narang-arora-oygbc
[4] https://www.tutorialspoint.com/difference-between-constructor-injection-and-setter-injection-in-spring
[5] https://www.baeldung.com/java-lombok-constructor-annotation
[6] https://dev.to/felixcoutinho/you-should-stop-using-spring-autowired-p8i
[7] https://www.reddit.com/r/SpringBoot/comments/1e9kzyw/constructor_injection_vs_field_injection/
[8] https://smartprogramming.in/tutorials/spring-framework/difference-between-constructor-injection-and-setter-injection-in-spring
[9] https://programmer7895.tistory.com/64
[10] https://blog.naver.com/khs1107y/222805906723
[11] https://upcake.tistory.com/417
[12] https://ssmyefrin.tistory.com/40


Answer from Perplexity: pplx.ai/share

0개의 댓글