나와바리 - 식당 상세조회

Sungmin·2023년 6월 20일
0

식당 상세 조회는 기존에 EntityManager에 내장된 findOne을 사용하여 식당을 클릭할 시 식당 정보를 한번에 모두 가져오는 방식이었다.

그러나 리뷰가 많아지면 한 번에 다 가져오기 힘들기 때문에 조회되는 리뷰수를 줄이고
리뷰 더 보기 버튼을 누르면 전체리뷰를 볼 수 있는 페이지로 이동하도록 변경 할 것이다.

고려해야할 점

💡 식당을 클릭하면 식당의 정보를 모두 반환해야 함.

💡 단! 리뷰는 좋아요 개수가 많은 순으로 TOP3만 담겨야 함.

💡 주의! 리뷰의 총 개수에는 영향을 주면 안됨.



어려웠던 점

  1. Fetch Join으로 식당에서 리뷰에 접근하여 리뷰의 좋아요 개수로 정렬하는 방식을 시도하였는데 결과는 review가 전부 담겨져 있었다.
public Restaurant findReviewTop3(Long restaurant_id) {
    return em.createQuery("SELECT r FROM Restaurant r LEFT JOIN r.reviews rev WHERE r.id = :restaurant_id ORDER BY rev.likeCount DESC", Restaurant.class)
            .setParameter("restaurant_id", restaurant_id)
            .setMaxResults(3)
            .getSingleResult();
}

이렇게 하면 리뷰가 3개만 담겨져 저장될 줄 알았는데 아니었다.

해결방법!

메서드를 두 개 사용하였다.

  1. findOne으로 우선 식당의 정보를 전부 가져온다.
  2. findReviewTop3 메서드를 추가하여 식당의 Top3리뷰만 가져온다.
  3. 새로운 Restaurant 객체를 만들어 각각의 필요한 정보를 담아 반환.

findReviewTop3 메서드

    public List<Review> findReviewTop3(Long restaurant_id) {
        return em.createQuery("select r from Review r where r.restaurant.id = :restaurant_id ORDER BY likeCount DESC", Review.class)
                .setParameter("restaurant_id", restaurant_id)
                .setMaxResults(3)
                .getResultList();
    }

결론

한 번에 가져오고 싶었지만 리뷰는 따로 가져오는 방식을 택하게 되었다.
하지만 이 방식이 복잡하지 않고 간단한 방식이라 맘에 든다.
실력은 고민하면서 성장한다!

profile
Let's Coding

0개의 댓글