작성
·
459
5
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요. 의존관계 자동 주입 파트를 수강하고 있는 김민희입니다.
다름이 아니라 이번 섹션을 들으며 궁금한 점을 질문드리고 싶습니다. 아래부터는 저의 질문 내용인데, 혼자서 메모장에 의문인 부분을 정리한 것을 복사해온 것이라 경어체가 아닌 점을 양해 부탁드립니다.
=====================================
조회된 빈이 2개 이상일 때 사용할 수 있는 방법은 총 3가지가 있다고 하셨다.
- @Autowired 필드 명 매칭
Service 코드에서 생성자의 파라미터 이름, 필드 이름을 조회된 빈 들중 사용할 빈의 이름으로 변경해줌 → service 코드 수정
- @Qualifier 사용
서브 이름을 설정해주는 것.
컴포넌트에 서브 이름을 설정해주고, Service 코드에서 생성자의 파라미터를 입력할 때 그 서브이름을 같이 적어줌 → service 코드 수정
- @Primary 사용
조회되는 빈이 2개 이상이 될 때, 우선순위를 가질 컴포넌트에 @Primary를 지정함 → 컴포넌트 코드 수정
이 세가지 방법 다, 만약 사용할 빈이 달라진다면 코드를 변경해야 하는 방법이다.
우리 예제를 예로 들자면, rateDiscountPolicy와 fixDiscountPolicy 둘 다 빈 등록을 해놓고, OrderServiceImpl에서 discountPolicy를 호출할 때 rateDiscountPolicy를 사용하다가, 나중에 비즈니스 로직이 바뀌어서 fixDiscountPolicy를 사용해야 하는 것으로 바뀐다면…
세 가지의 방법 모두 OrderServiceImpl 코드나, rateDiscountPolicy와 fixDiscountPolicy 코드를 변경해줘야하는 방법이다.
그렇다면 세 가지 방법 전부 처음에 배웠던 객체 지향 프로그래밍의 컴퓨터 부품을 갈아끼우듯이
구현체를 변경해주는게 아니지 않나? 객체 지향적으로 프로그래밍되었다면 구현체를 변경할 때 실제 자바 파일의 소스코드를 가서 수정해주지 않아도, 설정 파일이나 기타 등등 설정을 위한 객체(혹은 클래스, 혹은 뭐든… 아직 배우기 전이어서 뭐가 있는지 모르겠음) 내용만 변경해주어야 하는것이 아닌가???
====================================
글을 깔끔하게 정리하지 못한 점 죄송합니다... 시간에 쫓기고 있어서 강의를 빨리 들어야 해서요ㅠㅠㅠ
저의 질문은 밑줄친 부분입니다. 제가 생각한 것이 맞는건지, 틀린건지,,, 틀렸다면 어떤 부분을 잘못 생각한 것인지 궁금합니다. 감사합니다.
답변 1
2
안녕하세요. 김민희님, 공식 서포터즈 David입니다.
@Autowired, @Qualifier를 사용하게 되면 말씀하신 대로 의존관계를 주입 받는 쪽 코드에 변경이 발생하게 됩니다.
그러나 @Primary는 조금 다릅니다. 자바 설정 클래스를 통해 수동 주입을 선택한다면 자바 설정 클래스 내 빈 생성 메서드(@Bean 애노테이션이 붙어 있는)에 @Primary를 붙여줌으로써 특정 빈을 주입 시킬 수 있습니다.
애노테이션을 사용하여 자동주입이 가능하지만 의존관계를 주입 받는 쪽 코드에 변경이 발생하는 것은 편의를 위한 트레이드오프로 볼 수 있습니다.
감사합니다.