업데이트:

1 분 소요

개요

최근 강의를 들으면서 생성자getter, setter를 직접 구현하지 않아도 이를 알아서 만들어주는 lombok 라이브러리에 대해 알게 되었다. lombok은 생성자의 변수에서 final을 사용하는 경우 @RequiredArgsConstructor, 사용하지 않는 경우 @NoArgsConstructor를 이용해 생성자를 만들어준다.

강의 내용을 따라가면서 타입이 중복되는 빈 문제를 해결하기 위한 방안인 @Qualifier를 사용하게 되었는데, 이를 lombok과 함께 사용하고 싶어 아래와 같이 작성했으나 오류가 났다.

@@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy;
    //NoUniqueBeanDefinitionException 발생
}

원인 및 해결

lombok은 AnnotationProcessor를 통해서 @RequiredArgsConstructor를 인지해 생성자를 만든다.
이 때 변수 타입과 변수 명은 인식하지만 @Qualifier과 같은 어노테이션은 따로 인식할 수 없는 것이 원인이 되었다.

이를 해결하기 위해서는 @Qualifier를 이용하지 않고 먼저 타입을 매칭시키고 이에 맞는 조건이 존재하지 않으면 이름을 통해 매칭시키는 @Autowired의 작동 과정을 생각해 변수의 이름을 직접 바꿔줄 수 있지만, 이름을 변경시키는 방법으로는 번거로워질 가능성이 있기 때문에 사용하고 싶지않았다.

이 때 lombok에 따로 설정값을 추가하여 @RequiredArgsConstructor와 @Qualifier를 사용할 수 있는 방법에 대해 알게 되었다.

방법은 아래와 같다.

1. 프로젝트의 최상위 디렉토리에 lombok.config파일을 생성한다.  
2. 생성한 config 파일에 lombok.copyablAannotations += org.springframew ork.beans.factory.annotation.Qualifier 를 추가한다.
3. gradle cache를 삭제한다.  

이와 같은 방법을 이용해 문제없이 lombok과 @Qualifier을 함께 이용할 수 있게 되었다.

gradle cache는 Intellij 기준으로 아래의 방법으로 삭제할 수 있다.

  1. Intellij - File - Invalidate Caches… 선택

gradle_cache.png

  1. Clear file system cache and Local History 체크 후 Invalidate and Restart 선택

gradle_cache2.png

댓글남기기