Spring에서 의존성 주입(DI, Dependency Injection)을 할 때, Lombok의 어노테이션(@RequiredArgsConstructor, @AllArgsConstructor, @NoArgsConstructor)과 @Autowired를 비교해볼 수 있다.
final 또는 @NonNull이 붙은 필드만을 매개변수로 받는 생성자를 자동으로 생성한다.import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
final이 아닌 필드까지 포함되므로, 빈의 변경 가능성을 증가시킬 수 있다.import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class UserService {
private UserRepository userRepository;
}
final 필드가 존재하면 컴파일 에러가 발생할 수 있다.import lombok.NoArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@NoArgsConstructor
public class UserService {
private UserRepository userRepository;
}
@Autowired를 생략할 수 있다.import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@RequiredArgsConstructor를 사용하면 @Autowired 없이도 생성자 주입을 자동으로 수행할 수 있다. 이는 다음과 같은 장점을 가진다.
코드 간결성 → 생성자를 직접 작성할 필요가 없다.
불변성 보장 → final 필드를 사용하여 안정성을 높인다.
테스트 용이성 → 필드 주입(@Autowired)보다 테스트 코드 작성이 쉬움.
Spring 프레임워크에 덜 의존적 → 순수 Java 코드로도 실행 가능하다.
@AllArgsConstructor는 모든 필드에 대한 생성자를 생성하여 객체 생성이 용이하지만, 변경 가능성을 증가시킨다. @NoArgsConstructor는 기본 생성자가 필요할 때 사용하며, JPA Entity에서 사용될 수 있다.
@RequiredArgsConstructor를 사용하면 코드가 간결해지고, 불변성을 유지할 수 있으며, 생성자 주입을 통한 의존성 관리가 용이하다. Spring 기반 개발에서는 @Autowired 필드 주입보다 @RequiredArgsConstructor 생성자 주입 방식이 권장된다.