에러 모음

java.lang.NullPointerException

junani0v0 2024. 4. 10. 22:37

 

< 에러 메시지 >

java.lang.NullPointerException: Cannot invoke "hello.core.discount.DiscountPolicy.discount(hello.core.member.Member, int)" because "this.discountPolicy" is null

 

< 원인 >

private final DiscountPolicy discountPolicy = new FixDiscountPolicy();

원래 이 코드를 DIP원칙에 맞는 코드를 작성하기위해 discountPolicy의 구현 클래스를 아래처럼 삭제하여 아무것도 할당되지 않아 발생

private DiscountPolicy discountPolicy;

 

쉽게 말해 null값에 .을 찍어서 발생

 

< 해결 >

클라이언트에 DiscountPolicy의 구현객체를 대신 생성하고 주입해주어야 한다

 

private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemoryRepository memoryRepository, DiscountPolicy discountPolicy) {
    this.memoryRepository = memoryRepository;
    this.discountPolicy = discountPolicy;
}

인터페이스에만 의존하게 하기위해 구현 클래스 삭제 후 생성자 생성

기존에있는 역활을 분리하여 AppConfig를 생성하여 애플리케이션의 실제 동작에 필요한 구현 객체를 생성

public class AppConfig {
	private static MemoryRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());//DI 의존관계 주입
    }
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy(); //다른 구현체로 변경시 여기만 바꾸면됨
        return new RateDiscountPolicy();
        //변경시 애플리케이션의 구성 역활을 담당하는 AppConfig만 변경
        //클라이언트 코드인 OrderServiceImpl를 포함한 사용역역 변경X
    }

AppConfig를 통해 MemberService를 불러 사용하면 구현객체인 MemberServiceImpl이 생성되고 MemberServiceImpl에 Memory MemberRepository를 넣어서 줌

즉, 생성자를 통해서 객제가 new 인스턴시된게 들어감 이걸 생성자 주입이라한다