같은 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 같은 데이터베이스 연결에 사용하는 기술 지원 로직
이런 부분들은
메뉴얼을 잘 참고해서( 스프링 자체를 잘 이해하고 )
스프링의 의도대로 잘 사용하는게 중요하다.
'김영한님 인강듣고 > 스프링 핵심원리-기본' 카테고리의 다른 글
| 빈 스코프 (0) | 2024.03.13 |
|---|---|
| 빈 생명주기 콜백 (0) | 2024.03.07 |
| lombok (0) | 2024.03.06 |
| 의존관계 주입 (0) | 2024.03.05 |
| 컴포넌트 스캔( 탐색 범위, 기본스캔 대상, 필터, 중복 등록과 충돌 ) (0) | 2024.02.26 |