본문 바로가기
web/맛슐랭 Project

맛슐랭 - 맛집 리뷰 생성을 위한 Repository 구현

by su0a 2024. 3. 27.

맛집 리뷰를 등록하기 위해서는 음식점의 정보, 리뷰에 업로드된 이미지도 DB에 저장되어야 한다.

1. PlaceRepository

해당 장소가 이미 등록되어 있는지 확인하고 그 장소를 반환 받기 위해 위도, 좌표를 사용하였다.

public interface PlaceRepository extends JpaRepository<Place,Long> {
    // pos_x와 pos_y값이 모두 일치하는 장소가 있는지 확인
    boolean existsByPosXAndPosY(String posX, String posY);

    // pos_x와 pos_y값이 모두 일치하는 장소 반환
    Optional<Place> findByPosXAndPosY(String posX, String posY);
}

 

 

2. UploadImageRepository

UploadImage도 DB에 저장되도록 JpaRepository를 상속받아 만들어주었다.

public interface UploadImageRepository extends JpaRepository<UploadImage,Long> {
}

 

3. ReviewRepository

모든 엔티티에 지연로딩을 사용하였기 때문에 객체를 조회할 때 실제 객체를 받아오지 않고 프록시 객체가 생성된다.

Member, Place는 다대일 관계이므로 dto 객체만 사용해도 문제가 없으나 UploadImage엔티티와는 일대다 관계이므로 n+1문제가 발생한다. 따라서 쿼리 어노테이션을 사용하여 페치조인으로 객체들을 한번에 받아오자.

@Repository
public interface ReviewRepository extends JpaRepository<Review,Long> {

    // 멤버의 email을 통해 특정 멤버가 작성한 모든 리뷰를 반환하기 위한 메서드
    @Query("select r from Review r " +
            "join fetch r.member m "+
            "join fetch r.place p "+
            "left join fetch r.uploadImages u "+
            "where r.member.email=:email")
    List<Review> findByMemberEmail(@Param("email")String memberEmail);

    // 특정 멤버가 작성한 리뷰의 개수를 알기 위한 메서드
    @Query("select count(r) from Review r "+
            "where r.member.email = :email")
    Long countReviewByMemberEmail(@Param("email") String email);

    // 특정 멤버가 특정 장소에 대해 이미 리뷰를 작성했는지 확인하는 메서드
    boolean existsByMemberAndPlace_PosXAndPlace_PosY(Member member, String posX, String posY);

}