sg8541 / minikosa

3 stars 3 forks source link

hotfix: 댓글 insert 중 에러 발생 #82

Closed ksks1234 closed 3 days ago

ksks1234 commented 3 days ago
kyudori commented 3 days ago

로그인 후 토큰 저장 image

Headers

댓글 정보

가게 메뉴 정보

kyudori commented 3 days ago

2024-11-13T20:19:53.975+09:00 WARN 9956 --- [mini] [nio-8090-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the parameter name "{ "storeId": 31, "memberId": 40, "reviewText": "가게 이쁘고 좋아요~", "storeName": "이복근베이커리", "rating": 4}" is not allowed.]

날려야하는 것만 날려야하는데 too much로 날려서 그런 것 같습니다.

kyudori commented 3 days ago

2024-11-13T20:14:41.226+09:00 WARN 9956 --- [mini] [nio-8090-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of com.kosa.mini.api.entity.Store (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (31)] entity를 사용해서 직접 반환하거나 요청받으면 에러날 가능성이 많아요. 그래서 DTO를 사용해서 처리하는 걸 추천 검색 Keyword 역직렬화

kyudori commented 3 days ago
    @GetMapping("/review/{storeId}")
    public ResponseEntity<List<StoreReviewDTO>> showReply(@PathVariable Integer storeId) {
        List<StoreReviewDTO> replyList = reviewApiService.getReply(storeId);
        return new ResponseEntity<>(replyList, HttpStatus.OK);
    }
    @PostMapping("/review/{storeId}")
    public ResponseEntity<Review> createReview(@PathVariable Integer storeId, @RequestBody ReviewSaveDTO reviewSaveDTO) {
        System.out.println("컨트롤러 : " + reviewSaveDTO.toString());
        Review created = reviewApiService.createReview(reviewSaveDTO);
        return ResponseEntity.status(HttpStatus.CREATED).body(created);
    }

Review Entity 객체를 쓰면서 에러가 발생하는 것 같아요. 이걸 DTO로 바꿔서 그걸 저장해야할 것 같습니다.

kyudori commented 3 days ago

JPA 쿼리는 Entity 객체를 결과로 만들지만 집계 함수가 있는 쿼리의 경우 Object 배열을 반환 출처: https://yodurumi.tistory.com/539 [알이즈웰:티스토리] + SELECT 절에서 집계 함수를 사용하는 경우, 집계되지 않은 모든 필드를 GROUP BY 절에 포함시켜야하는게 규칙이라고 하네요. 그 밖에 JPQL의 SELECT new 구문에서 선택한 필드의 순서와 DTO 클래스의 생성자 매개변수 순서가 정확히 일치하는지 확인해야하구요~

kyudori commented 3 days ago

이를 통해, Slice 와 Page의 차이는 전체 페이지 수와 전체 데이터 개수를 조회하는지 안하는지에 대한 차이가 있다.

전체 페이지 개수와 전체 데이터 수를 이용하는 실제 게시판 형식의 페이징 처리를 구현해야한다면 Page를 이용하고, 요즘 많이 사용하는 무한 스크롤 방식을 사용한다면 전체 페이지와 데이터 개수가 필요없기 때문에 Slice 방식을 이용하는 것이 효율적이라 판단된다. https://velog.io/@dani0817/Spring-Boot-%ED%8E%98%EC%9D%B4%EC%A7%95Paging-%EC%A0%81%EC%9A%A9