맛집 리뷰를 등록하기 위해서는 음식점의 정보, 리뷰에 업로드된 이미지도 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);
}
'web > 맛슐랭 Project' 카테고리의 다른 글
| 맛슐랭 - 맛집 리뷰 Controller 구현 (0) | 2024.03.27 |
|---|---|
| 맛슐랭 - 맛집 리뷰 service 구현 (CRUD) (0) | 2024.03.27 |
| 맛슐랭 - 엔티티 등록 (0) | 2024.03.27 |
| 맛슐랭 - 카카오 지도 API 사용하기 (0) | 2024.03.27 |
| 맛슐랭 - db 설계 (0) | 2024.03.27 |