본문 바로가기
김영한님 인강듣고/스프링 핵심원리-기본

의존관계 주입에서

by doriver 2024. 3. 7.

같은 Type으로 조회된 빈이 2개 이상일때

UnsatisfiedDependencyException
NoUniqueBeanDefinitionException   이러한 예외 발생

 

에러 해결 방법

@Autowired 변수명 매칭

@Qualifier끼리 매칭

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy{ ~ }


@Autowired
public OrderServiceImpl(MemberRepository memberRepository
                         , @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {  ~ }

 

@Primary 사용

@Component
@Primary
public class MemoryMemberRepository implements MemberRepository { ~ }

 

조회된 빈이 모두 필요할때

Map, List를 이용해서 모두 받을수 있음

@Autowired
public DiscountService( Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies ) { ~ } 
// { fixDiscountPolicy = hello.core.discount.FixDiscountPolicy@75e01201, rateDiscountPolicy = hello.core.discount.RateDiscountPolicy@2783717b }
// [ hello.core.discount.FixDiscountPolicy@75e01201, hello.core.discount.RateDiscountPolicy@2783717b ]

 

 

자동, 수동 등록

애플리케이션은 크게 업무 로직과 기술 지원 로직으로 나눌 수 있다.

업무 로직 빈

웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리등이 모두 업무 로직이다. 
자동 빈 등록을 적극 사용하는 것이 좋다.

기술 지원 빈

기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결이나, 공통 로그처리 처럼 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들이다
가급적 수동 빈 등록을 사용해서 명확하게 드러내는 것이 좋다.

 

애플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는 수동 빈으로 등록해서 

딱! 설정 정보에 바로 나타나게 하는것이 유지보수 하기 좋다

@Configuration
public class DiscountPolicyConfig {
 	@Bean
 	public DiscountPolicy rateDiscountPolicy() {
 		return new RateDiscountPolicy();
 	}
 	@Bean
	public DiscountPolicy fixDiscountPolicy() {
 		return new FixDiscountPolicy();
	}
}

 

비즈니스 로직 중에서 다형성을 적극 활용할 때
핵심은 딱 보고 이해가 되어야 한다!

 

 

스프링과 스프링 부트가 자동으로 등록하는 수 많은 빈들이 있다.

ex) 스프링 부트의 경우 DataSource 같은 데이터베이스 연결에 사용하는 기술 지원 로직

 

이런 부분들은

메뉴얼을 잘 참고해서( 스프링 자체를 잘 이해하고 )
스프링의 의도대로 잘 사용하는게 중요하다.