Skip to content

Commit e53caa9

Browse files
authored
Merge pull request #6 from UMC-9th-Spring-Boot/Feat/Chapter6
Feat : [Query DSL 추가 학습 ] 6주차 미션
2 parents bc10601 + 2559219 commit e53caa9

File tree

24 files changed

+314
-43
lines changed

24 files changed

+314
-43
lines changed

build.gradle

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,36 @@ dependencies {
3535
annotationProcessor 'org.projectlombok:lombok'
3636
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3737
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
38+
39+
// QueryDSL : OpenFeign
40+
implementation "io.github.openfeign.querydsl:querydsl-jpa:7.0"
41+
implementation "io.github.openfeign.querydsl:querydsl-core:7.0"
42+
annotationProcessor "io.github.openfeign.querydsl:querydsl-apt:7.0:jpa"
43+
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
44+
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
45+
46+
3847
}
3948

4049
tasks.named('test') {
4150
useJUnitPlatform()
4251
}
52+
53+
// QueryDSL 관련 설정
54+
// generated/querydsl 폴더 생성 & 삽입
55+
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile
56+
57+
// 소스 세트에 생성 경로 추가 (구체적인 경로 지정)
58+
sourceSets {
59+
main.java.srcDirs += [ querydslDir ]
60+
}
61+
62+
// 컴파일 시 생성 경로 지정
63+
tasks.withType(JavaCompile).configureEach {
64+
options.generatedSourceOutputDirectory.set(querydslDir)
65+
}
66+
67+
// clean 태스크에 생성 폴더 삭제 로직 추가
68+
clean.doLast {
69+
file(querydslDir).deleteDir()
70+
}

src/main/java/com/example/umc_9th/domain/inquiry/Inquries.java renamed to src/main/java/com/example/umc_9th/domain/inquiry/entity/Inquries.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package com.example.umc_9th.domain.inquiry;
1+
package com.example.umc_9th.domain.inquiry.entity;
22

33

4-
import com.example.umc_9th.domain.member.Gender;
5-
import com.example.umc_9th.domain.member.Member;
6-
import com.example.umc_9th.domain.review.Review;
4+
import com.example.umc_9th.domain.inquiry.InquriesType;
5+
import com.example.umc_9th.domain.member.entity.Member;
76
import jakarta.persistence.*;
87
import lombok.*;
98

src/main/java/com/example/umc_9th/domain/inquiry/inquiryAttachments.java renamed to src/main/java/com/example/umc_9th/domain/inquiry/entity/inquiryAttachments.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package com.example.umc_9th.domain.inquiry;
1+
package com.example.umc_9th.domain.inquiry.entity;
22

33

4-
import com.example.umc_9th.domain.member.Member;
54
import jakarta.persistence.*;
65
import lombok.*;
76

src/main/java/com/example/umc_9th/domain/member/Agree.java renamed to src/main/java/com/example/umc_9th/domain/member/entity/Agree.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.example.umc_9th.domain.member;
1+
package com.example.umc_9th.domain.member.entity;
22

33
import com.example.umc_9th.grobal.BaseEntity;
44
import jakarta.persistence.*;

src/main/java/com/example/umc_9th/domain/member/Member.java renamed to src/main/java/com/example/umc_9th/domain/member/entity/Member.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
package com.example.umc_9th.domain.member;
1+
package com.example.umc_9th.domain.member.entity;
22

3-
import com.example.umc_9th.domain.mission.mapping.UserMission;
4-
import com.example.umc_9th.domain.region.Region;
5-
import com.example.umc_9th.domain.region.SubRegion;
6-
import com.example.umc_9th.domain.review.Review;
3+
import com.example.umc_9th.domain.member.Gender;
74
import com.example.umc_9th.grobal.BaseEntity;
85
import jakarta.persistence.*;
96
import lombok.*;
10-
import org.hibernate.annotations.ColumnDefault;
117

128

139
import java.time.LocalDate;
14-
import java.util.List;
1510

1611
@Entity
1712
@Getter
@@ -22,7 +17,7 @@ public class Member extends BaseEntity {
2217

2318
@Id
2419
@GeneratedValue(strategy = GenerationType.IDENTITY)
25-
private Long id; //pk
20+
private Long memberId; //pk
2621

2722
@Column(nullable = false, length = 50)
2823
private String name; //이름
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.example.umc_9th.domain.member.repository;
2+
3+
import com.example.umc_9th.domain.member.entity.Member;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface MemberRepository extends JpaRepository<Member, Long> {
9+
10+
11+
//2 id 로 멤버 테이블 조회
12+
//마이 페이지 화면 쿼리
13+
//(메서드 생성 방식 권장)
14+
Optional<Member> findById(Long id);
15+
16+
17+
18+
}

src/main/java/com/example/umc_9th/domain/mission/Mission.java renamed to src/main/java/com/example/umc_9th/domain/mission/entity/Mission.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
package com.example.umc_9th.domain.mission;
1+
package com.example.umc_9th.domain.mission.entity;
22

3-
import com.example.umc_9th.domain.mission.mapping.UserMission;
4-
import com.example.umc_9th.domain.review.Review;
3+
import com.example.umc_9th.domain.review.entity.Review;
4+
import com.example.umc_9th.domain.store.Store;
55
import com.example.umc_9th.grobal.BaseEntity;
66
import jakarta.persistence.*;
77
import lombok.*;
8-
import org.hibernate.annotations.ColumnDefault;
9-
10-
import java.util.List;
118

129

1310
@Entity
@@ -41,6 +38,10 @@ public class Mission extends BaseEntity {
4138
// private List<UserMission> userMissions ;
4239

4340

41+
@ManyToOne(fetch = FetchType.LAZY)
42+
@JoinColumn(name = "store_id")
43+
private Store store;
44+
4445
@ManyToOne(fetch = FetchType.LAZY) // 리뷸 테이블 N:1 관계 매핑
4546
@JoinColumn(name = "review_id")
4647
private Review review;

src/main/java/com/example/umc_9th/domain/mission/mapping/UserMission.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.example.umc_9th.domain.mission.mapping;
22

33

4-
import com.example.umc_9th.domain.member.Member;
5-
import com.example.umc_9th.domain.mission.Mission;
4+
import com.example.umc_9th.domain.member.entity.Member;
5+
import com.example.umc_9th.domain.mission.entity.Mission;
66
import jakarta.persistence.*;
77
import lombok.*;
88
import org.hibernate.annotations.ColumnDefault;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.example.umc_9th.domain.mission.repository;
2+
3+
import com.example.umc_9th.domain.mission.entity.Mission;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
9+
10+
public interface RegionMissionRepository extends JpaRepository<Mission,Long> {
11+
12+
13+
//4. 홈 화면 쿼리
14+
//(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)
15+
16+
17+
//1. 미션 테이블 통해서 가게 테이블 -> 지역 테이블 -> 세부지역 테이블 미션이 해당
18+
19+
// WHERE r.id = :regionId 는 자리표시자로 값 비교
20+
@Query(value = """
21+
SELECT m FROM Mission m
22+
JOIN FETCH m.store s
23+
JOIN FETCH s.region r
24+
JOIN FETCH r.subRegion sr
25+
WHERE r.id = :regionId
26+
""",
27+
countQuery = "SELECT count(m) FROM Mission m JOIN m.store s WHERE s.region.id = :regionId")
28+
Page<Mission> findMissionsByRegion(
29+
@Param("regionId") Long regionId,
30+
Pageable pageable
31+
);
32+
33+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.example.umc_9th.domain.mission.repository;
2+
3+
import com.example.umc_9th.domain.mission.mapping.UserMission;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.Pageable;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
9+
10+
public interface UserMissionRepository extends JpaRepository<UserMission, Long> {
11+
12+
13+
//3.내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함)
14+
15+
// join fetch : um과 연관된 mission 엔티티 정보까지 가져옴 (N+1) 문제 해결합니다
16+
@Query(value="SELECT um from UserMission um join fetch um.mission m"+
17+
// um의 멤버필드에 있는 id가 memgerId이름의 필드를 가져옴
18+
" where um.member.memberId=:memberId",
19+
// 페이징 처리를 위해 전체 데이터가 몇 개인지 계산하는 쿼리 지정합니다
20+
countQuery = " SELECT count(um) FROM UserMission um WHERE um.member.memberId = :memberId")
21+
Page<UserMission>findMyMission(@Param("memberId") Long memberId, Pageable pageable);
22+
23+
24+
25+
}

0 commit comments

Comments
 (0)