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는 특별한 경우나 레거시 코드 유지보수 시에 주로 사용되며, 새로운 코드를 작성할 때는 가능한 한 생성자 주입 방식을 사용하는 것이 좋다.
댓글