Replies: 1 comment 1 reply
|
제일 먼저 올리셨네요 !!! 실무에서는 @Autowired 필드 명, @qualifier, @primary 중에 주로 어떤 방법을 .. 이용하나요? |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
5️⃣ 조회 빈이 2개 이상 - 문제
@Autowired는 타입(Type)으로 조회한다.타입으로 조회하기 때문에, 아래의 코드와 유사하게 동작한다.
타입으로 조회시 선택된 빈이 2개 이상일 때 문제가 발생한다.
DiscountPolicy의 하위 타입인FixDiscountPolicy,RateDiscountPolicy둘다 스프링 빈으로 선언해보자.그리고 이렇게 의존관계 자동 주입을 실행하면
🔴 오류가 발생한다.
fixDiscountPolicy,rateDiscountPolicy2개가 발견되었다고 표시되어있다.✅해결법
하위 타입으로 지정할 수 도 있지만, 하위 타입으로 지정하는 것은 DIP 위배와 더불어 유연성이 떨어진다.
그리고 이름만 다르고, 완전히 똑같은 타입의 스프링이 빈이 2개 있을 때 해결이 안됨
더 구체적으로는 다음 파트 6에서 알아보자.
6️⃣ @Autowired 필드 명, @qualifier, @primary
➡️@Autowired 필드 명 매칭
@Autowired는 타입 매칭을 시도하고 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.필드 명이
rateDiscountPolicy이므로 정상 주입됨.➡️@qualifier 사용
@Qualifier는 추가 구분자를 붙여주는 방법이다. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다.주입시에 @qualifier를 붙여주고 등록한 이름을 적어준다.
@Qualifier로 주입할 때, @qualifier(”mainDiscountPolicy”)를 못찾으면 어떻게될까?→ mainDiscountPolicy 라는 이름의 스프링 빈을 추가로 찾는다.
→ 그러나
@Qualifier는@Qualifier를 찾는 용도로만 사용하는게 명확하고 좋다고 한다.NoSuchBeanDefinitionExecption예외 발생➡️ @primary 사용
@primary는 우선순위를 정하는 방법이다.
@Autowired시에 여러 빈이 매칭되면@Primary가 우선권을 가진다.@Primary가 잘 동작한다.✅
@Qualifier의 단점@Qualifier단점은 주입 받을 때 모든 코드에@Qualifier를 붙여줘야한다. 예시를 보고 확인해보자.반면에
@Primary를 사용하면 이렇게@Qualifier를 붙일 필요가 없어짐✅ @primary, @qualifier 활용
코드에서 자주 사용하는 메인 데이터베이스의 커넥션을 획득하는 스프링 빈이 있고, 코드에서 특별한 기능으로 가끔 사용하는 서브 데이터베이스의 커넥션을 획득하는 스프링 빈이 있다고 생각해보자.
메인 데이터베이스의 커넥셔을 획득하는 스프링 빈은
@Primary를 적용해서 조회하는 곳에서@Qualifier지정 없이 편리하게 조회하고, 서브 데이터베이스 커넥션 빈을 획득할 때는@Qualifier를 지정해서 명시적으로 획득하는 방식으로 사용하면 코드를 깔끔하게 유지할 수 있다.✅우선순위
@Primary는 기본값 처럼 동작하는 것이고,@Qualifier는 매우 상세하게 동작한다. 이런 경우 어떤 것이 우선권을 가져갈까 ?→ 스프링은 자동 < 수동, 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선 순위가 높다.
→
@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>:DiscountPolicy타입으로 조회한 모든 스프링 빈을 담아준다.💈참고 스프링 컨테이너를 생성하면서 스프링 빈 등록하기
스프링 컨테이너는 생성자에 클래스 정보를 받는다. 여기에 클래스 정보를 넘기면 해당 클래스가 스프링 빈으로 자동 등록된다.
이 코드는 2가지로 나누어 이해할 수 있다.
정리
AutoAppConfig,DiscountService를 스프링 빈으로 자동 등록한다.9️⃣ 자동, 수동의 올바른 실무 운영 기준
@Component만 넣어주면 끝나는 일을@Configuration설정 정보에 가서 @bean을 적고, 객체를 생성하고, 주입할 대상을 일일이 적어주는 과정이 상당히 번거로움✅수동 빈 등록은 언제 사용하면 좋을까 ?
애플리케이션은 크게
업무 로직과기술 지원 로직으로 나눌 수 있다.✅비즈니스 로직 중에서 다형성을 적극 활용할 때
의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map을 다시보자.
All reactions