8w8u8

NullPointerException:Cannot invoke 000.findAll()" because "this.000Repository" is null 에러 해결 본문

back-end

NullPointerException:Cannot invoke 000.findAll()" because "this.000Repository" is null 에러 해결

jud1th 2025. 7. 5. 18:57

문제

java.lang.NullPointerException: Cannot invoke "com.efub.leadtoyproject.domain.review.repository.ReviewRepository.findAllByProduct(com.efub.leadtoyproject.domain.product.domain.Product)" because "this.reviewRepository" is null

원인

reviewRepository 필드가 null인 상태에서 findAllByProduct 메서드를 호출하려고 할 때 발생한 문제이다. 이는 해당 의존성이 제대로 주입되지 않았기 때문이다.

해결

생성자 주입 방식을 바꾸는 과정에서 final 을 빼먹어서 문제가 발생했던 것이었다.

생성자 주입 방식

기본 생성자 주입

@Service
public class ReviewService {
    private final ReviewRepository reviewRepository;

    @Autowired
    public ReviewService(ReviewRepository reviewRepository) {
        this.reviewRepository = reviewRepository;
    }

이때, 클래스에 생성자가 하나만 있는 경우 @Autowired 를 생략해주어도 된다.

다중 생성자 주입

@Service
public class ReviewService {
    private final ReviewRepository reviewRepository;
    private final ProductRepository productRepository;

    @Autowired
    public ReviewService(ReviewRepository reviewRepository) {
        this.reviewRepository = reviewRepository;
        this.reviewRepository = null; // 다른 생성자를 통한 주입이 아닌 경우
    }

    @Autowired
    public ReviewService(ReviewRepository reviewRepository, ProductRepository productRepository) {
        this.reviewRepository = reviewRepository;
        this.productRepository = productRepository;
    }

}

 

Lombok을 사용한 생성자 주입(추천)

@Service
@RequiredArgsConstructor
public class ReviewService {
    private final ReviewRepository reviewRepository;
    private final ProductRepository productRepository;

}

이때, 접근자를 final로 선언해야 lombok이 작동한다!!!