24.09.16 17:01 작성
·
15
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
를 찾는 과정을 생각해볼 수 있습니다.
OrderService
와 DiscountPolicy
의 역할 분리와 계층 구조에 대한 질문.OrderService
에서는 할인율을 계산하지 않고 각 역할을 명확히 분리하는 것을 권장합니다. 또한, MemberRepository
를 직접 사용하지 않고 MemberService
를 통해 회원 정보를 가져오는 방법도 있습니다.MemberRepository.findById
사용 시, 왜 에러가 발생하지 않는지에 대한 질문.MemoryMemberRepository
의 Map
이 static
으로 선언되어 있기에 모든 인스턴스가 동일한 데이터를 공유한다는 점을 설명합니다.FixDiscountPolicy
가 VIP
회원에게 할인을 적용하는 과정에 대한 질문.Member
객체가 memberId
를 통해 조회되고, 해당 Member
의 정보가 사용된다는 점을 강조합니다.위 질문들을 참고하여, MemoryMemberRepository
에 Member
객체가 저장되어 있어야 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
정보를 올바르게 가져오는 과정을 담고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
2024. 09. 16. 17:08
아아 그럼 memberRepository에 있는 memberId가 같은 객체를 찾아서 값을 member 변수에 주입시켜주니까, 다른 값들도 들어간다는 것이군요..! 한번에 이해했습니다. 감사합니다!