Justin의 개발 로그

목표

@RequiredArgsConstructor 어노테이션의 특징과 이를 이용한 의존성 주입

@RequiredArgsConstructor

이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다.

스프링 의존성 주입의 특징 중 한가지를 이용하는데 다음과 같습니다.

어떠한 빈(Bean)에 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 빈으로 등록 가능한 존재라면 이 빈은 @Autowired 어노테이션 없이도 의존성 주입이 가능하다.

Example

@Service
@RequiredArgsConstructor
public class RequiredArgsConstructorDIServiceExample {
  private final FirstRepository firstRepository;
  private final SecondRepository secondRepository;
  private final ThirdRepository thirdRepository;
  
  // ...
}
 

위 처럼 ServiceImpl 자바 파일을 생성했습니다. 이 자바 파일을 컴파일 돌려 클래스 파일을 한번 확인해 보겠습니다.

 
@Service
public class RequiredArgsConstructorDIServiceExample {
  @ConstructorProperties({"firstRepository", "secondRepository", "thirdRepository"})
  public RequiredArgsConstructorDIServiceExample(FirstRepository firstRepository, SecondRepository secondRepository, ThirdRepository thirdRepository) {
    this.firstRepository = firstRepository;
    this.secondRepository = secondRepository;
    this.thirdRepository = thirdRepository;
  }
}

클래스 파일을 보면 @ConstructorProperties 어노테이션과 함께 final 필드를 매개변수로 하는 생성자가 생성되었습니다. 매개변수로 있는 3개의 리포지토리(repository)는 빈으로 등록이 가능한 존재이므로, @Autowired 어노테이션 없이 의존성 주입이 이루어지게 되는 것입니다.

결론

@RequiredArgsConstructor 을 이용해서 편리하게 의존성 주입하는 방법을 정리했습니다. 추가적으로 롬복(Lombok) 어노테이션이(@Getter 혹은 @Setter 등) 사용할 땐 편하지만, 단점도 있습니다. setter 메서드가 필요없는 필드에 대해서도 setter 메서드를 강제로 생성하게 되니, 필드 값이 변경될 위험이 생기게 됩니다. 이런 부분들은 전부 리팩토링의 대상이지만, 롬복을 사용하게될 경우 리팩토링이 힘들어지는 부분도 있으니 너무 무분별하게 사용하는것은 좋지 않다고 생각합니다.

 

 

[발췌]

https://medium.com/webeveloper/requiredargsconstructor-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-dependency-injection-4f1b0ac33561

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!