강의

멘토링

로드맵

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

이기적인 개발자님의 프로필 이미지
이기적인 개발자

작성한 질문수

스프링 핵심 원리 - 기본편

관심사의 분리

OrderApp의 orderService와 memberService 내의 MemberRepository가 독립된 오브젝트가 아닌가요?

작성

·

231

0

안녕하세요.

강의를 듣던 중, 코드를 그대로 따라했는데 OrderApp에서 MemberNullPointerException이 나와서 추적하던 중, 주문서비스와 회원서비스의 레퍼지토리가 따로따로인 것 같아서 생기는 오류라고 추측되어 질문드립니다 !

Me

public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }

}

상단은 AppConfig입니다.

각 회원 서비스와 멤버 서비스의 매개변수에는 new MemoryMemberRepository()로 되어있는데.. 각 새로운 인스턴스를 생성해서 생기는 오류인 것 같아서요. 

public class OrderApp {
    public static void main(String[] args) {

        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService =  appConfig.orderService();

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

        Member findMember = memberService.findMember(1L);
        System.out.println("new Member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
        System.out.println("find Member id = " + findMember.getId());
        
//        Order order = orderService.createOrder(memberId, "itemA", 10000);
//
//        System.out.println("order = " + order);
    }
}

상단의 memberService 내의 findMember(1L)를 확인하기 위해 OrderApp을 돌려보면 findMember의 값이 잘 나옵니다. 그런데, orderService 내의 memberRepository를 참조하면 nullPointerException 오류가 납니다. 각 다른 저장소라 그런 것으로 보이는데 강의에서는 잘 돌아가는게 제가 모르는 부분이 어떤건지 싶네요..(제 환경에서는 돌아가지 않고 pdf를 그대로 복사붙여넣기 했는데 왜 그런가 싶네요.)

퀴즈

51%나 틀려요. 한번 도전해보세요!

객체를 직접 생성(new)하여 의존성을 관리할 때 발생하기 쉬운 설계상의 문제는 무엇인가요?

컴파일 오류가 발생한다.

요구사항 변경 시 클라이언트 코드 수정이 필요해진다.

객체 직렬화가 불가능해진다.

멀티 스레딩 환경에서 문제가 생긴다.

답변 2

3

해결 되었습니다 ..! ㅠ

다른 수강생과 같은 이유였군요.

혹시나 같은 문제이신 분 있으실까봐 도움 되시라고 올립니다 !

hello.core.member.MemoryMemberRepository;

의 Hash Map이 static인지 보시면 될 것 같아요.

정적 변수이기에 데이터를 서로 공유가 가능하며, 위의 질문에 대한 문제가 해결 됩니다 !

private static Map<Long, Member> store = new HashMap<>();

0

김영한님의 프로필 이미지
김영한
지식공유자

잘 해결하셨습니다^^

이기적인 개발자님의 프로필 이미지
이기적인 개발자

작성한 질문수

질문하기