inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

강의 테스트 오류내용 질문 / 소스코드 있음

379

nick

작성한 질문수 38

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
[소스코드]

https://drive.google.com/drive/folders/12UKQ6SBa5fZeSdpWkr36EDpLkZtXad4t?usp=sharing

 

  1. 강의를 듣는데 @Autowired 어노테이션에서 같은 타입이 2개이상 조회된 경우 필드명을 동일하게 해주면 해당 필드명에 맞는 빈을 주입한다고 했는데 빈이 적용되지 않는 오류가 납니다.. ㅠㅠ 테스트 코드를 아무리 돌려봐도 안되네요. 도와주세요!

  2. 또한 rateDiscountPolicy로 바꿔도 강사님과는 다르게 전체 테스트를 돌려보았을 때 xml은 성공적으로 수행하는 모습입니다. 이것도 왜 그런지 잘 모르겠습니다.

  3. 앞전 강의에서 전체 테스트를 돌렸을 때 CoreApplicationTests 에서 에러가 났는데, 여기서도 에러가 해결되지 않아 CoreApplication에 컴포넌트 스캔 및 excludeFilters 를 달아서 해결하였는데 이것도 왜 안되었던건지 궁금합니다.!!

  4. 전체 테스트를 돌렸을 때 총 3개가 에러가 나는데 basicSacn 뿐 아니라 나머지 2개가 왜 에러나는지도 해결 부탁드리고 싶습니다!

spring 객체지향

답변 1

1

김영한

안녕하세요. H N님

 

1. xml 오류

<bean id="orderService" class="hello.core.order.OrderServiceImpl">
	<constructor-arg name="memberRepository" ref="memberRepository" />
	<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>

문제가 되는 코드

public OrderServiceImpl(MemberRepository memberRepository,
		DiscountPolicy fixDiscountPolicy) {
	super();
	this.memberRepository = memberRepository;
	this.discountPolicy = fixDiscountPolicy;
}

 

해결 방안

fixDiscountPolicy -> discountPolicy로 수정해야 합니다.

public OrderServiceImpl(MemberRepository memberRepository,
		DiscountPolicy discountPolicy) {
	super();
	this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}

 

2. 이렇게 하면 그 다음으로 createUsingSpring 오류가 발생합니다.

오류 메시지: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy

 

TestConfig를 보면 컴포넌트 스캔을 하고 있는데요. 두 빈을 모두 스캔합니다. 따라서 생성자 주입에서 DiscountPolicy를 결정을 할 수 없습니다.

이 경우 이름을 맞추거나 또는 하나를 @Primary로 지정하시면 됩니다.

예를 들어서 다음과 같이 적용하면 됩니다.

@Primary //적용
@Component
public class RateDiscountPolicy implements DiscountPolicy {}

이렇게 하시면 모든 테스트가 통과할거에요.

감사합니다.

0

nick

제가 말씀드린 내용에 오해가 있는 거 같아 다시 질문드립니다.

위와 같이 실행할 때 테스트가 다 통과하긴 합니다만 제가 궁금한 점은 다음과 같습니다.

 

  1. orderServiceImpl 생성자에서 파라미터를 fixDiscountPolicy 로 바꾸어도 xml 테스트에서는 오류가 나지 않는다는 것이었습니다. 원래는 오류가 나야할 것 같은데 말이죠.

  2. createUsingSpring 테스트에서는 컴포넌트 스캔으로 테스트 한 것으로 강사님 말씀대로면 @Autowired 어노테이션이 붙었을 때 동작 방식에 따라 여러 빈이 겹칠 경우 그 후 순위로 파라미터 인자와 빈의 이름이 동일한 경우 빈이 주입된다고 들었습니다. 근데 fixDiscountPolicy, rateDiscountPolicy 인자로 바꾸어 보아도 모두 작동하지 않습니다. 아래와 같은 결과가 나오네요.

화면 캡처 2024-05-31 101813.png

  1. 위와 동일한 캡처 내용으로

    AutoAppConfigTest.basicScan(), CoreApplicationTestscontextLoads() 테스트도 작동하지 않습니다.

 

정리하면

  1. @Autowired 강의에서 말씀하신 동작방식이 먹지 않음

  2. OrderserviceImpl 생성자 자동주입에 파라미터명을 바꿔도 XML 오류가 나지 않음

 

감사합니다.

0

김영한

안녕하세요. H N님

Q: orderServiceImpl 생성자에서 파라미터를 fixDiscountPolicy 로 바꾸어도 xml 테스트에서는 오류가 나지 않는다는 것이었습니다. 원래는 오류가 나야할 것 같은데 말이죠.

-> 제 PC에서 올려주신 코드를 그대로 실행하면 xmlAppContext에서 오류가 발생합니다.

이 부분에서 확인이 필요할 것 같아요.

프로젝트를 다시 import 해서 실행해보시겠어요?

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

47

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

72

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

87

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

79

1

테스트 속도가 나중에 영향이 있을까요?

0

75

1

gradle 설정 안떠서 질문 남깁니다!

0

116

2

build.gradle로 프로젝트를 여는 이유

0

81

1

provider 사용하는 이유

0

85

1

다음 강의 뭘 들어야 할까요

0

123

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

62

1

beanB

0

79

2

퀴즈다시풀기

0

63

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

90

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

63

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

102

2

도메인의 정의?

0

57

1

ApplicationContext 질문입니다.

0

60

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

86

2

ai api 선정하기 관련 질문

0

115

2

생성자 자동주입 관련해서

0

60

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

93

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

63

1

12:25

0

74

2

appConfig.xml 오류

0

125

1