Spring

Spring Basic- DI(의존 관계) 자동 주입 3

녁이 2023. 5. 23. 00:17
728x90
반응형

2023.05.19 - [SpringBoot] - Spring Basic- DI(의존 관계) 자동 주입

 

Spring Basic- DI(의존 관계) 자동 주입

DI(의존관계 주입)에는 크게 4가지가 있다. 1. 생성자 주입 2. 수정자 주입 3. 필드 주입 4. 일반 메서드 주입 1. 생성자 주입 생성자(constructor)를 통해서 DI를 주입하는 방법 1번만 호출되는 것을 보장

junhyuk-develop.tistory.com

2023.05.22 - [SpringBoot] - Spring Basic- DI(의존 관계) 자동 주입 2

 

Spring Basic- DI(의존 관계) 자동 주입 2

2023.05.19 - [SpringBoot] - Spring Basic- DI(의존 관계) 자동 주입 Spring Basic- DI(의존 관계) 자동 주입 DI(의존관계 주입)에는 크게 4가지가 있다. 1. 생성자 주입 2. 수정자 주입 3. 필드 주입 4. 일반 메서드 주

junhyuk-develop.tistory.com

 

주제: 조회하는 빈이 모두 필요할 때 어떻게 할까? + 총 정리


조회하는 빈이 모두 필요한 경우

 

@Autowired는 타입(Type)으로 조회를 한다.

그렇기 때문에, 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 생긴다.

이를 해결하기 위한 방법들을 전 시간에 알아보았다.

이번 시간에는 선택된 모든 빈들이 필요한 경우에는 어떻게 해야할까?

List와 Map 문법을 사용하자!

 

앞선 게시글에서 사용했던 예시와 마찬가지로 DiscountPolicy(할인 정책) 인터페이스의 하위 타입인 FixDiscountPolicy와 RateDiscountPolicy 를 예시로 사용하겠다.

예를 들어, 소비자가 두 개의 할인 정책 중에서 선택을 할 수 있다고 가정해보자. 

//예시를 위해 임의로 만든 함수
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
// 스프링 컨테이너 생성, 해당 클래스들을 스프링 빈으로 등록
DiscountService discountService = ac.getBean(DiscountService.class);
// DiscountService의 빈들을 discountService 객체에 할당
Member member = new Member(1L, "userA", Grade.VIP); 
// Member 클래스 객체 생성에 필요한 파라미터 값들은 (id, username, 등급)으로 설정함
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
// 두개의 할인 정책 중에서 fixDiscountPolicy로 결정
// fix 대신에 rateDiscountPolicy로 바꿔도 무방

// AutoAppConfig.class, DiscountService.class 를 파라미터로 넘기면서 해당 클래스들을 자동으로 스프링 빈으로 등록

// AutoAppConfig 는 @Configuration, @Componentscan을 사용하여 클래스들 간 의존관계를 형성하는 클래스이다.

 

static class DiscountService {
 	
    // DiscountPolicy에 있는 두개의 빈들을 Map,List에 할당
    private final Map<String, DiscountPolicy> policyMap;
    private final List<DiscountPolicy> policies;
 	
    public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
    		this.policyMap = policyMap;
 		this.policies = policies;
	}

	//Map에서 discountCode로 받아온 fixDiscountPolicy 빈을 찾아서 return해주는 로직
	public int discount(Member member, int price, String discountCode) {
		DiscountPolicy discountPolicy = policyMap.get(discountCode);
		return discountPolicy.discount(member, price);
    }
}

다형성을 활용한 이러한 로직들을 통해서 동적으로 빈을 골라 사용 가능하게 되었다.


총 정리

 

  1. 편리한 자동 기능을 기본으로 사용하자!
  2. 수동 빈 등록은 AOP를 처리할 때나 DB Connect, 공통 로그 처리와 같은 업무에 사용하자!
  3. 위와 같이 다형성을 적극 활용할 때는 한 눈에 파악하기 쉽도록 수동 빈을 사용하거나 관련된 특정 패키지를 묶자!

  1. 생성자 주입을 사용하자!
  2. 롬복 라이브러리를 잘 활용하자!
  3. 상황에 맞는 애노테이션을 잘 찾아서 사용하자!

다음 게시글

Bean LifeCycle CallBack

728x90
반응형