@RequiredArgsConstructor

코딩냥이·2024년 9월 10일

Annotation

목록 보기
9/34

@RequiredArgsConstructor

@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을 사용하기 위해서는 프로젝트에 Lombok을 추가해야 합니다:

Maven

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Gradle

dependencies {
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

또한, IDE에 Lombok 플러그인을 설치해야 합니다.
인텔리제이(IntelliJ) 사용 시 프로젝트 생성에서 라이브러리를 체크하면 됩니다.

주요 특징

  1. 필수 의존성 주입: final 필드나 @NonNull 필드에 대해서만 생성자 매개변수를 만듭니다.
  2. 불변성 촉진: final 필드를 사용함으로써 객체의 불변성을 쉽게 구현할 수 있습니다.
  3. 코드 간소화: 생성자를 직접 작성할 필요가 없어 코드량이 줄어듭니다.
  4. 스프링의 생성자 주입과 호환: 스프링의 생성자 기반 의존성 주입과 완벽하게 호환됩니다.

@RequiredArgsConstructor vs @Autowired

@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: 정적 팩토리 메서드 이름을 지정할 수 있습니다.

주의사항

  1. 과도한 의존성: 너무 많은 필드가 있는 경우, 생성자의 매개변수가 많아질 수 있습니다.
  2. 상속 시 주의: 상속을 사용할 때 부모 클래스의 필드에 대한 처리를 주의해야 합니다.
  3. Lombok 의존성: Lombok에 의존하게 되므로, 프로젝트 설정 시 주의가 필요합니다.

테스트

@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);
    }
}

베스트 프랙티스

  1. 필수 의존성에만 사용: 꼭 필요한 의존성에 대해서만 final을 사용하세요.
  2. 불변 객체 설계: 가능한 한 불변 객체를 설계하여 @RequiredArgsConstructor의 이점을 최대화하세요.
  3. 생성자 주입 선호: 필드 주입 대신 생성자 주입을 사용하세요.
  4. 테스트 용이성 고려: 의존성을 명시적으로 선언하여 테스트가 쉽도록 설계하세요.

결론

@RequiredArgsConstructor는 스프링 부트 애플리케이션에서 의존성 주입을 간소화하고 코드의 가독성을 높이는 강력한 도구입니다. 생성자 주입의 장점을 살리면서도 보일러플레이트 코드를 줄일 수 있어, 많은 개발자들이 선호하는 방식입니다. 다만, Lombok에 대한 의존성과 설정이 필요하므로 프로젝트의 요구사항에 맞게 사용을 결정해야 합니다.

연관 포스팅

@Autowired

profile
HelloMeow~!

0개의 댓글