Spring/Spring Core

조회한 빈이 모두 필요할 때 - List / Map 사용하기

민철킹 2021. 3. 21. 20:56

의도적으로 해당 타입의 스프링 빈이 다 필요한 경우도 있다.

예를 들어, 할인 서비스를 제공하는데 클라이언트가 할인의 종류를 선택할 수 있다면?

 

스프링을 사용하여 해결해보자.

 

위와 같이 테스트 코드를 작성하였다. 전에 만들어놓았던 AutoAppConfig를 통하여 컴포넌트 스캔을 진행하여 스프링 빈으로 등록한다.(@Component가 붙은 클래스 모두 등록)

그리고 우리가 static으로 만든 DiscountService또한 스프링 빈으로 등록시키는데 의존관계 주입시

List와 Map형태로 RateDiscountPolicy와 FixDiscountPolicy를 주입할 것이다.

 

테스트를 실행시켜보면 다음과 같이 Map와 List에 조회된 모든 빈들이 들어가있고,

discountService 또한 정상적으로 등록된 것을 확인할 수 있다.

 

 

할인 정책을 선택하기

TDD방식으로 코드를 작성

discount메소드는 회원과 물품 가격 그리고 선택한 할인정책을 넣으면 할인가격을 return해주는 메소드이다.

첫번째 테스트는 고정할인금액을 선택했으므로 1000원이 반환되어야 할 것이고,

두번째 테스트는 정률할인금액을 선택했으므로 20000원의 10%인 2000원이 반환되어야함.

이제 discount메소드를 작성하였다. 앞서 만들어놓은 policyMap에서 파라미터로 주어진 할인정책 스프링 빈을 가져온다. 그 객체 내에 존재하는 discount메소드를 사용하여 할인금액을 계산하여 반환시켜주는 것이다.

만약 클라이언트가 정률할인을 선택했다면 이 discount메소드가 사용될 것이고

고정금액할인을 선택했다면 이 discount메소드가 사용될 것이다.

테스트 성공 !!

전체코드

즉 스프링 빈이름과 매칭시켜 조회된 스프링 빈들 중에서 내가 원하는 빈을 선택해서 사용할 수 있는 것이다.


정리

DiscountService는 Map으로 모든 DiscountPolicy를 주입받는다.(Rate / Fix)

discount 메서드는 discountCode로 fixDiscountPolicy가 넘어오면 map에서 fixDiscountPolicy 스프링 빈을 rateDiscountPolicy가 넘어오면 rateDiscountPolicy를 찾아 실행한다. ==> 다형성 유지

 

 

주입받을 때 만약 해당하는 타입의 스프링 빈이 없다면, 빈 List나 Map을 주입 

 

반응형