< 에러 메시지 >
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 인스턴시된게 들어감 이걸 생성자 주입이라한다
'에러 모음' 카테고리의 다른 글
[docker] Error response from daemon: Conflict. (0) | 2024.04.16 |
---|---|
org.apache.jasper.JasperException (1) | 2024.04.13 |
org.springframework.boot:spring-boot-gradle-plugin:3.2.4 (0) | 2024.04.10 |
o.s.b.d.LoggingFailureAnalysisReporter (0) | 2024.04.09 |
AssertionFailedError (0) | 2024.04.08 |