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

노태근님의 프로필 이미지
노태근

작성한 질문수

스프링 핵심 원리 - 기본편

주문과 할인 도메인 실행과 테스트

데이터 호출관련 문의드립니다

작성

·

31

0

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

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

        Long id=10L;
        Member member = new Member(id, "aaa", Grade.VIP);
        memberService.join(member);

        System.out.println(member.getName()+" "+" "+member.getId()+" "+" "+member.getGrade());

       Order order = orderService.createOrder(id,"XBOX",100000);
//
//        System.out.println("order = " + order);
    }
}

멤버의 정보까지는 정상적으로 불러와지는데 주문정보를

호출하는 과정부터 멤버 정보를 받아오지 못하는거 같습니다.

public interface OrderService {
    Order createOrder(Long id, String itemName, int itemPrice) throws IllegalStateException;

}
public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository = new MemoryMemberRepository();//회원 정보 찾기
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();//할인 금액

    @Override
    public Order createOrder(Long id, String itemName, int itemPrice) {
        Member member = memberRepository.findById(id);
        if(id ==null){
            throw new IllegalStateException("유효하지 않은 아이디 입니다" + id);
        }
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(id, itemName, itemPrice,discountPrice);
    }
}
public class Order {
    private Long id;
    private String itemName;
    private int itemPrice;
    private int discountPrice;

    public Order(Long id, String itemName, int itemPrice, int discountPrice) {
        this.id = id;
        this.itemName = itemName;
        this.itemPrice = itemPrice;
        this.discountPrice = discountPrice;
    }

    public int calculatePrice(){
        return itemPrice - discountPrice; //비지니스 로직
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice = itemPrice;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }
}

order 패키지 쪽 소스 인데 수정해야 될부분이 있을까요

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "hello.core.member.Member.getGrade()" because "member" is null

at hello.core.discount.FixDiscountPolicy.discount(FixDiscountPolicy.java:10)

at hello.core.order.OrderServiceImpl.createOrder(OrderServiceImpl.java:20)

at hello.core.OrderApp.main(OrderApp.java:22)

에러는 이와같이 발생합니다

도와주셔서 감사합니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

노태근님께서 제공해주신 코드와 오류를 살펴보니, NullPointerException이 발생하는 원인은 OrderServiceImpl 클래스에서 memberRepository.findById(id)가 null을 반환했기 때문으로 보입니다. 즉, OrderServiceImpl 내에서 사용하는 MemberRepository가 올바르게 초기화되지 않았거나, 멤버 정보가 저장되어 있지 않아 발생하는 문제로 보입니다.

이 문제를 해결하기 위해 다음 사항들을 확인하고 수정하시면 도움이 될 것입니다:

  1. MemberRepository의 저장소가 static인지 확인:
    • MemoryMemberRepository 클래스의 저장소(Map<Long, Member>)를 static으로 선언해야 합니다. 그래야만 모든 인스턴스에서 동일한 저장소를 공유할 수 있어 등록된 멤버 정보를 올바르게 참조할 수 있습니다.
   public class MemoryMemberRepository implements MemberRepository {
       private static Map<Long, Member> store = new HashMap<>();
       // ... other methods
   }
  1. MemberServiceImpl과 OrderServiceImpl의 일관된 초기화:
    • MemberServiceImplOrderServiceImpl이 동일한 MemoryMemberRepository 인스턴스를 사용하도록 해야 합니다. 혹시 잘못된 인스턴스를 사용 중이라면, 새로운 인스턴스가 아닌 공유된 인스턴스를 사용하도록 코드를 조정해 보세요.

위의 두 가지 사항이 해결되면, memberService.join(member);를 통해 MemberRepository에 추가된 멤버 정보를 OrderServiceImpl이 올바르게 참조할 수 있을 것입니다.

좀 더 구체적인 예를 원하시면, Exception in thread를 유발하는 이유와 해결 방법을 다룬 이 유사한 게시물을 참고해보세요. 이 문제에 대해 더 자세히 설명하고 있으며 해결 방안도 함께 제공하고 있습니다.

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

노태근님의 프로필 이미지
노태근
질문자

감사합니다

 

노태근님의 프로필 이미지
노태근

작성한 질문수

질문하기