[스프링부트] 장바구니가 안 뜨거나 중복으로 뜨는 오류 해결 (1102)

2022. 11. 2. 18:29Web Developer/SpringBoot/JPA

    문제 상황(1)

    상품을 장바구니에 담았다는 alert는 출력되었지만, 장바구니에 물건이 담아지지 않는 오류가 발생했다.

     

    해결방안

    1. workBench에서 각 엔티티를 확인한다. 

    cart
    cart_item

    확인 결과 장바구니(Cart) 엔티티는 정상 생성 되었지만, 장바구니 내 상품(CartItem) 엔티티는 생성되지 않았다.

    2. CartItem 관련 로직이 있는 파일들을 확인한다. 

    CartService의 일부

    원래는 저 파란 부분이 없었다...! 엔티티를 생성만 하고 저장하지 않았다. 이걸 빠트리다니ㅠㅠ

    추가하고 프로그램을 다시 실행한다.

    아마 오류가 하나만 있었다면 이제 정상 작동 될 것이다.

     

    문제 상황(2)

    문제가 하나가 아니었다.

    장바구니에 물품을 담는 것까지는 되는데, 장바구니에 상품을 하나 담으면 다섯 개가 출력되었다.

    이미지가 하나만 출력되는 것이 가장 수상하다.

     

    해결방안

    1. cart_item 데이터베이스를 확인해보았다.

    의도한 대로 데이터베이스에는 하나만 띄워져 있었다.

    그러면 하나의 컬럼을 다섯 번 띄우는 게 문제이니 HTML 파일 아니면 쿼리가 문제일 것 같다.

    2. HTML 파일(내 경우 cartList.html)을 확인해본다. 오류가 없었다.

    3. 쿼리를 진행한 CartItemRepository를 확인해본다.

    CartItemRepository의 일부

    대표 이미지일 경우만 가져와야 하는데, 해당 부분이 빠져 있다...

    의도한 바와 달리 ItemImg의 repImgYn(상품의 대표이미지 여부)이 'N'일 경우도 가져오다 보니,

    최대 업로드 가능 사진 개수대로 5번 출력되었다.

        @Query("select new com.tartbase.dto.CartDetailDto(ci.id, i.itemName, i.price, ci.count, im.imgUrl) " +
                "from CartItem ci, ItemImg im " +
                "join ci.item i " +
                "where ci.cart.id = :cartId " + // 장바구니에 담긴 상품의 대표 이미지만 가지고 오도록 조건문 작성
                "and im.item.id = ci.item.id " +
                "and im.repImgYn = 'Y' " +
                "order by ci.regTime desc"
        )
        List<CartDetailDto> findCartDetailDtoList(Long cartId);

    누락된 라인을 포함해서, JPQL을 위와 같이 수정했다.

    결과 및 깨달은 점

    정상 출력된다! JPQL 공부를 좀 더 해야겠다고 다짐하는 계기가 되었다...

     

    맨 위로