인프런 커뮤니티 질문&답변

파이팅파이팅님의 프로필 이미지
파이팅파이팅

작성한 질문수

스프링 핵심 원리 - 기본편

생성자 주입을 선택해라!

order 관련 코드가 이해가 안됩니다.

작성

·

500

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요

스크린샷 2023-07-30 오후 4.51.27.png스크린샷 2023-07-30 오후 4.51.41.png스크린샷 2023-07-30 오후 4.51.55.png스크린샷 2023-07-30 오후 4.52.04.png스크린샷 2023-07-30 오후 4.52.10.png

강사님 코드를 계속 따라오다 코드를 한번 쭉 훑어 보는 시간을 가졌는데 갑자기 이해가 안되어 강의를 다시 봤는데도 헷갈려 질문 드립니다.

 

  1. OrderApp 클래스에서



OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
Order order = orderService.createOrder(memberId,"itemA",10000);

라고 사용할 수 있는 이유가 뭔가요??

orderService는 인터페이스 이고,

orderService에 있는 메소드는 추상 메소드라서 그 내용이 구현되지 않은 상태이므로, orderService.createOrder 메소드를 바로 사용할 수 없는 것 아닌가요??

 

  1. OrderServiceImpl 클래스에서

    코드:

    private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;//인터페이스에만 의존하도록 설계. 이렇게 해서 구체적인 구현체에는 신경을 안씀. @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository=memberRepository; this.discountPolicy=discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itempPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itempPrice); return new Order(memberId, itemName, itempPrice, discountPrice); }

코드에서. 아래 코드가 잘 이해가 안됩니다.

private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;//인터페이스에만 의존하도록 설계. 이렇게 해서 구체적인 구현체에는 신경을 안씀.

MemberRepository라는 인터페이스를 위와 같이 사용하고 구성하는 이유가 명확하게 잘 와닿지 않습니다.

이렇게 설계하는 이유가 아래 첨부한 사진과 같을 것이라고 예상은 되는데.. 설명 부탁드리겠습니다.

스크린샷 2023-07-30 오후 5.21.52.png

  1. private final MemberRepository memberRepository;

    private final DiscountPolicy discountPolicy;// 코드에서

인터페이스에 private와 final을 붙인 이유가 무엇인가요??

MemberRepository라는 것은 멤버들의 ID가 저장되어 있기 때문에 모든 클래스들이 접근하고 수정될 수 있어야 하는 것 아닌가요??

 

  1. 그리고 자바 스프링에서 인터페이스의 역할은 무엇인지 알 수 있을까요??

    아래와 같은 사진과 같이 설계하는 것이 의존성 주입을 위해서 라는 것은 어렴풋이 이해하겠습니다..근데 명확하게 인터페이스가 어떤 역할을 한다는 것이 잘 이해가 안됩니다. 인터페이스란 말 그대로 "클래스에서 어떤 값을 가져올 때, 인터페이스에 정의된 형식을 통해서 값을 가져온다?"이런 느낌으로 이해하면 될까요?? KakaoTalk_Photo_2023-07-30-17-46-28.png

 

5.그리고 이걸 종합적으로 이해하면

자바 스프링에서는 "빈과 인터페이스와 직접적으로 연결된 느낌(?)이고, 인터페이스의 구체적인 내용(메소드 등)은 그 인터페이스를 현재 사용하는 자바 클래스(구현체)에서 정의한다." 이렇게 이해하는게 맞나요?

즉, 인터페이스를 정의 해놓고, 상황에 따라 필요한 구현체를 갈아 끼운다라는 표현이 맞는건가요??

 

모르는 부분이 많아 횡설수설 적었네요 죄송합니다.

더위 조심하시고 설명 부탁드립니다.

답변 2

0

안녕하세요. 박지현님, 공식 서포터즈 David입니다.

  1. 해당 타입으로 등록된 빈을 컨테이너로부터 찾아오기 때문에 가능합니다. 빈은 OrderService의 구현체인 OrderServiceImpl일테고요.

  2. 자바 기본문법인 인터페이스와 구현체에 대해 헷갈리시는 것 같습니다. 다음 글을 참고해 주세요. https://wikidocs.net/217

  3. 모든 클래스에서 접근하여 상태를 변경하게 된다면 변경된 상태로 인해 오류가 발생했을 때 오류를 발생시킨 변경지점을 찾기 힘듭니다. 따라서, 접근제어자를 통해 외부로부터 격리시키고 해당 필드를 가지는 클래스를 통해서만 변경할 수 있도록 제한하는 것입니다.

  4. 2번에서 공유한 글을 참고해 주세요.

  5. 이 부분의 경우 본 강의 섹션3, 섹션4를 반복 수강하시길 추천드립니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

OrderApp 클래스에서 주문 서비스를 사용하는 이유는 다음과 같아요. OrderService는 OrderApp이 의존하고 있는 인터페이스이기 때문에 실제 구현 클래스를 주입하여 사용할 수 있어요.

applicationContext.getBean(“orderService”, OrderService.class)의 코드는 Spring ApplicationContext에서 “orderService”라는 빈을 찾아서 OrderService 타입으로 가져오는 역할을 해요. 즉, ApplicationContext를 통해 OrderService 인터페이스를 구현한 클래스 중 한 개의 구현체를 가져와 사용하는 것이에요.

따라서, OrderService의 구현체 중에서 선택한 구현체를 사용하여 createOrder 메소드를 호출할 수 있는 것이에요. 이런 방식을 사용함으로써 코드의 유연성과 확장성을 높일 수 있어요.

강의를 다시 확인하면서 이해가 안되는 부분이 있다면, 직접 코드를 분석해보거나 추가적인 공부를 통해 이해해보시는 것을 추천드려요. 만약 여전히 이해가 어렵다면 질문해주세요! 언제든지 도움을 드릴게요.

파이팅파이팅님의 프로필 이미지
파이팅파이팅

작성한 질문수

질문하기