본문 바로가기
Study/Spring

[Spring] @RequiredArgsConstructor와 @Autowired

by Lpromotion 2024. 10. 3.

Spring 프레임워크에서 의존성 주입(Dependency Injection)을 위해 다양한 어노테이션을 사용한다. 그 중 @RequiredArgsConstructor와 @Autowired는 자주 사용되는 어노테이션이다. 이 두 어노테이션의 역할, 사용법, 그리고 선택 기준을 정리해보았다.

 

@RequiredArgsConstructor의 역할

@RequiredArgsConstructor는 Lombok 라이브러리에서 제공하는 어노테이션이다. 

수행하는 작업: 
1. final로 선언된 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성한다.
2. 생성자 기반 의존성 주입을 쉽게 구현할 수 있게 해준다.
3. 코드를 간결하게 만들어준다.

예시

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
    private final EmailService emailService;

    // 생성자가 자동으로 생성된다.
}

 

 

@Autowired의 역할

@Autowired는 Spring 프레임워크에서 제공하는 어노테이션이다.

수행하는 작업:

1. Spring 컨테이너가 관리하는 빈(Bean)을 자동으로 주입한다.
2. 필드 주입, 생성자 주입, 세터 메소드 주입 등 다양한 방식으로 사용할 수 있다.
3. 주로 타입을 기반으로 일치하는 빈을 찾아 주입한다.

 

@RequiredArgsConstructor를 사용해도 @Autowired가 필요한 경우

대부분의 경우 @RequiredArgsConstructor만으로 충분하지만, 여전히 @Autowired가 필요한 상황이 있다.

1. 여러 생성자가 있는 경우

public class MultipleConstructorService {
   private DependencyA dependencyA;
   private DependencyB dependencyB;

   @Autowired  // 이 생성자를 사용하라고 명시
   public MultipleConstructorService(DependencyA dependencyA) {
       this.dependencyA = dependencyA;
   }

   public MultipleConstructorService(DependencyA dependencyA, DependencyB dependencyB) {
       this.dependencyA = dependencyA;
       this.dependencyB = dependencyB;
   }
}


2. 선택적 의존성 주입

public class OptionalDependencyService {
   @Autowired(required = false)
   private OptionalDependency optionalDependency;
}


3. 메서드 주입이 필요한 경우

public class MethodInjectionService {
    private SomeDependency dependency;

    @Autowired
    public void setDependency(SomeDependency dependency) {
        this.dependency = dependency;
    }
}


4. 특정 이름의 빈을 주입해야 하는 경우

public class SpecificBeanService {
   @Autowired
   @Qualifier("specificBeanName")
   private SomeInterface specificBean;
}


5. 순환 참조를 해결해야 하는 경우 (권장 X)

@Component
public class CircularDependencyA {
   @Autowired
   private CircularDependencyB b;
}

@Component
public class CircularDependencyB {
   @Autowired
   private CircularDependencyA a;
}

 

결론

@RequiredArgsConstructor는 대부분의 의존성 주입 상황에서 깔끔하고 효율적인 해결책을 제공한다. 그러나 특수한 상황에서는 여전히 @Autowired가 필요할 수 있다. 최신 Spring 버전에서는 생성자 주입 방식을 권장하며, 가능한 한 @RequiredArgsConstructor를 사용하여 코드를 간결하게 유지하는 것이 좋다.

@Autowired는 특별한 경우나 레거시 코드 유지보수 시에 주로 사용되며, 새로운 코드를 작성할 때는 가능한 한 생성자 주입 방식을 사용하는 것이 좋다.

반응형

댓글