From ef6dd8ab9259f741f68b03c351d320baea61f725 Mon Sep 17 00:00:00 2001 From: minmin02 Date: Fri, 10 Oct 2025 21:57:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=20fea=20:=205=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/inquiry/{ => entity}/Inquries.java | 7 ++-- .../{ => entity}/inquiryAttachments.java | 3 +- .../domain/member/{ => entity}/Agree.java | 2 +- .../domain/member/{ => entity}/Member.java | 11 ++---- .../domain/mission/{ => entity}/Mission.java | 13 ++++--- .../domain/mission/mapping/UserMission.java | 4 +- .../repository/RegionMissionRepository.java | 33 ++++++++++++++++ .../repository/UserMissionRepository.java | 25 ++++++++++++ .../domain/region/{ => entity}/Region.java | 5 +-- .../domain/region/{ => entity}/SubRegion.java | 2 +- .../review/{ => entity}/OwnerComment.java | 3 +- .../domain/review/{ => entity}/Review.java | 7 +--- .../review/{ => entity}/ReviewImage.java | 2 +- .../review/repository/ReviewRepository.java | 39 +++++++++++++++++++ .../example/umc_9th/domain/store/Store.java | 9 ++--- .../store/mapping/MemberFoodCategory.java | 2 +- 16 files changed, 126 insertions(+), 41 deletions(-) rename src/main/java/com/example/umc_9th/domain/inquiry/{ => entity}/Inquries.java (77%) rename src/main/java/com/example/umc_9th/domain/inquiry/{ => entity}/inquiryAttachments.java (84%) rename src/main/java/com/example/umc_9th/domain/member/{ => entity}/Agree.java (94%) rename src/main/java/com/example/umc_9th/domain/member/{ => entity}/Member.java (84%) rename src/main/java/com/example/umc_9th/domain/mission/{ => entity}/Mission.java (80%) create mode 100644 src/main/java/com/example/umc_9th/domain/mission/repository/RegionMissionRepository.java create mode 100644 src/main/java/com/example/umc_9th/domain/mission/repository/UserMissionRepository.java rename src/main/java/com/example/umc_9th/domain/region/{ => entity}/Region.java (85%) rename src/main/java/com/example/umc_9th/domain/region/{ => entity}/SubRegion.java (91%) rename src/main/java/com/example/umc_9th/domain/review/{ => entity}/OwnerComment.java (83%) rename src/main/java/com/example/umc_9th/domain/review/{ => entity}/Review.java (85%) rename src/main/java/com/example/umc_9th/domain/review/{ => entity}/ReviewImage.java (90%) create mode 100644 src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java diff --git a/src/main/java/com/example/umc_9th/domain/inquiry/Inquries.java b/src/main/java/com/example/umc_9th/domain/inquiry/entity/Inquries.java similarity index 77% rename from src/main/java/com/example/umc_9th/domain/inquiry/Inquries.java rename to src/main/java/com/example/umc_9th/domain/inquiry/entity/Inquries.java index 55431dc..b87013b 100644 --- a/src/main/java/com/example/umc_9th/domain/inquiry/Inquries.java +++ b/src/main/java/com/example/umc_9th/domain/inquiry/entity/Inquries.java @@ -1,9 +1,8 @@ -package com.example.umc_9th.domain.inquiry; +package com.example.umc_9th.domain.inquiry.entity; -import com.example.umc_9th.domain.member.Gender; -import com.example.umc_9th.domain.member.Member; -import com.example.umc_9th.domain.review.Review; +import com.example.umc_9th.domain.inquiry.InquriesType; +import com.example.umc_9th.domain.member.entity.Member; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/umc_9th/domain/inquiry/inquiryAttachments.java b/src/main/java/com/example/umc_9th/domain/inquiry/entity/inquiryAttachments.java similarity index 84% rename from src/main/java/com/example/umc_9th/domain/inquiry/inquiryAttachments.java rename to src/main/java/com/example/umc_9th/domain/inquiry/entity/inquiryAttachments.java index fc50de0..c4d9879 100644 --- a/src/main/java/com/example/umc_9th/domain/inquiry/inquiryAttachments.java +++ b/src/main/java/com/example/umc_9th/domain/inquiry/entity/inquiryAttachments.java @@ -1,7 +1,6 @@ -package com.example.umc_9th.domain.inquiry; +package com.example.umc_9th.domain.inquiry.entity; -import com.example.umc_9th.domain.member.Member; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/umc_9th/domain/member/Agree.java b/src/main/java/com/example/umc_9th/domain/member/entity/Agree.java similarity index 94% rename from src/main/java/com/example/umc_9th/domain/member/Agree.java rename to src/main/java/com/example/umc_9th/domain/member/entity/Agree.java index e666a87..575ed9b 100644 --- a/src/main/java/com/example/umc_9th/domain/member/Agree.java +++ b/src/main/java/com/example/umc_9th/domain/member/entity/Agree.java @@ -1,4 +1,4 @@ -package com.example.umc_9th.domain.member; +package com.example.umc_9th.domain.member.entity; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; diff --git a/src/main/java/com/example/umc_9th/domain/member/Member.java b/src/main/java/com/example/umc_9th/domain/member/entity/Member.java similarity index 84% rename from src/main/java/com/example/umc_9th/domain/member/Member.java rename to src/main/java/com/example/umc_9th/domain/member/entity/Member.java index 73a8105..0c6eb96 100644 --- a/src/main/java/com/example/umc_9th/domain/member/Member.java +++ b/src/main/java/com/example/umc_9th/domain/member/entity/Member.java @@ -1,17 +1,12 @@ -package com.example.umc_9th.domain.member; +package com.example.umc_9th.domain.member.entity; -import com.example.umc_9th.domain.mission.mapping.UserMission; -import com.example.umc_9th.domain.region.Region; -import com.example.umc_9th.domain.region.SubRegion; -import com.example.umc_9th.domain.review.Review; +import com.example.umc_9th.domain.member.Gender; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.ColumnDefault; import java.time.LocalDate; -import java.util.List; @Entity @Getter @@ -22,7 +17,7 @@ public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; //pk + private Long memberId; //pk @Column(nullable = false, length = 50) private String name; //이름 diff --git a/src/main/java/com/example/umc_9th/domain/mission/Mission.java b/src/main/java/com/example/umc_9th/domain/mission/entity/Mission.java similarity index 80% rename from src/main/java/com/example/umc_9th/domain/mission/Mission.java rename to src/main/java/com/example/umc_9th/domain/mission/entity/Mission.java index 19cedbd..5ef5141 100644 --- a/src/main/java/com/example/umc_9th/domain/mission/Mission.java +++ b/src/main/java/com/example/umc_9th/domain/mission/entity/Mission.java @@ -1,13 +1,10 @@ -package com.example.umc_9th.domain.mission; +package com.example.umc_9th.domain.mission.entity; -import com.example.umc_9th.domain.mission.mapping.UserMission; -import com.example.umc_9th.domain.review.Review; +import com.example.umc_9th.domain.review.entity.Review; +import com.example.umc_9th.domain.store.Store; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.ColumnDefault; - -import java.util.List; @Entity @@ -41,6 +38,10 @@ public class Mission extends BaseEntity { // private List userMissions ; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "store_id") + private Store store; + @ManyToOne(fetch = FetchType.LAZY) // 리뷸 테이블 N:1 관계 매핑 @JoinColumn(name = "review_id") private Review review; diff --git a/src/main/java/com/example/umc_9th/domain/mission/mapping/UserMission.java b/src/main/java/com/example/umc_9th/domain/mission/mapping/UserMission.java index 3f2a07c..170a2b5 100644 --- a/src/main/java/com/example/umc_9th/domain/mission/mapping/UserMission.java +++ b/src/main/java/com/example/umc_9th/domain/mission/mapping/UserMission.java @@ -1,8 +1,8 @@ package com.example.umc_9th.domain.mission.mapping; -import com.example.umc_9th.domain.member.Member; -import com.example.umc_9th.domain.mission.Mission; +import com.example.umc_9th.domain.member.entity.Member; +import com.example.umc_9th.domain.mission.entity.Mission; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.ColumnDefault; diff --git a/src/main/java/com/example/umc_9th/domain/mission/repository/RegionMissionRepository.java b/src/main/java/com/example/umc_9th/domain/mission/repository/RegionMissionRepository.java new file mode 100644 index 0000000..06b84bb --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/mission/repository/RegionMissionRepository.java @@ -0,0 +1,33 @@ +package com.example.umc_9th.domain.mission.repository; + +import com.example.umc_9th.domain.mission.entity.Mission; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface RegionMissionRepository extends JpaRepository { + + + //4. 홈 화면 쿼리 + //(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함) + + + //1. 미션 테이블 통해서 가게 테이블 -> 지역 테이블 -> 세부지역 테이블 미션이 해당 + + // WHERE r.id = :regionId 는 자리표시자로 값 비교 + @Query(value = """ + SELECT m FROM Mission m + JOIN FETCH m.store s + JOIN FETCH s.region r + JOIN FETCH r.subRegion sr + WHERE r.id = :regionId + """, + countQuery = "SELECT count(m) FROM Mission m JOIN m.store s WHERE s.region.id = :regionId") + Page findMissionsByRegion( + @Param("regionId") Long regionId, + Pageable pageable + ); + +} diff --git a/src/main/java/com/example/umc_9th/domain/mission/repository/UserMissionRepository.java b/src/main/java/com/example/umc_9th/domain/mission/repository/UserMissionRepository.java new file mode 100644 index 0000000..576a720 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/mission/repository/UserMissionRepository.java @@ -0,0 +1,25 @@ +package com.example.umc_9th.domain.mission.repository; + +import com.example.umc_9th.domain.mission.mapping.UserMission; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface UserMissionRepository extends JpaRepository { + + + //3.내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함) + + // join fetch : um과 연관된 mission 엔티티 정보까지 가져옴 (N+1) 문제 해결합니다 + @Query(value="SELECT um from UserMission um join fetch um.mission m"+ + // um의 멤버필드에 있는 id가 memgerId이름의 필드를 가져옴 + " where um.member.memberId=:memberId", + // 페이징 처리를 위해 전체 데이터가 몇 개인지 계산하는 쿼리 지정합니다 + countQuery = " SELECT count(um) FROM UserMission um WHERE um.member.memberId = :memberId") + PagefindMyMission(@Param("memberId") Long memberId, Pageable pageable); + + + +} \ No newline at end of file diff --git a/src/main/java/com/example/umc_9th/domain/region/Region.java b/src/main/java/com/example/umc_9th/domain/region/entity/Region.java similarity index 85% rename from src/main/java/com/example/umc_9th/domain/region/Region.java rename to src/main/java/com/example/umc_9th/domain/region/entity/Region.java index 8ec6992..b8e2305 100644 --- a/src/main/java/com/example/umc_9th/domain/region/Region.java +++ b/src/main/java/com/example/umc_9th/domain/region/entity/Region.java @@ -1,7 +1,6 @@ -package com.example.umc_9th.domain.region; +package com.example.umc_9th.domain.region.entity; -import com.example.umc_9th.domain.member.Agree; -import com.example.umc_9th.domain.member.Member; +import com.example.umc_9th.domain.member.entity.Member; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/umc_9th/domain/region/SubRegion.java b/src/main/java/com/example/umc_9th/domain/region/entity/SubRegion.java similarity index 91% rename from src/main/java/com/example/umc_9th/domain/region/SubRegion.java rename to src/main/java/com/example/umc_9th/domain/region/entity/SubRegion.java index 7f000e5..1830d5f 100644 --- a/src/main/java/com/example/umc_9th/domain/region/SubRegion.java +++ b/src/main/java/com/example/umc_9th/domain/region/entity/SubRegion.java @@ -1,4 +1,4 @@ -package com.example.umc_9th.domain.region; +package com.example.umc_9th.domain.region.entity; import com.example.umc_9th.grobal.BaseEntity; diff --git a/src/main/java/com/example/umc_9th/domain/review/OwnerComment.java b/src/main/java/com/example/umc_9th/domain/review/entity/OwnerComment.java similarity index 83% rename from src/main/java/com/example/umc_9th/domain/review/OwnerComment.java rename to src/main/java/com/example/umc_9th/domain/review/entity/OwnerComment.java index 6e6276a..d24fef7 100644 --- a/src/main/java/com/example/umc_9th/domain/review/OwnerComment.java +++ b/src/main/java/com/example/umc_9th/domain/review/entity/OwnerComment.java @@ -1,7 +1,6 @@ -package com.example.umc_9th.domain.review; +package com.example.umc_9th.domain.review.entity; -import com.example.umc_9th.domain.member.Member; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/umc_9th/domain/review/Review.java b/src/main/java/com/example/umc_9th/domain/review/entity/Review.java similarity index 85% rename from src/main/java/com/example/umc_9th/domain/review/Review.java rename to src/main/java/com/example/umc_9th/domain/review/entity/Review.java index 72cded3..7033454 100644 --- a/src/main/java/com/example/umc_9th/domain/review/Review.java +++ b/src/main/java/com/example/umc_9th/domain/review/entity/Review.java @@ -1,14 +1,11 @@ -package com.example.umc_9th.domain.review; +package com.example.umc_9th.domain.review.entity; -import com.example.umc_9th.domain.member.Member; -import com.example.umc_9th.domain.mission.Mission; +import com.example.umc_9th.domain.member.entity.Member; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; -import java.util.List; - @Entity @Getter @Builder diff --git a/src/main/java/com/example/umc_9th/domain/review/ReviewImage.java b/src/main/java/com/example/umc_9th/domain/review/entity/ReviewImage.java similarity index 90% rename from src/main/java/com/example/umc_9th/domain/review/ReviewImage.java rename to src/main/java/com/example/umc_9th/domain/review/entity/ReviewImage.java index 1433be5..55a3e49 100644 --- a/src/main/java/com/example/umc_9th/domain/review/ReviewImage.java +++ b/src/main/java/com/example/umc_9th/domain/review/entity/ReviewImage.java @@ -1,4 +1,4 @@ -package com.example.umc_9th.domain.review; +package com.example.umc_9th.domain.review.entity; import jakarta.persistence.*; diff --git a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java new file mode 100644 index 0000000..5b7625d --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java @@ -0,0 +1,39 @@ +package com.example.umc_9th.domain.review.repository; + +import com.example.umc_9th.domain.member.entity.Member; +import com.example.umc_9th.domain.review.entity.Review; +import com.example.umc_9th.domain.store.Store; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ReviewRepository extends JpaRepository { + + + + //1리뷰 작성하는 쿼리, + //* 사진의 경우는 일단 배제 + //(메서드 생성 방식 권장) + // id로 리뷰 조횔 할 떄 member도 같이 조회 + // 리뷰 조회할 떄 member 엔티티도 같이 가져오게 하는 에노테이션 = @EntityGraph + @EntityGraph(attributePaths = {"member"}) + Optional findById(Integer id); + // Member와 Store를 기준으로 Review 조회 + boolean existsByMemberAndStore(Member member, Store store); + + + + //2 id 로 멤버 테이블 조회 + //마이 페이지 화면 쿼리 + //(메서드 생성 방식 권장) + OptionalfindById(Long id); + + + + + + + + +} diff --git a/src/main/java/com/example/umc_9th/domain/store/Store.java b/src/main/java/com/example/umc_9th/domain/store/Store.java index dacfcec..d3634b2 100644 --- a/src/main/java/com/example/umc_9th/domain/store/Store.java +++ b/src/main/java/com/example/umc_9th/domain/store/Store.java @@ -1,15 +1,11 @@ package com.example.umc_9th.domain.store; -import com.example.umc_9th.domain.mission.Mission; -import com.example.umc_9th.domain.region.Region; -import com.example.umc_9th.domain.review.ReviewImage; +import com.example.umc_9th.domain.region.entity.Region; import com.example.umc_9th.domain.store.mapping.FoodCategory; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; -import java.util.List; - @Entity @Getter @Builder @@ -40,4 +36,7 @@ public class Store extends BaseEntity { private Region region; + + + } diff --git a/src/main/java/com/example/umc_9th/domain/store/mapping/MemberFoodCategory.java b/src/main/java/com/example/umc_9th/domain/store/mapping/MemberFoodCategory.java index d70d43a..56c9cd8 100644 --- a/src/main/java/com/example/umc_9th/domain/store/mapping/MemberFoodCategory.java +++ b/src/main/java/com/example/umc_9th/domain/store/mapping/MemberFoodCategory.java @@ -1,7 +1,7 @@ package com.example.umc_9th.domain.store.mapping; -import com.example.umc_9th.domain.member.Member; +import com.example.umc_9th.domain.member.entity.Member; import jakarta.persistence.*; import lombok.*; From dd2d4049c2bfe9ca4b38342d316b59ba5ee1b421 Mon Sep 17 00:00:00 2001 From: minmin02 Date: Sun, 12 Oct 2025 21:58:25 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20ReviewRepository=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/repository/MemberRepository.java | 16 ++++++++++++++++ .../umc_9th/domain/review/entity/Review.java | 5 ++++- .../review/repository/ReviewRepository.java | 11 ++++------- src/main/resources/application.yml | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java diff --git a/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java b/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java new file mode 100644 index 0000000..5dfe865 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java @@ -0,0 +1,16 @@ +package com.example.umc_9th.domain.member.repository; + +import com.example.umc_9th.domain.member.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface MemberRepository extends JpaRepository { + + + //2 id 로 멤버 테이블 조회 + //마이 페이지 화면 쿼리 + //(메서드 생성 방식 권장) + Optional findById(Long id); + +} \ No newline at end of file diff --git a/src/main/java/com/example/umc_9th/domain/review/entity/Review.java b/src/main/java/com/example/umc_9th/domain/review/entity/Review.java index 7033454..d001c19 100644 --- a/src/main/java/com/example/umc_9th/domain/review/entity/Review.java +++ b/src/main/java/com/example/umc_9th/domain/review/entity/Review.java @@ -2,6 +2,7 @@ import com.example.umc_9th.domain.member.entity.Member; +import com.example.umc_9th.domain.store.Store; import com.example.umc_9th.grobal.BaseEntity; import jakarta.persistence.*; import lombok.*; @@ -30,7 +31,9 @@ public class Review extends BaseEntity { private Member member; - + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "shop_id") + private Store store; //양방향 고려 diff --git a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java index 5b7625d..cef94eb 100644 --- a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java @@ -8,26 +8,23 @@ import java.util.Optional; -public interface ReviewRepository extends JpaRepository { +public interface ReviewRepository extends JpaRepository { - //1리뷰 작성하는 쿼리, + //2. 리뷰 작성하는 쿼리, //* 사진의 경우는 일단 배제 //(메서드 생성 방식 권장) // id로 리뷰 조횔 할 떄 member도 같이 조회 // 리뷰 조회할 떄 member 엔티티도 같이 가져오게 하는 에노테이션 = @EntityGraph @EntityGraph(attributePaths = {"member"}) - Optional findById(Integer id); + Optional findById(Long id); // Member와 Store를 기준으로 Review 조회 boolean existsByMemberAndStore(Member member, Store store); - //2 id 로 멤버 테이블 조회 - //마이 페이지 화면 쿼리 - //(메서드 생성 방식 권장) - OptionalfindById(Long id); + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 98447bd..920c008 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ spring: database-platform: org.hibernate.dialect.MySQLDialect # show-sql: true # hibernate: - ddl-auto: create # + ddl-auto: create-drop # properties: hibernate: format_sql: true # \ No newline at end of file From 2559219f31c7df9a545f9339a17272d46d16a9ca Mon Sep 17 00:00:00 2001 From: minmin02 Date: Fri, 24 Oct 2025 15:36:40 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat=20:=206=EC=A3=BC=EC=B0=A8=20=C3=AA?= =?UTF-8?q?=EB=AF=B8=EC=85=98=20:=20=EB=82=B4=EA=B0=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=ED=95=9C=20=EB=A6=AC=EB=B7=B0=20=EB=B3=B4=EA=B8=B0A?= =?UTF-8?q?=20PI=20=EA=B5=AC=C3=AD=C2=98=20QueryDSL=20=C3=AD=C2=99?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=20=C2=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 28 ++++++++++ .../member/repository/MemberRepository.java | 2 + .../review/controller/ReviewController.java | 31 +++++++++++ .../review/repository/ReviewQueryDsl.java | 15 ++++++ .../review/repository/ReviewQueryDslImpl.java | 53 +++++++++++++++++++ .../review/repository/ReviewRepository.java | 3 +- .../review/service/ReviewQueryService.java | 22 ++++++++ .../umc_9th/grobal/QuerydslConfig.java | 20 +++++++ 8 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/umc_9th/domain/review/controller/ReviewController.java create mode 100644 src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDsl.java create mode 100644 src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDslImpl.java create mode 100644 src/main/java/com/example/umc_9th/domain/review/service/ReviewQueryService.java create mode 100644 src/main/java/com/example/umc_9th/grobal/QuerydslConfig.java diff --git a/build.gradle b/build.gradle index 7617478..2022ce8 100644 --- a/build.gradle +++ b/build.gradle @@ -35,8 +35,36 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + // QueryDSL : OpenFeign + implementation "io.github.openfeign.querydsl:querydsl-jpa:7.0" + implementation "io.github.openfeign.querydsl:querydsl-core:7.0" + annotationProcessor "io.github.openfeign.querydsl:querydsl-apt:7.0:jpa" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + + } tasks.named('test') { useJUnitPlatform() } + +// QueryDSL 관련 설정 +// generated/querydsl 폴더 생성 & 삽입 +def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile + +// 소스 세트에 생성 경로 추가 (구체적인 경로 지정) +sourceSets { + main.java.srcDirs += [ querydslDir ] +} + +// 컴파일 시 생성 경로 지정 +tasks.withType(JavaCompile).configureEach { + options.generatedSourceOutputDirectory.set(querydslDir) +} + +// clean 태스크에 생성 폴더 삭제 로직 추가 +clean.doLast { + file(querydslDir).deleteDir() +} \ No newline at end of file diff --git a/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java b/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java index 5dfe865..3695f88 100644 --- a/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java +++ b/src/main/java/com/example/umc_9th/domain/member/repository/MemberRepository.java @@ -13,4 +13,6 @@ public interface MemberRepository extends JpaRepository { //(메서드 생성 방식 권장) Optional findById(Long id); + + } \ No newline at end of file diff --git a/src/main/java/com/example/umc_9th/domain/review/controller/ReviewController.java b/src/main/java/com/example/umc_9th/domain/review/controller/ReviewController.java new file mode 100644 index 0000000..47b5a96 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/review/controller/ReviewController.java @@ -0,0 +1,31 @@ +package com.example.umc_9th.domain.review.controller; + +import com.example.umc_9th.domain.review.entity.Review; +import com.example.umc_9th.domain.review.service.ReviewQueryService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class ReviewController { + + private final ReviewQueryService reviewQueryService; + + @GetMapping("/members/{memberId}/reviews/search") + public List searchMyReview( + // 경로에서 memberId를 받음 + @PathVariable Long memberId, + + @RequestParam(required = false) Long storeId, + @RequestParam(required = false) Integer rating + ) { + // 서비스로 memberId를 포함하여 전달 + return reviewQueryService.searchMyReviews(memberId, storeId, rating); + } + +} diff --git a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDsl.java b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDsl.java new file mode 100644 index 0000000..530af91 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDsl.java @@ -0,0 +1,15 @@ +package com.example.umc_9th.domain.review.repository; + +import com.example.umc_9th.domain.review.entity.Review; +import com.querydsl.core.types.Predicate; + +import java.util.List; + +public interface ReviewQueryDsl { + + //api 내 리뷰 보기 + ListfindMyReviews(Long memberId, Long storeId,Integer rating ); + + + +} diff --git a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDslImpl.java b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDslImpl.java new file mode 100644 index 0000000..85958b3 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewQueryDslImpl.java @@ -0,0 +1,53 @@ +package com.example.umc_9th.domain.review.repository; + +import com.example.umc_9th.domain.review.entity.QReview; +import com.example.umc_9th.domain.review.entity.Review; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class ReviewQueryDslImpl implements ReviewQueryDsl { + + + // global에서 수동으로 Bean 등록 + private final JPAQueryFactory queryFactory; + // Q 클래스 만들기 + private final QReview review= QReview.review; + + + @Override + public List findMyReviews(Long memberId, Long storeId, Integer rating ) { + + return queryFactory + .selectFrom(review) + // Member 와 review 패치 조인 + .join(review.member).fetchJoin() + .join(review.store).fetchJoin() + .where( + // 내가 쓴 리뷰 찾기 + review.member.memberId.eq(memberId), + // 가게별 필터 + //.store.id.eq(storeId), + storeIdEq(storeId), + // 별점별 필터 + ratingEq(rating) +// review.rating.eq(rating) + ) + .fetch(); + } + + // 가게 id 있는지 확인 (리팩토링 메서드) + private BooleanExpression storeIdEq(Long storeId) { + return storeId != null ? review.store.id.eq(storeId) : null; + } + private BooleanExpression ratingEq(Integer rating) { + return rating != null ? review.rating.eq(rating) : null; + } + + +} diff --git a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java index cef94eb..48a5718 100644 --- a/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/example/umc_9th/domain/review/repository/ReviewRepository.java @@ -8,8 +8,7 @@ import java.util.Optional; -public interface ReviewRepository extends JpaRepository { - +public interface ReviewRepository extends JpaRepository,ReviewQueryDsl { //2. 리뷰 작성하는 쿼리, diff --git a/src/main/java/com/example/umc_9th/domain/review/service/ReviewQueryService.java b/src/main/java/com/example/umc_9th/domain/review/service/ReviewQueryService.java new file mode 100644 index 0000000..8896982 --- /dev/null +++ b/src/main/java/com/example/umc_9th/domain/review/service/ReviewQueryService.java @@ -0,0 +1,22 @@ +package com.example.umc_9th.domain.review.service; + +import com.example.umc_9th.domain.review.entity.Review; +import com.example.umc_9th.domain.review.repository.ReviewRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional +public class ReviewQueryService { + + private final ReviewRepository reviewRepository; + + public List searchMyReviews(Long memberId, Long storeId, Integer rating) { + return reviewRepository.findMyReviews(memberId, storeId, rating); + } + +} diff --git a/src/main/java/com/example/umc_9th/grobal/QuerydslConfig.java b/src/main/java/com/example/umc_9th/grobal/QuerydslConfig.java new file mode 100644 index 0000000..20e7dbd --- /dev/null +++ b/src/main/java/com/example/umc_9th/grobal/QuerydslConfig.java @@ -0,0 +1,20 @@ +package com.example.umc_9th.grobal; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + + //JPAQueryFactory 생성될 때 Spring Bean 으로 등록 + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { + return new JPAQueryFactory(entityManager); + } + + + + +}