인프런 커뮤니티 질문&답변

vkdlxj3562님의 프로필 이미지
vkdlxj3562

작성한 질문수

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

@RequiredArgsConstructor과 @Qualifier질문

작성

·

5K

12

먼저 좋은 강의를 제공해주시것에 감사인사드립니다!

강의에서는 생성자에 @Qualifier를 주입하셨는데

강의를 듣고난후 @RequireArgsConstructor와 

@Qualifier를 같이 사용했을 경우 

NoUniqueBeanDefinitionException 에러가 발생하였습니다.

@Qualifier를 사용할경우에는 @RequiredArgsConstructor를 사용할수 없는것인지 아님 다른 방법이 있는지 궁금합니다!

답변 5

14

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. vkdlxj3562님^^

먼저 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;
}

도움이 되셨길 바래요^^

7

아니면 그냥 Qualifier를 지우고 필드 이름을 mainDiscountPoilicy로 변경하는 것도 방법일 것 같습니다. 

2

vkdlxj3562님의 프로필 이미지
vkdlxj3562
질문자

해결되었습니다!!

친절한 답변 감사드립니다!!

1

저도 이거 궁금햇는데 엔트로피님 께서 말씀해주신 내용이 엄청 와닿네요 ㅎㅎ   

보통은 lombok과 함께 사용할때 ㄹ어떻게 사용하려나요 ..?

0

안녕하세요! 추가 질문이 있어 댓글 남깁니다.

@RequiredArgsConstructor와 @Qualifier 를 함께 쓸 수 있다고 했을 때,

만약 DiscountPolicy 의 구현체를 변경해야 한다면 코드 수정이 불가피 할것 같은데,

그렇게 되면 결국 외부에서 의존성을 주입해주는 것이 아닌, 클래스 내에서 구현 객체를 의존하고 있는것이 아닌가요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 창재님

생각하신 내용이 맞습니다. 내가 어떤 빈을 주입해야 하는지 직접 지정하기 때문에 의존하는 것이 맞습니다. 편리함과 유연성을 어느정도는 둘중에서 선택해야 하는 것으로 이해하시면 됩니다.

물론 인터페이스에 의존하고 또 외부에서 @Qualifier의 대상이 되는 빈 자체를 외부에서 스프링 빈을 등록하는 부분을 변경해서 바꿀 수 있기 때문에 클래스에 직접 의존하는 것 보다는 유연성을 가지게 됩니다.

감사합니다.

답변 감사합니다!!

제가 너무 원론에만 얽매였던 것 같습니다.

vkdlxj3562님의 프로필 이미지
vkdlxj3562

작성한 질문수

질문하기