인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이현준님의 프로필 이미지
이현준

작성한 질문수

스프링 핵심 원리 - 기본편

주문과 할인 도메인 개발에서 궁금한 점 있습니다.

작성

·

30

0

제가 부족한 탓이지만, GPT에 물어봐도 해결되지 않아 이렇게 글로 남깁니다.

 

package hello.core.order;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();


    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

이 코드에서 Member로 선언한 member가 질문인데, 생성자로 3개의 변수를 받는 것으로 설정되어있습니다. 근데 해당 코드를 보면 memberId만 대입하기에, 2개의 값이 불안정한 상태가 될 것이라고 생각하여 에러가 날 줄 알았는데, 그러지 않습니다. 이러한 이유를 알 수 있을까요?

형편없는 질문을 해서 죄송합니다..

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
이현준님이 제기한 문제를 이해하기 쉽도록 설명드리겠습니다. 관련된 기존 질문과 답변도 함께 제공해드립니다.

우선, 질문을 해결하기 위한 힌트는 Member 객체를 어떻게 생성하고 사용하는지에 있습니다. MemoryMemberRepository에서 findById를 통해 Member 객체를 찾을 때, 해당 객체는 이미 MemoryMemberRepository에 저장되어 있어야 합니다.

예를 들어, MemberService를 통해 Member를 저장하고, OrderService를 통해 해당 Member를 찾는 과정을 생각해볼 수 있습니다.

관련된 유사한 질문과 답변들

  1. 질문이 있습니다.

    • 요약: OrderServiceDiscountPolicy의 역할 분리와 계층 구조에 대한 질문.
    • 답변: OrderService에서는 할인율을 계산하지 않고 각 역할을 명확히 분리하는 것을 권장합니다. 또한, MemberRepository를 직접 사용하지 않고 MemberService를 통해 회원 정보를 가져오는 방법도 있습니다.
  2. OrderServiceImpl 클래스 질문있습니다.

    • 요약: MemberRepository.findById 사용 시, 왜 에러가 발생하지 않는지에 대한 질문.
    • 답변: MemoryMemberRepositoryMapstatic으로 선언되어 있기에 모든 인스턴스가 동일한 데이터를 공유한다는 점을 설명합니다.
  3. Discount 메서드에서 질문이 있습니다.

    • 요약: FixDiscountPolicyVIP 회원에게 할인을 적용하는 과정에 대한 질문.
    • 답변: Member 객체가 memberId를 통해 조회되고, 해당 Member의 정보가 사용된다는 점을 강조합니다.

위 질문들을 참고하여, MemoryMemberRepositoryMember 객체가 저장되어 있어야 findById를 통해 올바르게 Member 객체를 가져올 수 있습니다. 따라서 OrderServiceImpl 내에서 Member의 모든 정보가 올바르게 제공됩니다.

관련 코드 예제

다음은 OrderApp 클래스에서 Member 객체를 저장하고 OrderService를 통해 해당 Member를 조회하는 예제입니다:

public class OrderApp {
    public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        OrderService orderService = new OrderServiceImpl();

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);
        System.out.println("order = " + order);
    }
}

MemberServiceImpl을 통해 Member를 저장하고 나서, OrderServiceImpl에서 MemberRepository를 사용해 Member 정보를 올바르게 가져오는 과정을 담고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이현준님의 프로필 이미지
이현준
질문자

아아 그럼 memberRepository에 있는 memberId가 같은 객체를 찾아서 값을 member 변수에 주입시켜주니까, 다른 값들도 들어간다는 것이군요..! 한번에 이해했습니다. 감사합니다!

이현준님의 프로필 이미지
이현준

작성한 질문수

질문하기