Spring

Spring에서 @RequiredArgsConstructor 사용법과 장점

0and24 2024. 12. 3. 17:44
Spring Boot 프로젝트를 진행하다 보면, 의존성 주입을 위해 생성자를 작성하는 일이 많습니다. 이때, @RequiredArgsConstructor 애노테이션을 사용하면 의존성 주입 코드가 깔끔해지고 반복적인 코드를 줄일 수 있습니다. 이 글에서는 @RequiredArgsConstructor의 개념, 사용법, 그리고 장점을 정리하겠습니다. 😊

주요 특징

  1. final 필드의 생성자 자동 생성
    final 키워드가 붙은 필드에 대해 생성자를 자동으로 만들어 줍니다.
  2. @NonNull 필드 지원
    final이 아닌 필드 중에서도 @NonNull 애노테이션이 붙어 있으면 생성자에 포함됩니다.
  3. 불변 객체 작성
    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. 동작 원리

기본 동작

  1. final 필드는 생성자 매개변수로 포함됩니다.
  2. @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를 사용하는 데 도움이 되었기를 바랍니다.