You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
섹션 7. 의존관계 자동 주입(2)
5. 조회 빈이 2개 이상 - 문제
@Autowired는 Type으로 조회하므로 선택된 빈이 2개 이상일 때 문제가 발생한다ac.getBean(DiscountPolicy.class)와 같이 동작다음과 DiscountPolicy의 하위 타입을 둘 다 스프링 빈으로 등록하고 실행하면 빈이 2개가 등록되었다고 오류메세지가 발생한다.
6. @Autowired 필드 명, @qualifier, @primary
조회 대상 빈이 2개 이상일 때의 3가지 해결 방법
1) @Autowired 필드 명 매칭
@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.2) @qualifier 사용
추가 구분자를 붙여주는 방법. 주입시 추가적인 방법을 제공하는 것(빈 이름을 변경하지는 않음)
빈 등록시 @qualifier 붙여주기
주입 시에 @qualifier를 붙여주고 등록한 이름 적기
3) @primary 사용
우선순위를 정하는 방법. 다. @Autowired 시에 여러 빈이 매칭되면 @primary 가 우선권을 가진다.
RateDiscountPolicy가 우선권을 갖는 경우
@primary 와 @qualifier
@primary는 기본값 처럼 동작하고, @qualifier 는 매우 상세하게 동작한다
7. 애노테이션 직접 만들기
@Qualifier("mainDiscountPolicy")이렇게 문자를 직접 적으면 컴파일 시에 타입체크가 안된다. 애노테이션을 만들어서 문제를 해결할 수 있다.8. 조회한 빈이 모두 필요할 때, List, Map
의도적으로 해당 타입의 스프링 빈이 모두 필요한 경우도 있다. 이때 스프링을 사용하면 전략 패턴을 매우 간단하게 구현할 수 있다.
로직 분석
DiscountService는 Map으로 모든 DiscountPolicy 를 주입받는다. 이때 fixDiscountPolicy ,
rateDiscountPolicy 가 주입된다.
discount () 메서드는 discountCode로 "fixDiscountPolicy"가 넘어오면 map에서
fixDiscountPolicy 스프링 빈을 찾아서 실행한다. 물론 “rateDiscountPolicy”가 넘어오면
rateDiscountPolicy 스프링 빈을 찾아서 실행한다.
주입 분석
Map<String, DiscountPolicy>
map의 키에 스프링 빈의 이름을 넣어주고, 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
List
DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
9. 자동, 수동의 올바른 실무 운영 기준
편리한 자동 기능을 기본으로 사용하자
스프링을 선호하는 추세이다
스프링은 @component 뿐만 아니라 @controller , @service , @repository 처럼 계층에 맞추어 일반적인 애플리케이션 로직을 자동으로 스캔할 수 있도록 지원한다.
최근 스프링 부트는 컴포넌트 스캔을 기본으로 사용하고 다양하 스프링 빈들도 조건이 맞으면 자동 등록하도록 설계했다
그러면 언제 수동 빈 등록을 사용하면 좋을까?
애플리케이션은 크게 업무 로직과 기술 지원 로직으로 나눌 수 있다.
업무 로직 : 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는
리포지토리등이 모두 업무 로직이다. 보통 비즈니스 요구사항을 개발할 때 추가되거나 변경된다
기술 지원 로직 : 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결이나,
공통 로그 처리 처럼 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들이다.
애플리케이션에 광범위하게 영향을 미치는 기술 지원 로직은 수동 빈으로 등록해서 설정 정보에 바로 나타나게 하는 것이 유지 보수에 좋다
All reactions