본문 바로가기
블로그 이미지
Dev-RiQ
Back-end Developer Studying Record
✉️ lwk525678@gmail.com
Back-End/Spring Boot

[Spring Boot] 의존성 주입, @Autowired vs @RequiredArgsConstructor

by Dev-RiQ 2025. 5. 13.

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 공식 문서에서도 이렇게 이야기한다. 앞서 말했듯 객체의 불변성을 확보하고, 의존관계 설정 또는 순환참조 에러가 컴파일에서 인지 된다는 점이 편하기도 하다. (테스트 안해도 실행만하면 알려준다고~)

 

블로그 이미지
Dev-RiQ
Back-end Developer Studying Record
✉️ lwk525678@gmail.com