inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

[스프링핵심원리-기본편] 주문과 할인 도메인 테스트 관련해서 질문드립니다.

232

김준기

작성한 질문수 4

1

강의: 스프링 핵심 원리 - 기본편 (김영한님)

질문내용: 테스트코드 중 서로다른 객체 참조로 인한 null값 오류

<멤버레포지토리구현체 클래스>

public class MemoryMemberRepository implements MemberRepository{

	private Map<Long, Member> memberRepository = new HashMap<>();
	
	@Override
	public void save(Member member) {
		memberRepository.put(member.getId(), member);
	}

	@Override
	public Member findById(Long id) {
		return memberRepository.get(id);
	}

	@Override
	public List<Member> findAll() {
		return new ArrayList<>(memberRepository.values());
	}

}

<멤버서비스구현체 클래스>

public class MemberServiceImpl implements MemberService {

	private final MemberRepository memberRepository = new MemoryMemberRepository();
	
	@Override
	public void join(Member member) {
		memberRepository.save(member);
	}

	@Override
	public Member findOne(Long id) {
		return memberRepository.findById(id);
	}

	@Override
	public List<Member> findMembers() {
		return memberRepository.findAll();
	}
	
}

<주문서비스구현체 클래스>

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);
		System.out.println(memberId);
		System.out.println(member);
		
		int discountPrice = discountPolicy.discount(member, itemPrice);
		return new Order(memberId, itemName, itemPrice, discountPrice);
	}
		
}

<테스트코드>

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, "Spring강의", Grade.VIP);
		memberService.join(member);
		Order order = orderService.createOrder(memberId, "iteamA", 10000);
		
		System.out.println("order = " + order);
	}
}

테스트코드 프로세스:

1) 멤버서비스객체: 회원가입 (join메소드)

2) 주문서비스객체: 회원조회하여 할인정책 적용하여 리턴


질문은 다음과 같습니다!

테스트케이스를 실행시,

다음과 같은 NullPointerException이 발생하는데요,

위의 멤버서비스와 주문서비스 클래스를 보시면 서로 다른 MemoryMemberRepository 객체를 생성하는 즉, 서로 다른 객체를 참조하고 있기 때문에 당연한 에러라고 생각합니다.

(멤버서비스에서 회원가입을 진행한 레포지토리와, 주문서비스에서 조회하는 레포지토리가 다르기 때문)

하지만, 강의에선 에러 없이 정상작동하는데... 놓친 부분이 없을텐데 무엇이 문제인 것인지지 여쭙고싶습니다 ㅠ

(추가)

  1. 다음과 같이 테스트케이스 메인메소드에서 동일한 객체를 참조하도록 멤버레포지토리 의존성주입을 하여 에러는 해결했습니다만, 강의에선 생성자주입없는 상태에서도 에러가 발생하지 않았는데 이유를 모르겠습니다 ㅠ

  2. 의존성 주입의 이유중 하나로 다음과 같이 "동일한 객체를 참조하기 위함"도 있는 것인지 여쭙고싶습니다.

public class OrderApp {
	public static void main(String[] args) {
		MemberRepository memoryRepository = new MemoryMemberRepository();
		MemberService memberService = new MemberServiceImpl(memoryRepository); //일단 회원가입 해야하니 필요
		OrderService orderService = new OrderServiceImpl(memoryRepository);
	
		Long memberId = 1L;
		Member member = new Member(memberId, "Spring강의", Grade.VIP);
		memberService.join(member);
		Order order = orderService.createOrder(memberId, "iteamA", 10000);
		
		System.out.println("order = " + order);
	}
}

oop spring

답변 1

0

OMG

안녕하세요. 김준기님, 공식 서포터즈 OMG입니다.

코드를 더 살펴봐야 겠지만, 올리신 코드를 보면 static이 누락되어 있네요.

image2번은 맞습니다.

static추가하여 확인하시고 에러가 발생한다면 강의와 다르게 작성한 코드 부분이 있는지 확인해주셔야 할 것 같아요.

해결이 안될 경우 댓글남겨주세요.

감사합니다.

0

김준기

static을 전혀 생각하지 못하고 있었네요...

해결했습니다 ㅎ 답변 주셔서 감사합니다.

빈 스코프 개념의 중요성

0

21

1

SingletonService가 JVM이 뜰 때 생성되는게 맞나요?

0

66

2

섹션3. 11 회원객체 다이어그램

0

38

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

40

1

코드 자료

0

85

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

83

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

100

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

104

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

89

1

테스트 속도가 나중에 영향이 있을까요?

0

91

1

gradle 설정 안떠서 질문 남깁니다!

0

147

2

build.gradle로 프로젝트를 여는 이유

0

101

1

provider 사용하는 이유

0

98

1

다음 강의 뭘 들어야 할까요

0

140

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

70

1

beanB

0

94

2

퀴즈다시풀기

0

77

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

105

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

72

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

116

2

도메인의 정의?

0

64

1

ApplicationContext 질문입니다.

0

68

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

98

2

ai api 선정하기 관련 질문

0

141

2