
위에껀 public SecurityConfig(OAuth2SuccessHandler successHandler)라는 생성자가 자동 생성되어 매개변수로 final붙은 필드애들을 자동 생성하여 주입하는것이고
만약 final 없애고, @RequiredArgsConstructor 없애고
@Autowired
private OAuth2SuccessHandler successHandler;
라고 했다면 세터처럼 ( 생성자가 아니라 이 객체를 따로 호출, 생성하는 메소드)
해당 객체를 생성하는 메소드가 실행되어 해당 객체가 이 클래스 내에 사용될 수 있도록 인스턴스화 되는 것.
아무튼 RequiredArgsConstructor 는 생성자의 매개변수로 해당 객체를 필요로 하므로 , 위와 아래는 차이가 있음.
private final OAuth2SuccessHandler successHandler;
@RequiredArgsConstructor 어노테이션이 있으면,
Lombok이 final 필드 또는 @NonNull 필드만을 매개변수로 받는 생성자를 자동으로 만들어줍니다.
즉, 아래와 같이 변환됩니다:
public SecurityConfig(OAuth2SuccessHandler successHandler) {
this.successHandler = successHandler;
}
이 방식은 생성자 주입(Constructor Injection)이며,
객체가 생성될 때 반드시 필요한 의존성을 받아야 하므로,
Spring이 해당 빈을 생성할 때 의존성 주입이 한 번에 이루어집니다[5][9].
@Autowired
private OAuth2SuccessHandler successHandler;
이 방식은 필드 주입(Field Injection)입니다.
Spring이 빈을 생성한 이후,
필드에 직접 의존성을 주입합니다.
즉, 객체를 생성할 때는 의존성이 없고,
나중에 Spring이 Reflection을 통해 직접 필드에 주입합니다[6][9].
| 구분 | @RequiredArgsConstructor (생성자 주입) | @Autowired (필드 주입) |
|---|---|---|
| 주입 방식 | 생성자로 의존성 주입 | 필드에 직접 의존성 주입 |
| 객체 생성 시점 | 객체 생성 시점에 필수 의존성 주입 | 객체 생성 후, Spring이 주입 |
| 불변성 | final 필드 사용 가능, 불변성 보장 | 불변성 보장 불가 |
| 테스트 용이성 | 테스트 시 의존성 주입 쉬움 | 테스트 시 의존성 주입 어려움 |
| 순환 참조 | 컴파일/런타임 시 순환 참조 체크 가능 | 순환 참조가 더 쉽게 발생할 수 있음 |
| 권장 여부 | 권장됨 | 권장되지 않음 |
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