Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Original file line number Diff line number Diff line change
@@ -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.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -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.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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; //이름
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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<Member, Long> {


//2 id 로 멤버 테이블 조회
//마이 페이지 화면 쿼리
//(메서드 생성 방식 권장)
Optional<Member> findById(Long id);



}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -41,6 +38,10 @@ public class Mission extends BaseEntity {
// private List<UserMission> 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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Mission,Long> {


//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<Mission> findMissionsByRegion(
@Param("regionId") Long regionId,
Pageable pageable
);

}
Original file line number Diff line number Diff line change
@@ -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<UserMission, Long> {


//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")
Page<UserMission>findMyMission(@Param("memberId") Long memberId, Pageable pageable);



}
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Review> searchMyReview(
// 경로에서 memberId를 받음
@PathVariable Long memberId,

@RequestParam(required = false) Long storeId,
@RequestParam(required = false) Integer rating
) {
// 서비스로 memberId를 포함하여 전달
return reviewQueryService.searchMyReviews(memberId, storeId, rating);
}

}
Original file line number Diff line number Diff line change
@@ -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.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
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.domain.store.Store;
import com.example.umc_9th.grobal.BaseEntity;
import jakarta.persistence.*;
import lombok.*;

import java.util.List;

@Entity
@Getter
@Builder
Expand All @@ -33,7 +31,9 @@ public class Review extends BaseEntity {
private Member member;



@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "shop_id")
private Store store;


//양방향 고려
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.umc_9th.domain.review;
package com.example.umc_9th.domain.review.entity;


import jakarta.persistence.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -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 내 리뷰 보기
List<Review>findMyReviews(Long memberId, Long storeId,Integer rating );



}
Original file line number Diff line number Diff line change
@@ -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<Review> 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;
}


}
Loading