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

송유진님의 프로필 이미지
송유진

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

모임 참가 신청 및 취소

참가 신청 로직과 비슷한 구조 제작 중 이슈가 생겨서 도움 요청드립니다.

작성

·

261

0

안녕하세요. 강사님!
강의해주신 내용 중 Event-Enrollment 연관매핑되어 참가신청하는 로직을 참고하여 개발중에 있습니다.

저는 Shop과 Product 를 Event, Enrollment와 동일한 구조로 개발하였는데, Shop 엔티티에 매핑되어있는 products 에 add할 때 NullPointerException 을 발생시키네요.

products에 new ArrayList<>(); 로 초기화도 시켜두었는데 에러 나는 이유가 무엇일지 알려주시면 감사하겠습니다!

메인Runner 클래스에서 테스트한건데 그부분이 문제일까요?..

<강의 내 Event, Enrollment 관련 코드>

-- Event.java

    @OneToMany(mappedBy = "event")
    @OrderBy("createdDate")
    private List<Enrollment> enrollments = new ArrayList<>();

// 생략    

public void addEnrollment(Enrollment enrollment) {
        this.enrollments.add(enrollment);
        enrollment.setEvent(this);
    }

-- Enrollment.java

    @ManyToOne
    private Event event;


-- EventService.java

    public void newEnrollment(Account account, Event event) {
        if(enrollmentRepository.existsByEventAndAccount(event, account)) {
            throw new IllegalArgumentException("이미 참가 신청된 계정입니다.");
        }
        Enrollment enrollment = Enrollment.builder().account(account).build();
        enrollmentRepository.save(enrollment);
        event.addEnrollment(enrollment);
    }

<제 코드>

-- Shop.java

public class Shop extends CommonField {

    @Id @GeneratedValue
    private Long id;

    private String shopName;

    private String siteUrl;

    @OneToMany(mappedBy = "shop")
    @OrderBy("createdDate")
    private List<Product> products = new ArrayList<>();

    public void addProduct(Product product) {
        this.products.add(product); // --> this.products에서 NullPointerException 발생!!
        product.setShop(this);
    }
}

-- Product.java

public class Product extends CommonField {

    @Id
    @GeneratedValue
    private Long id;

    @Column(unique = true)
    private String productId;

    private String title;

    private String price;

    private String thumbUrl;

    private String detailUrl;

    @ManyToOne
    private Shop shop;
}

-- 테스트 코드

	private void CrawlerTest() throws IOException {
		// 쇼핑몰 생성
		Shop shop = Shop.builder().shopName("미스터스트리트").siteUrl("https://mr-s.co.kr/").build();
		shopRepository.save(shop);

		Shop newshop = shopRepository.findByShopName(shop.getShopName());

		// 최신 상품 목록 크롤링
		Crawler crawler = new mrStreetCrawler(shop.getSiteUrl());
		List<Product> products = crawler.run();

		// 연관관계 설정
		for(Product product : products) {
			product = productRepository.save(product);
			newshop.addProduct(product); // --> 에러 발생
		}

	}

답변 1

0

백기선님의 프로필 이미지
백기선
지식공유자

음 글쎄요. 디버거를 사용해서 해당 부분에서 어떤 인스턴스가 왜 null인지 확인해 보셔야겠네요. list는 초기화를 하셨으니 null이 아닐것 같은데 그럼 혹시 product가 null인건 아닌가 싶네요.

송유진님의 프로필 이미지
송유진

작성한 질문수

질문하기