
Spring Boot Bean 객체 의존성 주입 방식,
@Autowired ? @RequiredArgsConstructor ? 뭐가 좋을까
- 기본적인 차이
| @Autowired | @RequiredArgsConstructor |
| 필드 주입 | 생성자 주입 |
| 가변성 (final 불가) | 불변성 (final 붙음) |
| springframework beans factory annotation | lombok annotation |
| 필드 변수에 설정 | 클래스에 설정 (한방~) |
| Runtime Exception | Compile Exception |
기본적인 차이만 보면 @RequiredArgsConstructor를 쓰는게 무조건 좋아보인다.
- 이거 왜 쓰는데?
기본적으로 Bean 객체를 생성한 후 다른 클래스에서 해당 Bean을 불러오기 위해 DI(Dependency Injection)을 해주어야한다. 이러한 DI를 간단한 어노테이션을 붙여 실행할 수 있도록 한 것이다.
- @Autowired
@Service
public class ServiceA {
@Autowired
private final ServiceB serviceB;
@Autowired
private final ServiceC serviceC;
public String helloworld(){
return serviceB.hello() + serviceC.world();
}
}
@Service
public class ServiceB {
public String hello() {
return "hello";
}
}
@Service
public class ServiceC {
public String world() {
return "world";
}
}
Autowired는 Type을 기준으로 Bean을 사용한다. 하지만 같은 Type이 두개 이상이면 참조 변수와 이름이 동일한 Bean을 사용한다. 또는 @Qualifier, @Primary 등을 통해 주입될 Bean을 별도 지정하여 Bean 객체를 찾을 수 있도록 해준다.
가장 큰 단점이라고 생각되는 부분은 final 옵션이 사용 불가능해 코드의 변질이 일어날 수 있다는 점이다. 더하여 실제 해당하는 메서드가 실행되기 전까지 순환참조가 일어나는지 알 수 없다.
- @RequiredArgsConstructor
@Service
@RequiredArgsConstructor
public class ServiceA {
private final ServiceB serviceB;
private final ServiceC serviceC;
public String helloworld(){
return serviceB.hello() + serviceC.world();
}
}
@Service
public class ServiceB {
public String hello() {
return "hello";
}
}
@Service
public class ServiceC {
public String world() {
return "world";
}
}
Autowired의 단점을 모두 잡은 이 친구는 어떠한가! 두 말할 것 없이 완벽하다고 생각한다. (개인적인 견해)
그나마 단점으로는 Lombok 의존성을 추가해야 사용할 수 있기 때문에 버전에 따라 동작하지 않을 수 있고, Spring Framework를 이용할 경우 dependency 추가가 까다롭다고한다. (필자는 Boot 사용자라서 경험해 보지 못했다.) 또한, 필수 필드가 아닌 선택적 필드에 대해서는 수동으로 생성자를 오버로딩해주어야한다. (이거 Autowired도 마찬가지 아닌가..? 흠)
- 그래서 뭐쓰라고
적용이 가능하다면 @RequiredArgsConstructor를 사용하길 권장한다. Spring 공식 문서에서도 이렇게 이야기한다. 앞서 말했듯 객체의 불변성을 확보하고, 의존관계 설정 또는 순환참조 에러가 컴파일에서 인지 된다는 점이 편하기도 하다. (테스트 안해도 실행만하면 알려준다고~)
'Back-End > Spring Boot' 카테고리의 다른 글
| [Spring Boot] Controller vs RestController (0) | 2025.05.13 |
|---|---|
| [Spring Boot] 순환 참조 해결하기 (2) | 2025.05.13 |
| [Spring Boot] IntelliJ Spring Boot Project 생성 파일 분석 (0) | 2025.05.13 |
| [Spring Boot] FFmpeg + 스프링부트 연동 및 사용하기 (0) | 2025.05.12 |
| [Spring Boot] Global Exception, 무지성 try-catch 멈춰! (0) | 2025.05.11 |