스프링 핵심 원리 - 기본편 (김영한) 강의 질문 게시판에 있는 문의 글을 가져온 글입니다.
클레스에 @RequiredArgsConstructor를 선언 하면 생성자 코드를 대신 만들어준다.
이때 필드명에 @Qualifier를 사용하면 NoUniqueBeanDefinitionException에러가 발생하였다는 문의가 있었다.
@RequiredArgsConstructor // final이 붙으면 필수 값이됨 -> 필수 생성자를 생성해줌
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
@Qualifier("mainDiscountPolicy")
private final DiscountPolicy discountPolicy;
...
}
김영한 강사님의 답변 (해결 방법)
먼저 lombok이 제공하는 @RequiredArgsConstructor는 애노테이션 까지 함께 포함해서 생성자를 만들지는 않습니다.
그런데 가능한 방법이 있습니다.
1. src/main/java/lombok.config 파일을 만들어주세요.(resources가 아닙니다. src/main/java입니다!)
2. lombok.config에 다음 내용을 넣어주세요.
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
3. 프로젝트를 다시 컴파일 한 다음 실행해주세요. IntelliJ를 사용하면, out이라는 폴더가 있는데 이 폴더를 꼭! 모두 지우고 다시 실행해주세요. gradle은 gradlew clean을 한번 해주고 실행해주세요^^!
해당 옵션을 적용한 후에 빌드된 .class 파일을 확인해보면 다음과 같이 @Qulifier가 포함 된 것을 확인할 수 있습니다.
public OrderService(@Qualifier("mainDiscountPolicy") DiscountPolicy mainDiscountPolicy, @Qualifier("orderRepository") OrderRepository orderRepository) {
this.mainDiscountPolicy = mainDiscountPolicy;
this.orderRepository = orderRepository;
}