본문 바로가기
Study in Bootcamp/Main Project

[Main Project] Day 21 : 마지막 디밸롭 및 수정

by Bhinney 2022. 12. 6.

본 글은 프로젝트를 기록하기 위해 적은 글 입니다.

수정이 될 수 있으며, 정확하지 않을 수 있습니다.


🖤 리뷰 작성 시, 구매한 적이 있는 회원만 작성 가능

  • 이전 : 모든 소비자는 리뷰를 작성할 수 있다.
  • 수정 : 구매한 적이 있는 소비자만 작성할 수 있다.

: 리뷰를 작성할 때, 해당 상품을 산 적이 있는 소비자만 구매할 수 있도록 수정하였다. 리뷰 테이블과 주문 테이블이 연관관계에 있지 않기 때문에 Client의 연관관계를 이용해 1차로 불러온 후,  상품 아이디와 상태를 비교하였다. 내가 하나하나 확인하도록 하기보다는 stream의 필터를 이용하여 구현하는 방식으로 코드를 구성하였다. 먼저 주문의 상품 아이디가 리뷰의 상품아이디와 같은지 확인하고, 그 다음 주문의 상태가 결제 완료인지 확인한다. 그리고 이 리스트의 사이즈가 0이면, 즉 위의 필터에 해당하는 부분이 없으면 예외를 발생시킨다. List가 아니라 long으로 하고 count로 받아도 된다. 사실 이 로직보다 더 나은 방법이 있을 거 같긴 하다. 그래서 우선 구현해놓고 더 생각해서 더 나은 코드가 있을 지 생각해보려고 한다.

/* 리스트의 사이즈로 확인 */
List<Ord> ordList = ordRepository.findByClient_ClientId(clientId);
List<Ord> hasProduct = ordList.stream()
    .filter(ord -> ord.getProduct().getProductId() == review.getBoard().getProduct().getProductId())
    .filter(ord -> ord.getStatus() == Ord.OrdStatus.PAY_COMPLETE)
    .collect(Collectors.toList());
if (hasProduct.size() == 0) {
    throw new BusinessLogicException(ExceptionCode.NOT_BUY_REVIEW);
}

/* Stream의 count 이용 */
long hasProduct = ordList.stream()
    .filter(ord -> ord.getProduct().getProductId() == review.getBoard().getProduct().getProductId())
    .filter(ord -> ord.getStatus() == Ord.OrdStatus.PAY_COMPLETE)
    .count();
if (hasProduct == 0) {
    throw new BusinessLogicException(ExceptionCode.NOT_BUY_REVIEW);
}

🖤 1개만 있는 리뷰 삭제가 안되는 문제 

  • 문제 : 리뷰가 한 개만 있는 게시판에서 리뷰를 삭제하면 500 에러 발생
  • 원인 : 별점의 평균을 repository에서 query문으로 처리하여 불러오는데, 게시판의 리뷰가 0이 되기 때문에 불러오지 못함
  • 해결 : 리뷰가 없으면, 평균값을 0으로 처리하도록 수정

: 리뷰가 한 개만 존재하는 게시판에서 해당 리뷰를 삭제할 수 없는 문제가 발생하였다. 해당 원인은 리뷰의 별점 평균을 Repository에서 @Query를 이용하여 불러오는데, 리뷰가 존재하지 않기 때문에 발생하는 문제였다. 그래서 보드에 리뷰가 존재하지 않으면, 별점 평균을 0으로 지정해주었다. 어차피 다 삭제하면 평균은 0이 되니까! 그랬더니 다행이도 잘 돌아갔다.

/* 만약 보드에서 리뷰가 없으면 평균값을 0으로 만듦 -> repository 에서 찾지 못함 */
if (board.getReviewList().size() == 0) {
    board.setReviewAvg(0);
} else {
    board.setReviewAvg(reviewRepository.findbyReviewAvg(board.getBoardId()));
}

🖤 헤더에 토큰을 날리지 않았던 문제

  • 문제 및 이유 : /access에서 토큰을 한번 더 받아오는데 이때 SELLER는 헤더에 토큰을 날리지 않았음..
  • 해결 : 헤더 추가

: 진짜 예상하지 못했던 에러였다. 소비자와 생산자의 응답 바디가 다르다보니 조건문으로 처리해서 구현했다. 근데 이때 소비자에는 헤더를 보내지만, 판매자에게는 헤더를 보내지 않았다.. 이 문제는 프런트 분이 우연히 알게 되여 나에게 알려주셨다... 오늘 알게 되서 천만 다행이지... 데모데이때 알았으면 식겁했을 것 같다. 그래도 배포 자동화 상태라 수정이 바로 반영되지만..!


🔥내일 할 일

  • 데모데이
  • 프로젝트 회고

댓글