inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

인터페이스에서 구현체를 굳이 두개로 나누는 이유가 있나요?

951

okky

작성한 질문수 20

0

현재 구성은

DiscountPolicy 인터페이스

- RateDiscountPolicy 클래스

- FixDiscountPolicy 클래스

 

제가 생각하는 구성

DiscountPolicy 인터페이스

- PriceDiscountPolicy 상속

RateDiscount( ) 

FixDiscount( )

 

이처럼 구현체 클래스를 두 개가 아니라

하나의 구현체 안에 두 개의 메소드를 상속 받아서 쓰면

안좋은 점이 어떤건가요?

 

***************************

@primary, @Qualifier, @Autowired 필드

구현제 빈을 지정해주는 세 가지 방법이 있는데

@Autowired 필드 방법은

테스트가 안되기 때문에 권장하지 않는건가요?

 

우선순위 방법인 @Primary 방법은

구현 클래스가 두개일 경우에만 사용하고

두개가 넘어갈 경우 사용하지 못하는건가요?

oop spring

답변 1

0

David

안녕하세요. okky님, 공식 서포터즈 David입니다.

1. 인터페이스를 사용하여 구현체를 여러 개를 만드는 이유는 클라이언트(인터페이스를 사용하는 곳)쪽의 코드를 변경하지 않고 구현을 변경하기 위해서 입니다. 말씀하신대로 하면 새로운 정책이 추가되고 그것을 사용하려 할 때 기존 코드를 변경해야 하는 상황이 발생합니다. 위 내용을 인지하신 상태에서 아래 강의를 참고해주세요.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55342

2. 네, 맞습니다. @Autowired를 사용하여 필드주입을 하게 되면 테스트 작성에 어려움이 있습니다.

3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.

감사합니다.

0

okky

3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.

만약 구현체가 3개일 경우

우선순위를 3 class > 2 calss > 1 class 두고 싶다면

3 class에 @primary를 두면 우선으로 되지만 

나머지 2 calss = 1 class 동등한 순위를 갖게 되는데

이럴 때는 @primary 사용하지 않는 게 좋은 거 아닌가요?

0

David

2 class, 1 class가 동등한 순위를 갖게 될 때 @Primary를 사용하는게 왜 좋지 않은지 설명해주실 수 있으실까요?

0

okky

DiscountPolicy 인터페이스(discount 메소드)

- RateDiscountPolicy(@primary) 가장우선순위

- FixDiscountPolicy 

- AgeDiscountPolicy 

 

세 개의 구현체가 discount 상속을 받아서 처리할 때 

클라이언트에서 discountPolicy.discount 쓸려고 가정하겠습니다.

 

현재 

private final DiscountPolicy discountPolicy;  -> RateDiscountPolicy 호출이 되겠죠

왜냐하면 @primary 가장 우선순위가 되어있기 때문에

 

만약 AgeDiscountPolicy, FixDiscountPolicy 둘 중에 하나 쓰고싶은데

@primary는 RateDiscountPolicy 쓰고 있기 때문에

나머지 두 개는 동등한 순위가 갖게 되어서 구별할 수 없기 때문에

@primary는 3개일 경우 안쓰는 게 좋은 거 아닌가요?

 

0

David

위와 같은 상황에서 다른 빈을 사용하려면 @Qualifier로 더 상세하게 사용할 빈을 지정하는 방법을 사용하시면 됩니다.

빈 스코프 개념의 중요성

0

23

1

SingletonService가 JVM이 뜰 때 생성되는게 맞나요?

0

68

2

섹션3. 11 회원객체 다이어그램

0

38

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

41

1

코드 자료

0

86

2

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

0

83

2

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

0

100

1

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

0

104

1

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

0

89

1

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

0

91

1

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

0

149

2

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

0

101

1

provider 사용하는 이유

0

100

1

다음 강의 뭘 들어야 할까요

0

141

2

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

0

70

1

beanB

0

94

2

퀴즈다시풀기

0

77

1

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

0

105

2

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

0

72

3

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

0

116

2

도메인의 정의?

0

64

1

ApplicationContext 질문입니다.

0

68

1

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

0

98

2

ai api 선정하기 관련 질문

0

141

2