@RequiredArgsConstructor는 Lombok 라이브러리에서 제공하는 어노테이션으로, 필수 인자를 가진 생성자를 자동으로 생성해줍니다. 이 어노테이션은 스프링 부트 프로젝트에서 의존성 주입을 간소화하는 데 자주 사용됩니다.
final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성합니다.import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// 생성자가 자동으로 생성됨
// public UserService(UserRepository userRepository, EmailService emailService) {
// this.userRepository = userRepository;
// this.emailService = emailService;
// }
public void registerUser(User user) {
userRepository.save(user);
emailService.sendWelcomeEmail(user);
}
}
Lombok을 사용하기 위해서는 프로젝트에 Lombok을 추가해야 합니다:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
또한, IDE에 Lombok 플러그인을 설치해야 합니다.
인텔리제이(IntelliJ) 사용 시 프로젝트 생성에서 라이브러리를 체크하면 됩니다.
final 필드나 @NonNull 필드에 대해서만 생성자 매개변수를 만듭니다.final 필드를 사용함으로써 객체의 불변성을 쉽게 구현할 수 있습니다.@RequiredArgsConstructor를 사용한 생성자 주입은 @Autowired를 사용한 필드 주입보다 여러 장점이 있습니다:
// @Autowired 사용 (권장되지 않음)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private EmailService emailService;
}
// @RequiredArgsConstructor 사용 (권장됨)
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
}
장점:
1. 불변성: final 필드를 사용하여 객체의 불변성을 보장할 수 있습니다.
2. 테스트 용이성: 의존성을 명시적으로 선언하여 단위 테스트가 쉬워집니다.
3. 순환 의존성 탐지: 컴파일 시점에 순환 의존성을 쉽게 발견할 수 있습니다.
@RequiredArgsConstructor에는 몇 가지 설정 옵션이 있습니다:
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
private final String name;
private final String email;
}
access: 생성자의 접근 수준을 지정할 수 있습니다 (기본값은 public).staticName: 정적 팩토리 메서드 이름을 지정할 수 있습니다.@RequiredArgsConstructor를 사용한 클래스의 테스트는 다음과 같이 할 수 있습니다:
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@MockBean
private EmailService emailService;
@Test
void registerUser_ShouldSaveUserAndSendEmail() {
User user = new User("John", "john@example.com");
userService.registerUser(user);
verify(userRepository).save(user);
verify(emailService).sendWelcomeEmail(user);
}
}
final을 사용하세요.@RequiredArgsConstructor의 이점을 최대화하세요.@RequiredArgsConstructor는 스프링 부트 애플리케이션에서 의존성 주입을 간소화하고 코드의 가독성을 높이는 강력한 도구입니다. 생성자 주입의 장점을 살리면서도 보일러플레이트 코드를 줄일 수 있어, 많은 개발자들이 선호하는 방식입니다. 다만, Lombok에 대한 의존성과 설정이 필요하므로 프로젝트의 요구사항에 맞게 사용을 결정해야 합니다.