Spring Boot 프로젝트를 진행하다 보면, 의존성 주입을 위해 생성자를 작성하는 일이 많습니다. 이때, @RequiredArgsConstructor 애노테이션을 사용하면 의존성 주입 코드가 깔끔해지고 반복적인 코드를 줄일 수 있습니다. 이 글에서는 @RequiredArgsConstructor의 개념, 사용법, 그리고 장점을 정리하겠습니다. 😊
주요 특징
- final 필드의 생성자 자동 생성
final 키워드가 붙은 필드에 대해 생성자를 자동으로 만들어 줍니다. - @NonNull 필드 지원
final이 아닌 필드 중에서도 @NonNull 애노테이션이 붙어 있으면 생성자에 포함됩니다. - 불변 객체 작성
final 필드는 생성자를 통해서만 초기화되므로, 객체 생성 이후에는 값을 변경할 수 없습니다.
2. @RequiredArgsConstructor 사용법
Lombok 사용 전: 생성자 직접 작성
UserService 클래스에서 UserRepository와 EmailService를 생성자를 통해 주입한다고 가정해 보겠습니다.
@Service
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// 생성자 직접 작성
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
}
Lombok의 @RequiredArgsConstructor 사용
위 코드를 Lombok의 @RequiredArgsConstructor를 사용하여 작성하면 다음과 같이 간단해집니다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// 생성자가 자동으로 생성됩니다.
}
Lombok이 아래와 같은 생성자를 자동으로 만들어줍니다:
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
Spring 의존성 주입과의 조합
Spring에서는 생성자를 통한 의존성 주입을 권장합니다. @RequiredArgsConstructor를 사용하면 @Autowired 없이도 필요한 빈을 생성자 주입으로 주입받을 수 있습니다.
3. 동작 원리
기본 동작
- final 필드는 생성자 매개변수로 포함됩니다.
- @NonNull 필드도 생성자에 포함되며, null 방지 코드를 자동으로 추가합니다.
예시 코드
@RequiredArgsConstructor
public class Example {
private final String name; // 생성자에 포함
@NonNull
private Integer age; // 생성자에 포함
private String address; // 생성자에 포함되지 않음
}
자동 생성된 생성자:
public Example(String name, Integer age) {
if (age == null) {
throw new NullPointerException("age is marked non-null but is null");
}
this.name = name;
this.age = age;
}
4. @RequiredArgsConstructor의 장점
1) 코드 간소화
- 생성자를 직접 작성할 필요가 없어, 코드가 훨씬 간결해집니다.
- 불필요한 반복 작업을 줄이고 비즈니스 로직에 집중할 수 있습니다.
2) 불변 객체 작성
- final 필드를 통해 객체의 불변성을 유지할 수 있습니다.
- 생성자를 통해 초기화한 후 값이 변경되지 않도록 보장합니다.
3) Spring과 같이 사용하면
- Spring의 생성자 주입 방식과 결합하면, 의존성 주입 코드를 더욱 깔끔하게 작성할 수 있습니다.
4) Null 방지
- @NonNull 필드에 대해 null 방어 코드를 자동으로 추가하여 안정성을 높입니다.
5. 사용 시 주의점
1) final 필드만 포함
- @RequiredArgsConstructor는 final 필드와 @NonNull 필드만 생성자에 포함합니다.
- final이 아닌 필드는 생성자에 포함되지 않으므로, 다른 방식으로 초기화해야 합니다.
2) 필드 순서 주의
- 생성자의 매개변수 순서는 필드 선언 순서를 따릅니다. 잘못된 순서로 값을 전달하지 않도록 주의하세요.
6. 언제 사용하면 좋을까?
- Spring 의존성 주입:
- 의존성 주입을 위한 생성자 작성이 필요한 모든 클래스에서 사용할 수 있습니다.
- 서비스, 컨트롤러, 레포지토리 등 대부분의 Spring Bean에 적합합니다.
- 불변 객체 작성:
- 클래스의 필드가 변경되지 않도록 보장해야 할 때 사용하면 유용합니다.
7. 결론
@RequiredArgsConstructor는 Lombok에서 제공하는 매우 유용한 애노테이션으로, 생성자 작성 작업을 자동화하여 코드 간소화와 생산성을 크게 향상시켜 줍니다.
Spring Boot와 같이 의존성 주입이 빈번한 환경에서 활용하면, 클린 코드를 작성하는 데 크게 도움이 됩니다.
이 글이 @RequiredArgsConstructor를 사용하는 데 도움이 되었기를 바랍니다.
'Spring' 카테고리의 다른 글
객체 동등성 비교를 간단하게: @EqualsAndHashCode (1) | 2024.12.04 |
---|---|
JPA에서 @Modifying 사용법과 동작 원리 (0) | 2024.12.03 |
spring boot 버전에 호환되는 의존성 버전 확인하는 법 (0) | 2024.11.29 |
람다와 스트림 (0) | 2024.11.08 |
생성자(Constructor)와 빌더(Builder) 패턴에 대한 이해 (0) | 2024.11.07 |