From da62e083825e8f04090c0071b239060e885be32b Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 16:34:45 +0900 Subject: [PATCH 01/13] :heavy_plus_sign:practice(#6) : add dependencies & edit build.gradle --- spring/build.gradle | 50 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/spring/build.gradle b/spring/build.gradle index c261f24..b208b9e 100644 --- a/spring/build.gradle +++ b/spring/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' + id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'umc' @@ -26,12 +27,59 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' + implementation 'org.hibernate.orm:hibernate-core:6.0.2.Final' + + implementation 'mysql:mysql-connector-java:8.0.33' runtimeOnly 'com.mysql:mysql-connector-j' + + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + + implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3' + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.3' + implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3' + + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + + implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' + implementation 'org.springdoc:springdoc-openapi-data-rest:1.6.9' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } +sourceSets { + main { + java { + srcDirs = ['src/main/java', 'src/main/resources'] + } + } +} + tasks.named('test') { useJUnitPlatform() } + +// Querydsl 설정부 +def generated = 'src/main/generated' + +querydsl { + jpa = true + querydslSourcesDir = generated +} +sourceSets { + main.java.srcDir generated +} + +compileQuerydsl{ + options.annotationProcessorPath = configurations.querydsl +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } + querydsl.extendsFrom compileClasspath +} From 360710e976f0c24e6c2cd8f39a21cd985c81fd1e Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 20:00:34 +0900 Subject: [PATCH 02/13] :sparkles:practice(#6) : write QueryDSL query --- .../generated/umc/spring/domain/QFood.java | 52 +++++++++++++ .../generated/umc/spring/domain/QMember.java | 74 +++++++++++++++++++ .../generated/umc/spring/domain/QMission.java | 67 +++++++++++++++++ .../generated/umc/spring/domain/QRegion.java | 50 +++++++++++++ .../generated/umc/spring/domain/QReview.java | 66 +++++++++++++++++ .../generated/umc/spring/domain/QStore.java | 71 ++++++++++++++++++ .../generated/umc/spring/domain/QTerm.java | 54 ++++++++++++++ .../umc/spring/domain/common/QBaseEntity.java | 39 ++++++++++ .../domain/mapping/QMemberAgreeTerm.java | 54 ++++++++++++++ .../spring/domain/mapping/QMemberMission.java | 56 ++++++++++++++ .../domain/mapping/QMemberPreferFood.java | 54 ++++++++++++++ .../src/main/java/umc/spring/Application.java | 22 ++++++ .../umc/spring/config/QueryDSLConfig.java | 18 +++++ .../main/java/umc/spring/domain/Store.java | 20 +++++ .../StoreRepository/StoreRepository.java | 7 ++ .../StoreRepositoryCustom.java | 9 +++ .../StoreRepository/StoreRepositoryImpl.java | 35 +++++++++ .../StoreService/StoreQueryService.java | 12 +++ .../StoreService/StoreQueryServiceImpl.java | 32 ++++++++ spring/src/main/resources/application.yml | 2 +- 20 files changed, 793 insertions(+), 1 deletion(-) create mode 100644 spring/src/main/generated/umc/spring/domain/QFood.java create mode 100644 spring/src/main/generated/umc/spring/domain/QMember.java create mode 100644 spring/src/main/generated/umc/spring/domain/QMission.java create mode 100644 spring/src/main/generated/umc/spring/domain/QRegion.java create mode 100644 spring/src/main/generated/umc/spring/domain/QReview.java create mode 100644 spring/src/main/generated/umc/spring/domain/QStore.java create mode 100644 spring/src/main/generated/umc/spring/domain/QTerm.java create mode 100644 spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java create mode 100644 spring/src/main/java/umc/spring/config/QueryDSLConfig.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java diff --git a/spring/src/main/generated/umc/spring/domain/QFood.java b/spring/src/main/generated/umc/spring/domain/QFood.java new file mode 100644 index 0000000..4d4d34c --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QFood.java @@ -0,0 +1,52 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFood is a Querydsl query type for Food + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFood extends EntityPathBase { + + private static final long serialVersionUID = -1348495606L; + + public static final QFood food = new QFood("food"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath foodCategory = createEnum("foodCategory", umc.spring.domain.enums.FoodCategory.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberPreferFoodList = this.createList("memberPreferFoodList", umc.spring.domain.mapping.MemberPreferFood.class, umc.spring.domain.mapping.QMemberPreferFood.class, PathInits.DIRECT2); + + public final BooleanPath preferOptional = createBoolean("preferOptional"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QFood(String variable) { + super(Food.class, forVariable(variable)); + } + + public QFood(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QFood(PathMetadata metadata) { + super(Food.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QMember.java b/spring/src/main/generated/umc/spring/domain/QMember.java new file mode 100644 index 0000000..559de0d --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QMember.java @@ -0,0 +1,74 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMember is a Querydsl query type for Member + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMember extends EntityPathBase { + + private static final long serialVersionUID = 1366956614L; + + public static final QMember member = new QMember("member1"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath address = createString("address"); + + public final DatePath birthdate = createDate("birthdate", java.time.LocalDate.class); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final EnumPath gender = createEnum("gender", umc.spring.domain.enums.Gender.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final DatePath inactiveDate = createDate("inactiveDate", java.time.LocalDate.class); + + public final ListPath memberAgreeTermList = this.createList("memberAgreeTermList", umc.spring.domain.mapping.MemberAgreeTerm.class, umc.spring.domain.mapping.QMemberAgreeTerm.class, PathInits.DIRECT2); + + public final ListPath memberMissionList = this.createList("memberMissionList", umc.spring.domain.mapping.MemberMission.class, umc.spring.domain.mapping.QMemberMission.class, PathInits.DIRECT2); + + public final ListPath memberPreferFoodList = this.createList("memberPreferFoodList", umc.spring.domain.mapping.MemberPreferFood.class, umc.spring.domain.mapping.QMemberPreferFood.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + public final NumberPath point = createNumber("point", Integer.class); + + public final ListPath reviewList = this.createList("reviewList", Review.class, QReview.class, PathInits.DIRECT2); + + public final EnumPath socialtype = createEnum("socialtype", umc.spring.domain.enums.SocialType.class); + + public final StringPath specAddress = createString("specAddress"); + + public final EnumPath status = createEnum("status", umc.spring.domain.enums.MemberStatus.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMember(String variable) { + super(Member.class, forVariable(variable)); + } + + public QMember(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMember(PathMetadata metadata) { + super(Member.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QMission.java b/spring/src/main/generated/umc/spring/domain/QMission.java new file mode 100644 index 0000000..39a4add --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QMission.java @@ -0,0 +1,67 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMission is a Querydsl query type for Mission + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMission extends EntityPathBase { + + private static final long serialVersionUID = -453449888L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMission mission = new QMission("mission"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DatePath dueDate = createDate("dueDate", java.time.LocalDate.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberMissionList = this.createList("memberMissionList", umc.spring.domain.mapping.MemberMission.class, umc.spring.domain.mapping.QMemberMission.class, PathInits.DIRECT2); + + public final StringPath missionSpec = createString("missionSpec"); + + public final NumberPath reward = createNumber("reward", Integer.class); + + public final QStore store; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMission(String variable) { + this(Mission.class, forVariable(variable), INITS); + } + + public QMission(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMission(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMission(PathMetadata metadata, PathInits inits) { + this(Mission.class, metadata, inits); + } + + public QMission(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.store = inits.isInitialized("store") ? new QStore(forProperty("store"), inits.get("store")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QRegion.java b/spring/src/main/generated/umc/spring/domain/QRegion.java new file mode 100644 index 0000000..552717e --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QRegion.java @@ -0,0 +1,50 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QRegion is a Querydsl query type for Region + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QRegion extends EntityPathBase { + + private static final long serialVersionUID = 1509930656L; + + public static final QRegion region = new QRegion("region"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final ListPath StoreList = this.createList("StoreList", Store.class, QStore.class, PathInits.DIRECT2); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QRegion(String variable) { + super(Region.class, forVariable(variable)); + } + + public QRegion(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QRegion(PathMetadata metadata) { + super(Region.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QReview.java b/spring/src/main/generated/umc/spring/domain/QReview.java new file mode 100644 index 0000000..190cc63 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QReview.java @@ -0,0 +1,66 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QReview is a Querydsl query type for Review + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReview extends EntityPathBase { + + private static final long serialVersionUID = 1510377220L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QReview review = new QReview("review"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final QMember member; + + public final NumberPath rating = createNumber("rating", Float.class); + + public final QStore store; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QReview(String variable) { + this(Review.class, forVariable(variable), INITS); + } + + public QReview(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QReview(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReview(PathMetadata metadata, PathInits inits) { + this(Review.class, metadata, inits); + } + + public QReview(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new QMember(forProperty("member")) : null; + this.store = inits.isInitialized("store") ? new QStore(forProperty("store"), inits.get("store")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QStore.java b/spring/src/main/generated/umc/spring/domain/QStore.java new file mode 100644 index 0000000..3330178 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QStore.java @@ -0,0 +1,71 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QStore is a Querydsl query type for Store + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QStore extends EntityPathBase { + + private static final long serialVersionUID = 1158464437L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QStore store = new QStore("store"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath address = createString("address"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath foodCategory = createEnum("foodCategory", umc.spring.domain.enums.FoodCategory.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath missionList = this.createList("missionList", Mission.class, QMission.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + public final QRegion region; + + public final ListPath reviewList = this.createList("reviewList", Review.class, QReview.class, PathInits.DIRECT2); + + public final NumberPath score = createNumber("score", Float.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QStore(String variable) { + this(Store.class, forVariable(variable), INITS); + } + + public QStore(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QStore(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QStore(PathMetadata metadata, PathInits inits) { + this(Store.class, metadata, inits); + } + + public QStore(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.region = inits.isInitialized("region") ? new QRegion(forProperty("region")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QTerm.java b/spring/src/main/generated/umc/spring/domain/QTerm.java new file mode 100644 index 0000000..b1fcea2 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QTerm.java @@ -0,0 +1,54 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QTerm is a Querydsl query type for Term + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QTerm extends EntityPathBase { + + private static final long serialVersionUID = -1348088040L; + + public static final QTerm term = new QTerm("term"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final BooleanPath agreeOptional = createBoolean("agreeOptional"); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberTermList = this.createList("memberTermList", umc.spring.domain.mapping.MemberAgreeTerm.class, umc.spring.domain.mapping.QMemberAgreeTerm.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QTerm(String variable) { + super(Term.class, forVariable(variable)); + } + + public QTerm(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QTerm(PathMetadata metadata) { + super(Term.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java b/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java new file mode 100644 index 0000000..0bafae2 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java @@ -0,0 +1,39 @@ +package umc.spring.domain.common; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -1748720885L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java new file mode 100644 index 0000000..cff278c --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java @@ -0,0 +1,54 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberAgreeTerm is a Querydsl query type for MemberAgreeTerm + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberAgreeTerm extends EntityPathBase { + + private static final long serialVersionUID = 471568498L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberAgreeTerm memberAgreeTerm = new QMemberAgreeTerm("memberAgreeTerm"); + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public final umc.spring.domain.QTerm term; + + public QMemberAgreeTerm(String variable) { + this(MemberAgreeTerm.class, forVariable(variable), INITS); + } + + public QMemberAgreeTerm(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberAgreeTerm(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberAgreeTerm(PathMetadata metadata, PathInits inits) { + this(MemberAgreeTerm.class, metadata, inits); + } + + public QMemberAgreeTerm(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + this.term = inits.isInitialized("term") ? new umc.spring.domain.QTerm(forProperty("term")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java new file mode 100644 index 0000000..3638e88 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java @@ -0,0 +1,56 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberMission is a Querydsl query type for MemberMission + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberMission extends EntityPathBase { + + private static final long serialVersionUID = 1962779462L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberMission memberMission = new QMemberMission("memberMission"); + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public final umc.spring.domain.QMission mission; + + public final EnumPath status = createEnum("status", umc.spring.domain.enums.MissionStatus.class); + + public QMemberMission(String variable) { + this(MemberMission.class, forVariable(variable), INITS); + } + + public QMemberMission(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberMission(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberMission(PathMetadata metadata, PathInits inits) { + this(MemberMission.class, metadata, inits); + } + + public QMemberMission(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + this.mission = inits.isInitialized("mission") ? new umc.spring.domain.QMission(forProperty("mission"), inits.get("mission")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java new file mode 100644 index 0000000..4151aa9 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java @@ -0,0 +1,54 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberPreferFood is a Querydsl query type for MemberPreferFood + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberPreferFood extends EntityPathBase { + + private static final long serialVersionUID = 111441556L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberPreferFood memberPreferFood = new QMemberPreferFood("memberPreferFood"); + + public final umc.spring.domain.QFood food; + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public QMemberPreferFood(String variable) { + this(MemberPreferFood.class, forVariable(variable), INITS); + } + + public QMemberPreferFood(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberPreferFood(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberPreferFood(PathMetadata metadata, PathInits inits) { + this(MemberPreferFood.class, metadata, inits); + } + + public QMemberPreferFood(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.food = inits.isInitialized("food") ? new umc.spring.domain.QFood(forProperty("food")) : null; + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + } + +} + diff --git a/spring/src/main/java/umc/spring/Application.java b/spring/src/main/java/umc/spring/Application.java index 1712ec5..c8b838c 100644 --- a/spring/src/main/java/umc/spring/Application.java +++ b/spring/src/main/java/umc/spring/Application.java @@ -1,8 +1,12 @@ package umc.spring; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import umc.spring.service.StoreService.StoreQueryService; @SpringBootApplication @EnableJpaAuditing @@ -12,4 +16,22 @@ public static void main(String[] args) { SpringApplication.run(Application.class, args); } + @Bean + public CommandLineRunner run(ApplicationContext context) { + return args -> { + StoreQueryService storeService = context.getBean(StoreQueryService.class); + + // 파라미터 값 설정 + String name = "요아정"; + Float score = 4.0f; + + // 쿼리 메서드 호출 및 쿼리 문자열과 파라미터 출력 + System.out.println("Executing findStoresByNameAndScore with parameters:"); + System.out.println("Name: " + name); + System.out.println("Score: " + score); + + storeService.findStoresByNameAndScore(name, score) + .forEach(System.out::println); + }; + } } diff --git a/spring/src/main/java/umc/spring/config/QueryDSLConfig.java b/spring/src/main/java/umc/spring/config/QueryDSLConfig.java new file mode 100644 index 0000000..6d3bdfb --- /dev/null +++ b/spring/src/main/java/umc/spring/config/QueryDSLConfig.java @@ -0,0 +1,18 @@ +package umc.spring.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDSLConfig { + @PersistenceContext // ntityManager를 빈으로 주입할 때 사용하는 어노테이션 + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/spring/src/main/java/umc/spring/domain/Store.java b/spring/src/main/java/umc/spring/domain/Store.java index 26ebc18..97f478b 100644 --- a/spring/src/main/java/umc/spring/domain/Store.java +++ b/spring/src/main/java/umc/spring/domain/Store.java @@ -5,6 +5,9 @@ import umc.spring.domain.common.BaseEntity; import umc.spring.domain.enums.FoodCategory; +import java.util.ArrayList; +import java.util.List; + @Entity @Getter @Builder @@ -30,4 +33,21 @@ public class Store extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "region_id") private Region region; + + @OneToMany(mappedBy = "store", cascade = CascadeType.ALL) + private List missionList = new ArrayList<>(); + + @OneToMany(mappedBy = "store", cascade = CascadeType.ALL) + private List reviewList = new ArrayList<>(); + + @Override + public String toString() { + return "Store{" + + "id=" + id + + ", name='" + name + '\'' + + ", address='" + address + '\'' + + ", score=" + score + + ", region=" + (region != null ? region.getName() : "N/A") + // region의 이름 출력 + '}'; + } } diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java new file mode 100644 index 0000000..38a81b8 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java @@ -0,0 +1,7 @@ +package umc.spring.repository.StoreRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Store; + +public interface StoreRepository extends JpaRepository, StoreRepositoryCustom { +} diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java new file mode 100644 index 0000000..934730b --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java @@ -0,0 +1,9 @@ +package umc.spring.repository.StoreRepository; + +import umc.spring.domain.Store; + +import java.util.List; + +public interface StoreRepositoryCustom { + List dynamicQueryWithBooleanBuilder(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java new file mode 100644 index 0000000..b072d33 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java @@ -0,0 +1,35 @@ +package umc.spring.repository.StoreRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.QStore; +import umc.spring.domain.Store; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class StoreRepositoryImpl implements StoreRepositoryCustom{ + private final JPAQueryFactory jpaQueryFactory; + private final QStore store = QStore.store; + + @Override + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + if (name != null) { + predicate.and(store.name.eq(name)); + } + + if (score != null) { + predicate.and(store.score.goe(4.0f)); + } + + return jpaQueryFactory + .selectFrom(store) + .where(predicate) + .fetch(); + } +} diff --git a/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java new file mode 100644 index 0000000..1534b7b --- /dev/null +++ b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java @@ -0,0 +1,12 @@ +package umc.spring.service.StoreService; + +import umc.spring.domain.Store; + +import java.util.List; +import java.util.Optional; + +public interface StoreQueryService { + + Optional findStore(Long id); + List findStoresByNameAndScore(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java new file mode 100644 index 0000000..955bde8 --- /dev/null +++ b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java @@ -0,0 +1,32 @@ +package umc.spring.service.StoreService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Store; +import umc.spring.repository.StoreRepository.StoreRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class StoreQueryServiceImpl implements StoreQueryService{ + + private final StoreRepository storeRepository; + + @Override + public Optional findStore(Long id) { + return storeRepository.findById(id); + } + + @Override + public List findStoresByNameAndScore(String name, Float score) { + List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); + + filteredStores.forEach(store -> System.out.println("Store: " + store)); + + return filteredStores; + } +} \ No newline at end of file diff --git a/spring/src/main/resources/application.yml b/spring/src/main/resources/application.yml index c8b71fe..21dc1fd 100644 --- a/spring/src/main/resources/application.yml +++ b/spring/src/main/resources/application.yml @@ -14,5 +14,5 @@ spring: format_sql: true use_sql_comments: true hbm2ddl: - auto: create + auto: update default_batch_fetch_size: 1000 \ No newline at end of file From c8f1738fd6e9a87c6f0d0b34e6e438b461aab256 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 20:51:27 +0900 Subject: [PATCH 03/13] :bug:practice(#6) : edit gradle --- spring/build.gradle | 51 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/spring/build.gradle b/spring/build.gradle index b208b9e..4351f77 100644 --- a/spring/build.gradle +++ b/spring/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' - id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" + // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'umc' @@ -13,12 +13,16 @@ java { languageVersion = JavaLanguageVersion.of(17) } } - +/* configurations { compileOnly { extendsFrom annotationProcessor } + querydsl.extendsFrom compileClasspath + //compileClasspath에 포함된 모든 라이브러리가 querydsl에서도 사용 가능하게 됨 + // QueryDSL 라이브러리를 자동 생성 시에 필요한 경로로 포함 } +*/ repositories { mavenCentral() @@ -30,23 +34,31 @@ dependencies { implementation 'org.hibernate.orm:hibernate-core:6.0.2.Final' implementation 'mysql:mysql-connector-java:8.0.33' - runtimeOnly 'com.mysql:mysql-connector-j' + //QueryDSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" - implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3' - implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.3' - implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3' + //Jackson (버전 제거) + implementation 'com.fasterxml.jackson.core:jackson-databind' + implementation 'com.fasterxml.jackson.core:jackson-annotations' + implementation 'com.fasterxml.jackson.core:jackson-core' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + //Lombok + compileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' // Bean Validation + implementation 'org.glassfish:jakarta.el:4.0.2' // Expression Language (EL) + implementation 'org.antlr:antlr4-runtime:4.10' // ANTLR 의존성 추가 + + // SpringDoc OpenAPI implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' implementation 'org.springdoc:springdoc-openapi-data-rest:1.6.9' + //Testing testImplementation 'org.springframework.boot:spring-boot-starter-test' } @@ -64,22 +76,9 @@ tasks.named('test') { // Querydsl 설정부 def generated = 'src/main/generated' - -querydsl { - jpa = true - querydslSourcesDir = generated -} -sourceSets { - main.java.srcDir generated -} - -compileQuerydsl{ - options.annotationProcessorPath = configurations.querydsl -} - -configurations { - compileOnly { - extendsFrom annotationProcessor - } - querydsl.extendsFrom compileClasspath +clean { + delete file(generated) } +tasks.withType(JavaCompile) { + options.generatedSourceOutputDirectory = file(generated) +} \ No newline at end of file From ed18ea0d5235959c783ab8b275d446e7154a726e Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 21:12:58 +0900 Subject: [PATCH 04/13] :fire:practice(#6) : delete .idea --- .idea/.gitignore | 8 -------- .idea/gradle.xml | 11 ----------- .idea/misc.xml | 4 ---- .idea/vcs.xml | 6 ------ 4 files changed, 29 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 1b387c7..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 6ed36dd..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 71c1b5003062dc9a6118fa8e346da5d68da2ff98 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 16:34:45 +0900 Subject: [PATCH 05/13] :heavy_plus_sign:practice(#6) : add dependencies & edit build.gradle --- spring/build.gradle | 50 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/spring/build.gradle b/spring/build.gradle index c261f24..b208b9e 100644 --- a/spring/build.gradle +++ b/spring/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' + id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'umc' @@ -26,12 +27,59 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' + implementation 'org.hibernate.orm:hibernate-core:6.0.2.Final' + + implementation 'mysql:mysql-connector-java:8.0.33' runtimeOnly 'com.mysql:mysql-connector-j' + + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + + implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3' + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.3' + implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3' + + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + + implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' + implementation 'org.springdoc:springdoc-openapi-data-rest:1.6.9' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } +sourceSets { + main { + java { + srcDirs = ['src/main/java', 'src/main/resources'] + } + } +} + tasks.named('test') { useJUnitPlatform() } + +// Querydsl 설정부 +def generated = 'src/main/generated' + +querydsl { + jpa = true + querydslSourcesDir = generated +} +sourceSets { + main.java.srcDir generated +} + +compileQuerydsl{ + options.annotationProcessorPath = configurations.querydsl +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } + querydsl.extendsFrom compileClasspath +} From e172bf64dcb6d397960c2dab7a29e299abf28e8b Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 20:00:34 +0900 Subject: [PATCH 06/13] :sparkles:practice(#6) : write QueryDSL query --- .../generated/umc/spring/domain/QFood.java | 52 +++++++++++++ .../generated/umc/spring/domain/QMember.java | 74 +++++++++++++++++++ .../generated/umc/spring/domain/QMission.java | 67 +++++++++++++++++ .../generated/umc/spring/domain/QRegion.java | 50 +++++++++++++ .../generated/umc/spring/domain/QReview.java | 66 +++++++++++++++++ .../generated/umc/spring/domain/QStore.java | 71 ++++++++++++++++++ .../generated/umc/spring/domain/QTerm.java | 54 ++++++++++++++ .../umc/spring/domain/common/QBaseEntity.java | 39 ++++++++++ .../domain/mapping/QMemberAgreeTerm.java | 54 ++++++++++++++ .../spring/domain/mapping/QMemberMission.java | 56 ++++++++++++++ .../domain/mapping/QMemberPreferFood.java | 54 ++++++++++++++ .../src/main/java/umc/spring/Application.java | 22 ++++++ .../umc/spring/config/QueryDSLConfig.java | 18 +++++ .../main/java/umc/spring/domain/Store.java | 20 +++++ .../StoreRepository/StoreRepository.java | 7 ++ .../StoreRepositoryCustom.java | 9 +++ .../StoreRepository/StoreRepositoryImpl.java | 35 +++++++++ .../StoreService/StoreQueryService.java | 12 +++ .../StoreService/StoreQueryServiceImpl.java | 32 ++++++++ spring/src/main/resources/application.yml | 2 +- 20 files changed, 793 insertions(+), 1 deletion(-) create mode 100644 spring/src/main/generated/umc/spring/domain/QFood.java create mode 100644 spring/src/main/generated/umc/spring/domain/QMember.java create mode 100644 spring/src/main/generated/umc/spring/domain/QMission.java create mode 100644 spring/src/main/generated/umc/spring/domain/QRegion.java create mode 100644 spring/src/main/generated/umc/spring/domain/QReview.java create mode 100644 spring/src/main/generated/umc/spring/domain/QStore.java create mode 100644 spring/src/main/generated/umc/spring/domain/QTerm.java create mode 100644 spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java create mode 100644 spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java create mode 100644 spring/src/main/java/umc/spring/config/QueryDSLConfig.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java diff --git a/spring/src/main/generated/umc/spring/domain/QFood.java b/spring/src/main/generated/umc/spring/domain/QFood.java new file mode 100644 index 0000000..4d4d34c --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QFood.java @@ -0,0 +1,52 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QFood is a Querydsl query type for Food + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QFood extends EntityPathBase { + + private static final long serialVersionUID = -1348495606L; + + public static final QFood food = new QFood("food"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath foodCategory = createEnum("foodCategory", umc.spring.domain.enums.FoodCategory.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberPreferFoodList = this.createList("memberPreferFoodList", umc.spring.domain.mapping.MemberPreferFood.class, umc.spring.domain.mapping.QMemberPreferFood.class, PathInits.DIRECT2); + + public final BooleanPath preferOptional = createBoolean("preferOptional"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QFood(String variable) { + super(Food.class, forVariable(variable)); + } + + public QFood(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QFood(PathMetadata metadata) { + super(Food.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QMember.java b/spring/src/main/generated/umc/spring/domain/QMember.java new file mode 100644 index 0000000..559de0d --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QMember.java @@ -0,0 +1,74 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMember is a Querydsl query type for Member + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMember extends EntityPathBase { + + private static final long serialVersionUID = 1366956614L; + + public static final QMember member = new QMember("member1"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath address = createString("address"); + + public final DatePath birthdate = createDate("birthdate", java.time.LocalDate.class); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final StringPath email = createString("email"); + + public final EnumPath gender = createEnum("gender", umc.spring.domain.enums.Gender.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final DatePath inactiveDate = createDate("inactiveDate", java.time.LocalDate.class); + + public final ListPath memberAgreeTermList = this.createList("memberAgreeTermList", umc.spring.domain.mapping.MemberAgreeTerm.class, umc.spring.domain.mapping.QMemberAgreeTerm.class, PathInits.DIRECT2); + + public final ListPath memberMissionList = this.createList("memberMissionList", umc.spring.domain.mapping.MemberMission.class, umc.spring.domain.mapping.QMemberMission.class, PathInits.DIRECT2); + + public final ListPath memberPreferFoodList = this.createList("memberPreferFoodList", umc.spring.domain.mapping.MemberPreferFood.class, umc.spring.domain.mapping.QMemberPreferFood.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + public final NumberPath point = createNumber("point", Integer.class); + + public final ListPath reviewList = this.createList("reviewList", Review.class, QReview.class, PathInits.DIRECT2); + + public final EnumPath socialtype = createEnum("socialtype", umc.spring.domain.enums.SocialType.class); + + public final StringPath specAddress = createString("specAddress"); + + public final EnumPath status = createEnum("status", umc.spring.domain.enums.MemberStatus.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMember(String variable) { + super(Member.class, forVariable(variable)); + } + + public QMember(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMember(PathMetadata metadata) { + super(Member.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QMission.java b/spring/src/main/generated/umc/spring/domain/QMission.java new file mode 100644 index 0000000..39a4add --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QMission.java @@ -0,0 +1,67 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMission is a Querydsl query type for Mission + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMission extends EntityPathBase { + + private static final long serialVersionUID = -453449888L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMission mission = new QMission("mission"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final DatePath dueDate = createDate("dueDate", java.time.LocalDate.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberMissionList = this.createList("memberMissionList", umc.spring.domain.mapping.MemberMission.class, umc.spring.domain.mapping.QMemberMission.class, PathInits.DIRECT2); + + public final StringPath missionSpec = createString("missionSpec"); + + public final NumberPath reward = createNumber("reward", Integer.class); + + public final QStore store; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QMission(String variable) { + this(Mission.class, forVariable(variable), INITS); + } + + public QMission(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMission(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMission(PathMetadata metadata, PathInits inits) { + this(Mission.class, metadata, inits); + } + + public QMission(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.store = inits.isInitialized("store") ? new QStore(forProperty("store"), inits.get("store")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QRegion.java b/spring/src/main/generated/umc/spring/domain/QRegion.java new file mode 100644 index 0000000..552717e --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QRegion.java @@ -0,0 +1,50 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QRegion is a Querydsl query type for Region + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QRegion extends EntityPathBase { + + private static final long serialVersionUID = 1509930656L; + + public static final QRegion region = new QRegion("region"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath name = createString("name"); + + public final ListPath StoreList = this.createList("StoreList", Store.class, QStore.class, PathInits.DIRECT2); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QRegion(String variable) { + super(Region.class, forVariable(variable)); + } + + public QRegion(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QRegion(PathMetadata metadata) { + super(Region.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QReview.java b/spring/src/main/generated/umc/spring/domain/QReview.java new file mode 100644 index 0000000..190cc63 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QReview.java @@ -0,0 +1,66 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QReview is a Querydsl query type for Review + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QReview extends EntityPathBase { + + private static final long serialVersionUID = 1510377220L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QReview review = new QReview("review"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final QMember member; + + public final NumberPath rating = createNumber("rating", Float.class); + + public final QStore store; + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QReview(String variable) { + this(Review.class, forVariable(variable), INITS); + } + + public QReview(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QReview(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QReview(PathMetadata metadata, PathInits inits) { + this(Review.class, metadata, inits); + } + + public QReview(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new QMember(forProperty("member")) : null; + this.store = inits.isInitialized("store") ? new QStore(forProperty("store"), inits.get("store")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QStore.java b/spring/src/main/generated/umc/spring/domain/QStore.java new file mode 100644 index 0000000..3330178 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QStore.java @@ -0,0 +1,71 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QStore is a Querydsl query type for Store + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QStore extends EntityPathBase { + + private static final long serialVersionUID = 1158464437L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QStore store = new QStore("store"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final StringPath address = createString("address"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final EnumPath foodCategory = createEnum("foodCategory", umc.spring.domain.enums.FoodCategory.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath missionList = this.createList("missionList", Mission.class, QMission.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + public final QRegion region; + + public final ListPath reviewList = this.createList("reviewList", Review.class, QReview.class, PathInits.DIRECT2); + + public final NumberPath score = createNumber("score", Float.class); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QStore(String variable) { + this(Store.class, forVariable(variable), INITS); + } + + public QStore(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QStore(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QStore(PathMetadata metadata, PathInits inits) { + this(Store.class, metadata, inits); + } + + public QStore(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.region = inits.isInitialized("region") ? new QRegion(forProperty("region")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/QTerm.java b/spring/src/main/generated/umc/spring/domain/QTerm.java new file mode 100644 index 0000000..b1fcea2 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/QTerm.java @@ -0,0 +1,54 @@ +package umc.spring.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QTerm is a Querydsl query type for Term + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QTerm extends EntityPathBase { + + private static final long serialVersionUID = -1348088040L; + + public static final QTerm term = new QTerm("term"); + + public final umc.spring.domain.common.QBaseEntity _super = new umc.spring.domain.common.QBaseEntity(this); + + public final BooleanPath agreeOptional = createBoolean("agreeOptional"); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdAt = _super.createdAt; + + public final NumberPath id = createNumber("id", Long.class); + + public final ListPath memberTermList = this.createList("memberTermList", umc.spring.domain.mapping.MemberAgreeTerm.class, umc.spring.domain.mapping.QMemberAgreeTerm.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + //inherited + public final DateTimePath updatedAt = _super.updatedAt; + + public QTerm(String variable) { + super(Term.class, forVariable(variable)); + } + + public QTerm(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QTerm(PathMetadata metadata) { + super(Term.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java b/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java new file mode 100644 index 0000000..0bafae2 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/common/QBaseEntity.java @@ -0,0 +1,39 @@ +package umc.spring.domain.common; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -1748720885L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final DateTimePath updatedAt = createDateTime("updatedAt", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java new file mode 100644 index 0000000..cff278c --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberAgreeTerm.java @@ -0,0 +1,54 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberAgreeTerm is a Querydsl query type for MemberAgreeTerm + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberAgreeTerm extends EntityPathBase { + + private static final long serialVersionUID = 471568498L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberAgreeTerm memberAgreeTerm = new QMemberAgreeTerm("memberAgreeTerm"); + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public final umc.spring.domain.QTerm term; + + public QMemberAgreeTerm(String variable) { + this(MemberAgreeTerm.class, forVariable(variable), INITS); + } + + public QMemberAgreeTerm(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberAgreeTerm(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberAgreeTerm(PathMetadata metadata, PathInits inits) { + this(MemberAgreeTerm.class, metadata, inits); + } + + public QMemberAgreeTerm(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + this.term = inits.isInitialized("term") ? new umc.spring.domain.QTerm(forProperty("term")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java new file mode 100644 index 0000000..3638e88 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberMission.java @@ -0,0 +1,56 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberMission is a Querydsl query type for MemberMission + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberMission extends EntityPathBase { + + private static final long serialVersionUID = 1962779462L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberMission memberMission = new QMemberMission("memberMission"); + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public final umc.spring.domain.QMission mission; + + public final EnumPath status = createEnum("status", umc.spring.domain.enums.MissionStatus.class); + + public QMemberMission(String variable) { + this(MemberMission.class, forVariable(variable), INITS); + } + + public QMemberMission(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberMission(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberMission(PathMetadata metadata, PathInits inits) { + this(MemberMission.class, metadata, inits); + } + + public QMemberMission(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + this.mission = inits.isInitialized("mission") ? new umc.spring.domain.QMission(forProperty("mission"), inits.get("mission")) : null; + } + +} + diff --git a/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java b/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java new file mode 100644 index 0000000..4151aa9 --- /dev/null +++ b/spring/src/main/generated/umc/spring/domain/mapping/QMemberPreferFood.java @@ -0,0 +1,54 @@ +package umc.spring.domain.mapping; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMemberPreferFood is a Querydsl query type for MemberPreferFood + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMemberPreferFood extends EntityPathBase { + + private static final long serialVersionUID = 111441556L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMemberPreferFood memberPreferFood = new QMemberPreferFood("memberPreferFood"); + + public final umc.spring.domain.QFood food; + + public final NumberPath id = createNumber("id", Long.class); + + public final umc.spring.domain.QMember member; + + public QMemberPreferFood(String variable) { + this(MemberPreferFood.class, forVariable(variable), INITS); + } + + public QMemberPreferFood(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMemberPreferFood(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMemberPreferFood(PathMetadata metadata, PathInits inits) { + this(MemberPreferFood.class, metadata, inits); + } + + public QMemberPreferFood(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.food = inits.isInitialized("food") ? new umc.spring.domain.QFood(forProperty("food")) : null; + this.member = inits.isInitialized("member") ? new umc.spring.domain.QMember(forProperty("member")) : null; + } + +} + diff --git a/spring/src/main/java/umc/spring/Application.java b/spring/src/main/java/umc/spring/Application.java index 1712ec5..c8b838c 100644 --- a/spring/src/main/java/umc/spring/Application.java +++ b/spring/src/main/java/umc/spring/Application.java @@ -1,8 +1,12 @@ package umc.spring; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import umc.spring.service.StoreService.StoreQueryService; @SpringBootApplication @EnableJpaAuditing @@ -12,4 +16,22 @@ public static void main(String[] args) { SpringApplication.run(Application.class, args); } + @Bean + public CommandLineRunner run(ApplicationContext context) { + return args -> { + StoreQueryService storeService = context.getBean(StoreQueryService.class); + + // 파라미터 값 설정 + String name = "요아정"; + Float score = 4.0f; + + // 쿼리 메서드 호출 및 쿼리 문자열과 파라미터 출력 + System.out.println("Executing findStoresByNameAndScore with parameters:"); + System.out.println("Name: " + name); + System.out.println("Score: " + score); + + storeService.findStoresByNameAndScore(name, score) + .forEach(System.out::println); + }; + } } diff --git a/spring/src/main/java/umc/spring/config/QueryDSLConfig.java b/spring/src/main/java/umc/spring/config/QueryDSLConfig.java new file mode 100644 index 0000000..6d3bdfb --- /dev/null +++ b/spring/src/main/java/umc/spring/config/QueryDSLConfig.java @@ -0,0 +1,18 @@ +package umc.spring.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDSLConfig { + @PersistenceContext // ntityManager를 빈으로 주입할 때 사용하는 어노테이션 + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/spring/src/main/java/umc/spring/domain/Store.java b/spring/src/main/java/umc/spring/domain/Store.java index 26ebc18..97f478b 100644 --- a/spring/src/main/java/umc/spring/domain/Store.java +++ b/spring/src/main/java/umc/spring/domain/Store.java @@ -5,6 +5,9 @@ import umc.spring.domain.common.BaseEntity; import umc.spring.domain.enums.FoodCategory; +import java.util.ArrayList; +import java.util.List; + @Entity @Getter @Builder @@ -30,4 +33,21 @@ public class Store extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "region_id") private Region region; + + @OneToMany(mappedBy = "store", cascade = CascadeType.ALL) + private List missionList = new ArrayList<>(); + + @OneToMany(mappedBy = "store", cascade = CascadeType.ALL) + private List reviewList = new ArrayList<>(); + + @Override + public String toString() { + return "Store{" + + "id=" + id + + ", name='" + name + '\'' + + ", address='" + address + '\'' + + ", score=" + score + + ", region=" + (region != null ? region.getName() : "N/A") + // region의 이름 출력 + '}'; + } } diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java new file mode 100644 index 0000000..38a81b8 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepository.java @@ -0,0 +1,7 @@ +package umc.spring.repository.StoreRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Store; + +public interface StoreRepository extends JpaRepository, StoreRepositoryCustom { +} diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java new file mode 100644 index 0000000..934730b --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryCustom.java @@ -0,0 +1,9 @@ +package umc.spring.repository.StoreRepository; + +import umc.spring.domain.Store; + +import java.util.List; + +public interface StoreRepositoryCustom { + List dynamicQueryWithBooleanBuilder(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java new file mode 100644 index 0000000..b072d33 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/StoreRepository/StoreRepositoryImpl.java @@ -0,0 +1,35 @@ +package umc.spring.repository.StoreRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.QStore; +import umc.spring.domain.Store; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class StoreRepositoryImpl implements StoreRepositoryCustom{ + private final JPAQueryFactory jpaQueryFactory; + private final QStore store = QStore.store; + + @Override + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + if (name != null) { + predicate.and(store.name.eq(name)); + } + + if (score != null) { + predicate.and(store.score.goe(4.0f)); + } + + return jpaQueryFactory + .selectFrom(store) + .where(predicate) + .fetch(); + } +} diff --git a/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java new file mode 100644 index 0000000..1534b7b --- /dev/null +++ b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryService.java @@ -0,0 +1,12 @@ +package umc.spring.service.StoreService; + +import umc.spring.domain.Store; + +import java.util.List; +import java.util.Optional; + +public interface StoreQueryService { + + Optional findStore(Long id); + List findStoresByNameAndScore(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java new file mode 100644 index 0000000..955bde8 --- /dev/null +++ b/spring/src/main/java/umc/spring/service/StoreService/StoreQueryServiceImpl.java @@ -0,0 +1,32 @@ +package umc.spring.service.StoreService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Store; +import umc.spring.repository.StoreRepository.StoreRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class StoreQueryServiceImpl implements StoreQueryService{ + + private final StoreRepository storeRepository; + + @Override + public Optional findStore(Long id) { + return storeRepository.findById(id); + } + + @Override + public List findStoresByNameAndScore(String name, Float score) { + List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); + + filteredStores.forEach(store -> System.out.println("Store: " + store)); + + return filteredStores; + } +} \ No newline at end of file diff --git a/spring/src/main/resources/application.yml b/spring/src/main/resources/application.yml index c8b71fe..21dc1fd 100644 --- a/spring/src/main/resources/application.yml +++ b/spring/src/main/resources/application.yml @@ -14,5 +14,5 @@ spring: format_sql: true use_sql_comments: true hbm2ddl: - auto: create + auto: update default_batch_fetch_size: 1000 \ No newline at end of file From 092f425cf467824afe26c8e6e04881273fc89f9a Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 20:51:27 +0900 Subject: [PATCH 07/13] :bug:practice(#6) : edit gradle --- spring/build.gradle | 51 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/spring/build.gradle b/spring/build.gradle index b208b9e..4351f77 100644 --- a/spring/build.gradle +++ b/spring/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' - id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" + // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'umc' @@ -13,12 +13,16 @@ java { languageVersion = JavaLanguageVersion.of(17) } } - +/* configurations { compileOnly { extendsFrom annotationProcessor } + querydsl.extendsFrom compileClasspath + //compileClasspath에 포함된 모든 라이브러리가 querydsl에서도 사용 가능하게 됨 + // QueryDSL 라이브러리를 자동 생성 시에 필요한 경로로 포함 } +*/ repositories { mavenCentral() @@ -30,23 +34,31 @@ dependencies { implementation 'org.hibernate.orm:hibernate-core:6.0.2.Final' implementation 'mysql:mysql-connector-java:8.0.33' - runtimeOnly 'com.mysql:mysql-connector-j' + //QueryDSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" - implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3' - implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.3' - implementation 'com.fasterxml.jackson.core:jackson-core:2.13.3' + //Jackson (버전 제거) + implementation 'com.fasterxml.jackson.core:jackson-databind' + implementation 'com.fasterxml.jackson.core:jackson-annotations' + implementation 'com.fasterxml.jackson.core:jackson-core' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + //Lombok + compileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' // Bean Validation + implementation 'org.glassfish:jakarta.el:4.0.2' // Expression Language (EL) + implementation 'org.antlr:antlr4-runtime:4.10' // ANTLR 의존성 추가 + + // SpringDoc OpenAPI implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' implementation 'org.springdoc:springdoc-openapi-data-rest:1.6.9' + //Testing testImplementation 'org.springframework.boot:spring-boot-starter-test' } @@ -64,22 +76,9 @@ tasks.named('test') { // Querydsl 설정부 def generated = 'src/main/generated' - -querydsl { - jpa = true - querydslSourcesDir = generated -} -sourceSets { - main.java.srcDir generated -} - -compileQuerydsl{ - options.annotationProcessorPath = configurations.querydsl -} - -configurations { - compileOnly { - extendsFrom annotationProcessor - } - querydsl.extendsFrom compileClasspath +clean { + delete file(generated) } +tasks.withType(JavaCompile) { + options.generatedSourceOutputDirectory = file(generated) +} \ No newline at end of file From 0523ed8d40f1142f4d586debfa37198926fbef17 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 21:12:58 +0900 Subject: [PATCH 08/13] :fire:practice(#6) : delete .idea --- .idea/.gitignore | 8 -------- .idea/gradle.xml | 11 ----------- .idea/misc.xml | 4 ---- .idea/vcs.xml | 6 ------ 4 files changed, 29 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 1b387c7..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 6ed36dd..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From e92d859b11d0fa901bc80b5cb16de3dadd8187c8 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 7 Nov 2024 23:50:22 +0900 Subject: [PATCH 09/13] :sparkles:mission(#6) : Add repository interface&implements interface --- .../MemberRepository/MemberRepository.java | 8 ++++++ .../MemberRepositoryCustom.java | 8 ++++++ .../MemberRepositoryImpl.java | 26 +++++++++++++++++++ .../MissionRepository/MissionRepository.java | 8 ++++++ .../MissionRepositoryCustom.java | 8 ++++++ .../MissionRepositoryImpl.java | 26 +++++++++++++++++++ .../RegionRepository/RegionRepository.java | 8 ++++++ .../RegionRepositoryCustom.java | 8 ++++++ .../RegionRepositoryImpl.java | 26 +++++++++++++++++++ 9 files changed, 126 insertions(+) create mode 100644 spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java new file mode 100644 index 0000000..9075033 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java @@ -0,0 +1,8 @@ +package umc.spring.repository.MemberRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Member; +import umc.spring.repository.StoreRepository.StoreRepositoryCustom; + +public interface MemberRepository extends JpaRepository, StoreRepositoryCustom { +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java new file mode 100644 index 0000000..7db0f17 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java @@ -0,0 +1,8 @@ +package umc.spring.repository.MemberRepository; + +import umc.spring.domain.Member; +import java.util.List; + +public interface MemberRepositoryCustom { + List dynamicQueryWithBooleanBuilder(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java new file mode 100644 index 0000000..e7ee007 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java @@ -0,0 +1,26 @@ +package umc.spring.repository.MemberRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.QMember; +import umc.spring.domain.Member; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class MemberRepositoryImpl implements MemberRepositoryCustom { + private final JPAQueryFactory jpaQueryFactory; + private final QMember member=QMember.member; + + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + return jpaQueryFactory + .selectFrom(member) + .where(predicate) + .fetch(); + } +} diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java new file mode 100644 index 0000000..f2f7531 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java @@ -0,0 +1,8 @@ +package umc.spring.repository.MissionRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Mission; +import umc.spring.repository.StoreRepository.StoreRepositoryCustom; + +public interface MissionRepository extends JpaRepository, StoreRepositoryCustom { +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java new file mode 100644 index 0000000..9577f37 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java @@ -0,0 +1,8 @@ +package umc.spring.repository.MissionRepository; + +import umc.spring.domain.Mission; +import java.util.List; + +public interface MissionRepositoryCustom { + List dynamicQueryWithBooleanBuilder(String name, Float score); +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java new file mode 100644 index 0000000..d73af68 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java @@ -0,0 +1,26 @@ +package umc.spring.repository.MissionRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.QMission; +import umc.spring.domain.Mission; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class MissionRepositoryImpl implements MissionRepositoryCustom{ + private final JPAQueryFactory jpaQueryFactory; + private final QMission mission=QMission.mission; + + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + return jpaQueryFactory + .selectFrom(mission) + .where(predicate) + .fetch(); + } +} diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java new file mode 100644 index 0000000..6e1461e --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java @@ -0,0 +1,8 @@ +package umc.spring.repository.RegionRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Region; +import umc.spring.repository.StoreRepository.StoreRepositoryCustom; + +public interface RegionRepository extends JpaRepository, StoreRepositoryCustom { +} diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java new file mode 100644 index 0000000..dde5bf9 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java @@ -0,0 +1,8 @@ +package umc.spring.repository.RegionRepository; + +import umc.spring.domain.Region; +import java.util.List; + +public interface RegionRepositoryCustom { + List dynamicQueryWithBooleanBuilder(String name, Float score); +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java new file mode 100644 index 0000000..6747507 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java @@ -0,0 +1,26 @@ +package umc.spring.repository.RegionRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.QRegion; +import umc.spring.domain.Region; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RegionRepositoryImpl implements RegionRepositoryCustom { + private final JPAQueryFactory jpaQueryFactory; + private final QRegion region = QRegion.region; + + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + return jpaQueryFactory + .selectFrom(region) + .where(predicate) + .fetch(); + } +} From 139ed72dd3d6aa6e2ace8460b97cbc49a8418f1c Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Fri, 8 Nov 2024 00:07:22 +0900 Subject: [PATCH 10/13] :sparkles:mission(#6) : setting service interface --- .../MemberService/MemberQueryService.java | 12 +++++++ .../MemberService/MemberQueryServiceImpl.java | 32 +++++++++++++++++++ .../MissionService/MissionQueryService.java | 12 +++++++ .../MissionQueryServiceImpl.java | 32 +++++++++++++++++++ .../RegionService/RegionQueryService.java | 12 +++++++ .../RegionService/RegionQueryServiceImpl.java | 32 +++++++++++++++++++ 6 files changed, 132 insertions(+) create mode 100644 spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java create mode 100644 spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java create mode 100644 spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java diff --git a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java new file mode 100644 index 0000000..ff27f1f --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java @@ -0,0 +1,12 @@ +package umc.spring.service.MemberService; + +import umc.spring.domain.Store; + +import java.util.List; +import java.util.Optional; + +public interface MemberQueryService { + + Optional findStore(Long id); + List findStoresByNameAndScore(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java new file mode 100644 index 0000000..c2ab88e --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java @@ -0,0 +1,32 @@ +package umc.spring.service.MemberService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Store; +import umc.spring.repository.StoreRepository.StoreRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberQueryServiceImpl implements MemberQueryService { + + private final StoreRepository storeRepository; + + @Override + public Optional findStore(Long id) { + return storeRepository.findById(id); + } + + @Override + public List findStoresByNameAndScore(String name, Float score) { + List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); + + filteredStores.forEach(store -> System.out.println("Store: " + store)); + + return filteredStores; + } +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java new file mode 100644 index 0000000..4c1fa37 --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java @@ -0,0 +1,12 @@ +package umc.spring.service.MissionService; + +import umc.spring.domain.Store; + +import java.util.List; +import java.util.Optional; + +public interface MissionQueryService { + + Optional findStore(Long id); + List findStoresByNameAndScore(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java new file mode 100644 index 0000000..732527b --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java @@ -0,0 +1,32 @@ +package umc.spring.service.MissionService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Store; +import umc.spring.repository.StoreRepository.StoreRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MissionQueryServiceImpl implements MissionQueryService { + + private final StoreRepository storeRepository; + + @Override + public Optional findStore(Long id) { + return storeRepository.findById(id); + } + + @Override + public List findStoresByNameAndScore(String name, Float score) { + List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); + + filteredStores.forEach(store -> System.out.println("Store: " + store)); + + return filteredStores; + } +} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java b/spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java new file mode 100644 index 0000000..2dba43c --- /dev/null +++ b/spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java @@ -0,0 +1,12 @@ +package umc.spring.service.RegionService; + +import umc.spring.domain.Store; + +import java.util.List; +import java.util.Optional; + +public interface RegionQueryService { + + Optional findStore(Long id); + List findStoresByNameAndScore(String name, Float score); +} diff --git a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java new file mode 100644 index 0000000..9610b3e --- /dev/null +++ b/spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java @@ -0,0 +1,32 @@ +package umc.spring.service.RegionService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Store; +import umc.spring.repository.StoreRepository.StoreRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class RegionQueryServiceImpl implements RegionQueryService { + + private final StoreRepository storeRepository; + + @Override + public Optional findStore(Long id) { + return storeRepository.findById(id); + } + + @Override + public List findStoresByNameAndScore(String name, Float score) { + List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); + + filteredStores.forEach(store -> System.out.println("Store: " + store)); + + return filteredStores; + } +} \ No newline at end of file From fb60baa0465c2b7db31b33cb7db563e1d2ee73d4 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Fri, 8 Nov 2024 00:48:33 +0900 Subject: [PATCH 11/13] :sparkles:mission(#6) : setting repository & service --- .../MemberMissionRepository.java | 8 ++++++ .../MemberMissionRepositoryCustom.java | 9 +++++++ .../MemberMissionRepositoryImpl.java | 26 +++++++++++++++++++ .../MemberMissionQueryService.java | 4 +++ .../MemberMissionQueryServiceImpl.java | 4 +++ .../ReviewQueryService.java} | 4 +-- .../ReviewQueryServiceImpl.java} | 4 +-- 7 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepository.java create mode 100644 spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryCustom.java create mode 100644 spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java create mode 100644 spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java rename spring/src/main/java/umc/spring/service/{RegionService/RegionQueryService.java => ReviewService/ReviewQueryService.java} (71%) rename spring/src/main/java/umc/spring/service/{RegionService/RegionQueryServiceImpl.java => ReviewService/ReviewQueryServiceImpl.java} (88%) diff --git a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepository.java b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepository.java new file mode 100644 index 0000000..3152fb5 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepository.java @@ -0,0 +1,8 @@ +package umc.spring.repository.MemberMissionRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.mapping.MemberMission; +import umc.spring.repository.StoreRepository.StoreRepositoryCustom; + +public interface MemberMissionRepository extends JpaRepository, MemberMissionRepositoryCustom { +} diff --git a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryCustom.java new file mode 100644 index 0000000..f90b893 --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryCustom.java @@ -0,0 +1,9 @@ +package umc.spring.repository.MemberMissionRepository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import umc.spring.domain.mapping.MemberMission; + +public interface MemberMissionRepositoryCustom { + Page findMissionsByMemberAndStatus(Long memberId, String status, Long cursor, Pageable pageable); +} diff --git a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java new file mode 100644 index 0000000..28b5e0e --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java @@ -0,0 +1,26 @@ +package umc.spring.repository.MemberMissionRepository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import umc.spring.domain.mapping.MemberMission; +import umc.spring.domain.mapping.QMemberMission; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class MemberMissionRepositoryImpl implements MemberMissionRepository { + private final JPAQueryFactory jpaQueryFactory; + private final QMemberMission memberMission = QMemberMission.memberMission; + + public List dynamicQueryWithBooleanBuilder(String name, Float score) { + BooleanBuilder predicate = new BooleanBuilder(); + + return jpaQueryFactory + .selectFrom(memberMission) + .where(predicate) + .fetch(); + } +} diff --git a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java new file mode 100644 index 0000000..f7392ac --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java @@ -0,0 +1,4 @@ +package umc.spring.service.MemberMissionService; + +public interface MemberMissionQueryService { +} diff --git a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java new file mode 100644 index 0000000..2328a68 --- /dev/null +++ b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java @@ -0,0 +1,4 @@ +package umc.spring.service.MemberMissionService; + +public class MemberMissionQueryServiceImpl implements MemberMissionQueryService { +} diff --git a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java similarity index 71% rename from spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java rename to spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java index 2dba43c..aa9f932 100644 --- a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryService.java +++ b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java @@ -1,11 +1,11 @@ -package umc.spring.service.RegionService; +package umc.spring.service.ReviewService; import umc.spring.domain.Store; import java.util.List; import java.util.Optional; -public interface RegionQueryService { +public interface ReviewQueryService { Optional findStore(Long id); List findStoresByNameAndScore(String name, Float score); diff --git a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java similarity index 88% rename from spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java rename to spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java index 9610b3e..8ea2463 100644 --- a/spring/src/main/java/umc/spring/service/RegionService/RegionQueryServiceImpl.java +++ b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java @@ -1,4 +1,4 @@ -package umc.spring.service.RegionService; +package umc.spring.service.ReviewService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ @Service @RequiredArgsConstructor @Transactional(readOnly = true) -public class RegionQueryServiceImpl implements RegionQueryService { +public class ReviewQueryServiceImpl implements ReviewQueryService { private final StoreRepository storeRepository; From 6652cd423c11b8a8da0de7431e39304675382ed6 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Fri, 8 Nov 2024 02:02:32 +0900 Subject: [PATCH 12/13] :sparkles:mission(#6) : Write Queries --- .../main/java/umc/spring/domain/Review.java | 1 + .../umc/spring/domain/common/BaseEntity.java | 1 + .../MemberMissionRepositoryImpl.java | 48 ++++++++++++++--- .../MemberRepository/MemberRepository.java | 5 +- .../MemberRepositoryCustom.java | 5 +- .../MemberRepositoryImpl.java | 36 ++++++++----- .../MissionRepository/MissionRepository.java | 7 +-- .../MissionRepositoryCustom.java | 4 +- .../MissionRepositoryImpl.java | 52 +++++++++++++++---- .../RegionRepository/RegionRepository.java | 8 --- .../RegionRepositoryCustom.java | 8 --- .../RegionRepositoryImpl.java | 26 ---------- .../ReviewRepository/ReviewRepository.java | 8 +++ .../MemberMissionQueryService.java | 5 ++ .../MemberMissionQueryServiceImpl.java | 20 +++++++ .../MemberService/MemberQueryService.java | 8 +-- .../MemberService/MemberQueryServiceImpl.java | 24 +++------ .../MissionService/MissionQueryService.java | 7 +-- .../MissionQueryServiceImpl.java | 24 +++------ .../ReviewService/ReviewQueryService.java | 9 +--- .../ReviewService/ReviewQueryServiceImpl.java | 44 ++++++++++------ 21 files changed, 205 insertions(+), 145 deletions(-) delete mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java delete mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java delete mode 100644 spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java create mode 100644 spring/src/main/java/umc/spring/repository/ReviewRepository/ReviewRepository.java diff --git a/spring/src/main/java/umc/spring/domain/Review.java b/spring/src/main/java/umc/spring/domain/Review.java index 367bebb..55fef0f 100644 --- a/spring/src/main/java/umc/spring/domain/Review.java +++ b/spring/src/main/java/umc/spring/domain/Review.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import lombok.experimental.SuperBuilder; import umc.spring.domain.common.BaseEntity; @Entity diff --git a/spring/src/main/java/umc/spring/domain/common/BaseEntity.java b/spring/src/main/java/umc/spring/domain/common/BaseEntity.java index f83d8c4..7c81741 100644 --- a/spring/src/main/java/umc/spring/domain/common/BaseEntity.java +++ b/spring/src/main/java/umc/spring/domain/common/BaseEntity.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import lombok.experimental.SuperBuilder; import org.springframework.data.annotation.*; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.LocalDateTime; diff --git a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java index 28b5e0e..0207ed9 100644 --- a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java +++ b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java @@ -2,8 +2,16 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; +import umc.spring.domain.QMember; +import umc.spring.domain.QMission; +import umc.spring.domain.QStore; +import umc.spring.domain.enums.MissionStatus; import umc.spring.domain.mapping.MemberMission; import umc.spring.domain.mapping.QMemberMission; @@ -11,16 +19,42 @@ @Repository @RequiredArgsConstructor -public class MemberMissionRepositoryImpl implements MemberMissionRepository { +public class MemberMissionRepositoryImpl implements MemberMissionRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; - private final QMemberMission memberMission = QMemberMission.memberMission; - public List dynamicQueryWithBooleanBuilder(String name, Float score) { - BooleanBuilder predicate = new BooleanBuilder(); + @Override + public Page findMissionsByMemberAndStatus(Long memberId, String status, Long cursor, Pageable pageable) { + QMember member = QMember.member; + QMemberMission memberMission = QMemberMission.memberMission; + QMission mission = QMission.mission; + QStore store = QStore.store; - return jpaQueryFactory - .selectFrom(memberMission) - .where(predicate) + BooleanBuilder builder = new BooleanBuilder(); + builder.and(member.id.eq(memberId)); + builder.and(memberMission.status.eq(MissionStatus.valueOf(status))); + + // cursor 값 조건 추가 + if (cursor != null) { + builder.and(mission.id.lt(cursor)); + } + + List result = jpaQueryFactory + .select(new QMemberMission( + mission.id, + store.name, + mission.reward, + mission.missionSpec, + memberMission.status + )) + .from(member) + .join(memberMission).on(member.id.eq(memberMission.member.id)) + .join(mission).on(memberMission.mission.id.eq(mission.id)) + .join(store).on(mission.store.id.eq(store.id)) + .where(builder) + .orderBy(mission.id.desc()) + .limit(pageable.getPageSize()) .fetch(); + + return new PageImpl<>(result, pageable, result.size()); } } diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java index 9075033..d3c0328 100644 --- a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepository.java @@ -1,8 +1,9 @@ package umc.spring.repository.MemberRepository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import umc.spring.domain.Member; -import umc.spring.repository.StoreRepository.StoreRepositoryCustom; -public interface MemberRepository extends JpaRepository, StoreRepositoryCustom { +@Repository +public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { } \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java index 7db0f17..b678dba 100644 --- a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryCustom.java @@ -1,8 +1,9 @@ package umc.spring.repository.MemberRepository; +import com.querydsl.core.types.dsl.BooleanExpression; import umc.spring.domain.Member; -import java.util.List; +import java.util.Optional; public interface MemberRepositoryCustom { - List dynamicQueryWithBooleanBuilder(String name, Float score); + Optional findMemberById(Long memberId); } diff --git a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java index e7ee007..2541191 100644 --- a/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java +++ b/spring/src/main/java/umc/spring/repository/MemberRepository/MemberRepositoryImpl.java @@ -2,25 +2,37 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import umc.spring.domain.QMember; import umc.spring.domain.Member; -import java.util.List; +import java.util.Optional; + +import static umc.spring.domain.QMember.member; @Repository -@RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { - private final JPAQueryFactory jpaQueryFactory; - private final QMember member=QMember.member; - public List dynamicQueryWithBooleanBuilder(String name, Float score) { - BooleanBuilder predicate = new BooleanBuilder(); + private final JPAQueryFactory queryFactory; - return jpaQueryFactory - .selectFrom(member) - .where(predicate) - .fetch(); + @Autowired + public MemberRepositoryImpl(JPAQueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + @Override + public Optional findMemberById(Long memberId) { + BooleanBuilder builder = new BooleanBuilder(); + + if (memberId != null) { + builder.and(member.id.eq(memberId)); + } + + Member result = queryFactory.selectFrom(member) + .where(builder) + .fetchOne(); + + return Optional.ofNullable(result); } } + diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java index f2f7531..28f592d 100644 --- a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepository.java @@ -1,8 +1,9 @@ package umc.spring.repository.MissionRepository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import umc.spring.domain.Mission; -import umc.spring.repository.StoreRepository.StoreRepositoryCustom; -public interface MissionRepository extends JpaRepository, StoreRepositoryCustom { -} \ No newline at end of file +@Repository +public interface MissionRepository extends JpaRepository, MissionRepositoryCustom { +} diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java index 9577f37..1b11517 100644 --- a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryCustom.java @@ -1,8 +1,10 @@ package umc.spring.repository.MissionRepository; +import com.querydsl.core.types.dsl.BooleanExpression; import umc.spring.domain.Mission; + import java.util.List; public interface MissionRepositoryCustom { - List dynamicQueryWithBooleanBuilder(String name, Float score); + List findMissions(String regionName, Long cursor, Long memberId); } \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java index d73af68..2fa4010 100644 --- a/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java +++ b/spring/src/main/java/umc/spring/repository/MissionRepository/MissionRepositoryImpl.java @@ -2,25 +2,55 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; -import umc.spring.domain.QMission; import umc.spring.domain.Mission; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; +import static umc.spring.domain.QMission.mission; +import static umc.spring.domain.QStore.store; +import static umc.spring.domain.QRegion.region; +import static umc.spring.domain.mapping.QMemberMission.memberMission; + @Repository -@RequiredArgsConstructor -public class MissionRepositoryImpl implements MissionRepositoryCustom{ - private final JPAQueryFactory jpaQueryFactory; - private final QMission mission=QMission.mission; +public class MissionRepositoryImpl implements MissionRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Autowired + public MissionRepositoryImpl(JPAQueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + @Override + public List findMissions(String regionName, Long cursor, Long memberId) { + BooleanBuilder builder = new BooleanBuilder(); + + if (regionName != null) { + builder.and(region.name.eq(regionName)); + } + if (cursor != null) { + builder.and(mission.id.lt(cursor)); + } + builder.and(mission.dueDate.after(LocalDate.from(LocalDateTime.now()))); - public List dynamicQueryWithBooleanBuilder(String name, Float score) { - BooleanBuilder predicate = new BooleanBuilder(); + // 미션 ID가 member_mission에 존재하지 않는 조건 + builder.and(mission.id.notIn( + queryFactory.select(memberMission.mission.id) + .from(memberMission) + .where(memberMission.member.id.eq(memberId)) + )); - return jpaQueryFactory - .selectFrom(mission) - .where(predicate) + return queryFactory.select(mission) + .from(mission) + .join(mission.store, store) + .join(store.region, region) + .where(builder) + .orderBy(mission.id.desc()) + .limit(10) .fetch(); } } diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java deleted file mode 100644 index 6e1461e..0000000 --- a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package umc.spring.repository.RegionRepository; - -import org.springframework.data.jpa.repository.JpaRepository; -import umc.spring.domain.Region; -import umc.spring.repository.StoreRepository.StoreRepositoryCustom; - -public interface RegionRepository extends JpaRepository, StoreRepositoryCustom { -} diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java deleted file mode 100644 index dde5bf9..0000000 --- a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryCustom.java +++ /dev/null @@ -1,8 +0,0 @@ -package umc.spring.repository.RegionRepository; - -import umc.spring.domain.Region; -import java.util.List; - -public interface RegionRepositoryCustom { - List dynamicQueryWithBooleanBuilder(String name, Float score); -} \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java deleted file mode 100644 index 6747507..0000000 --- a/spring/src/main/java/umc/spring/repository/RegionRepository/RegionRepositoryImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package umc.spring.repository.RegionRepository; - -import com.querydsl.core.BooleanBuilder; -import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import umc.spring.domain.QRegion; -import umc.spring.domain.Region; - -import java.util.List; - -@Repository -@RequiredArgsConstructor -public class RegionRepositoryImpl implements RegionRepositoryCustom { - private final JPAQueryFactory jpaQueryFactory; - private final QRegion region = QRegion.region; - - public List dynamicQueryWithBooleanBuilder(String name, Float score) { - BooleanBuilder predicate = new BooleanBuilder(); - - return jpaQueryFactory - .selectFrom(region) - .where(predicate) - .fetch(); - } -} diff --git a/spring/src/main/java/umc/spring/repository/ReviewRepository/ReviewRepository.java b/spring/src/main/java/umc/spring/repository/ReviewRepository/ReviewRepository.java new file mode 100644 index 0000000..7b3b73c --- /dev/null +++ b/spring/src/main/java/umc/spring/repository/ReviewRepository/ReviewRepository.java @@ -0,0 +1,8 @@ +package umc.spring.repository.ReviewRepository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Review; + +public interface ReviewRepository extends JpaRepository { +} + diff --git a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java index f7392ac..2ead403 100644 --- a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java +++ b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryService.java @@ -1,4 +1,9 @@ package umc.spring.service.MemberMissionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import umc.spring.domain.mapping.MemberMission; + public interface MemberMissionQueryService { + Page getMissionsByMemberAndStatus(Long memberId, String status, Long cursor, Pageable pageable); } diff --git a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java index 2328a68..0df2634 100644 --- a/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java +++ b/spring/src/main/java/umc/spring/service/MemberMissionService/MemberMissionQueryServiceImpl.java @@ -1,4 +1,24 @@ package umc.spring.service.MemberMissionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.mapping.MemberMission; +import umc.spring.repository.MemberMissionRepository.MemberMissionRepository; + +@Service +@Transactional(readOnly = true) public class MemberMissionQueryServiceImpl implements MemberMissionQueryService { + + private final MemberMissionRepository memberMissionRepository; + + public MemberMissionQueryServiceImpl(MemberMissionRepository memberMissionRepository) { + this.memberMissionRepository = memberMissionRepository; + } + + @Override + public Page getMissionsByMemberAndStatus(Long memberId, String status, Long cursor, Pageable pageable) { + return memberMissionRepository.findMissionsByMemberAndStatus(memberId, status, cursor, pageable); + } } diff --git a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java index ff27f1f..e66e326 100644 --- a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java +++ b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryService.java @@ -1,12 +1,8 @@ package umc.spring.service.MemberService; -import umc.spring.domain.Store; - -import java.util.List; +import umc.spring.domain.Member; import java.util.Optional; public interface MemberQueryService { - - Optional findStore(Long id); - List findStoresByNameAndScore(String name, Float score); + Optional getMemberById(Long memberId); } diff --git a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java index c2ab88e..40681cd 100644 --- a/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java +++ b/spring/src/main/java/umc/spring/service/MemberService/MemberQueryServiceImpl.java @@ -1,32 +1,24 @@ package umc.spring.service.MemberService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import umc.spring.domain.Store; -import umc.spring.repository.StoreRepository.StoreRepository; +import umc.spring.domain.Member; +import umc.spring.repository.MemberRepository.MemberRepository; -import java.util.List; import java.util.Optional; @Service -@RequiredArgsConstructor -@Transactional(readOnly = true) +@Transactional public class MemberQueryServiceImpl implements MemberQueryService { - private final StoreRepository storeRepository; + private final MemberRepository memberRepository; - @Override - public Optional findStore(Long id) { - return storeRepository.findById(id); + public MemberQueryServiceImpl(MemberRepository memberRepository) { + this.memberRepository = memberRepository; } @Override - public List findStoresByNameAndScore(String name, Float score) { - List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); - - filteredStores.forEach(store -> System.out.println("Store: " + store)); - - return filteredStores; + public Optional getMemberById(Long memberId) { + return memberRepository.findMemberById(memberId); } } \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java index 4c1fa37..57eff55 100644 --- a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java +++ b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryService.java @@ -1,12 +1,9 @@ package umc.spring.service.MissionService; -import umc.spring.domain.Store; +import umc.spring.domain.Mission; import java.util.List; -import java.util.Optional; public interface MissionQueryService { - - Optional findStore(Long id); - List findStoresByNameAndScore(String name, Float score); + List getAvailableMissions(String regionName, Long cursor, Long memberId); } diff --git a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java index 732527b..8f6d2a2 100644 --- a/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java +++ b/spring/src/main/java/umc/spring/service/MissionService/MissionQueryServiceImpl.java @@ -1,32 +1,24 @@ package umc.spring.service.MissionService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import umc.spring.domain.Store; -import umc.spring.repository.StoreRepository.StoreRepository; +import umc.spring.domain.Mission; +import umc.spring.repository.MissionRepository.MissionRepository; import java.util.List; -import java.util.Optional; @Service -@RequiredArgsConstructor -@Transactional(readOnly = true) +@Transactional public class MissionQueryServiceImpl implements MissionQueryService { - private final StoreRepository storeRepository; + private final MissionRepository missionRepository; - @Override - public Optional findStore(Long id) { - return storeRepository.findById(id); + public MissionQueryServiceImpl(MissionRepository missionRepository) { + this.missionRepository = missionRepository; } @Override - public List findStoresByNameAndScore(String name, Float score) { - List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); - - filteredStores.forEach(store -> System.out.println("Store: " + store)); - - return filteredStores; + public List getAvailableMissions(String regionName, Long cursor, Long memberId) { + return missionRepository.findMissions(regionName, cursor, memberId); } } \ No newline at end of file diff --git a/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java index aa9f932..d9b942d 100644 --- a/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java +++ b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryService.java @@ -1,12 +1,7 @@ package umc.spring.service.ReviewService; -import umc.spring.domain.Store; - -import java.util.List; -import java.util.Optional; +import umc.spring.domain.Review; public interface ReviewQueryService { - - Optional findStore(Long id); - List findStoresByNameAndScore(String name, Float score); + Review saveReview(Long memberId, Long storeId, String content, float rating); } diff --git a/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java index 8ea2463..4df519c 100644 --- a/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java +++ b/spring/src/main/java/umc/spring/service/ReviewService/ReviewQueryServiceImpl.java @@ -1,32 +1,46 @@ package umc.spring.service.ReviewService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Member; +import umc.spring.domain.Review; import umc.spring.domain.Store; +import umc.spring.repository.MemberRepository.MemberRepository; +import umc.spring.repository.ReviewRepository.ReviewRepository; import umc.spring.repository.StoreRepository.StoreRepository; -import java.util.List; -import java.util.Optional; +import java.time.LocalDateTime; @Service -@RequiredArgsConstructor -@Transactional(readOnly = true) +@Transactional public class ReviewQueryServiceImpl implements ReviewQueryService { + private final ReviewRepository reviewRepository; + private final MemberRepository memberRepository; private final StoreRepository storeRepository; - @Override - public Optional findStore(Long id) { - return storeRepository.findById(id); + public ReviewQueryServiceImpl(ReviewRepository reviewRepository, MemberRepository memberRepository, StoreRepository storeRepository) { + this.reviewRepository = reviewRepository; + this.memberRepository = memberRepository; + this.storeRepository = storeRepository; } @Override - public List findStoresByNameAndScore(String name, Float score) { - List filteredStores = storeRepository.dynamicQueryWithBooleanBuilder(name, score); - - filteredStores.forEach(store -> System.out.println("Store: " + store)); - - return filteredStores; + public Review saveReview(Long memberId, Long storeId, String content, float rating) { + // Member와 Store 엔티티 조회 + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("Member not found with ID: " + memberId)); + Store store = storeRepository.findById(storeId) + .orElseThrow(() -> new IllegalArgumentException("Store not found with ID: " + storeId)); + + // Review 생성 및 저장 + Review review = Review.builder() + .member(member) + .store(store) + .content(content) + .rating(rating) + .build(); + + return reviewRepository.save(review); } -} \ No newline at end of file +} From 0bb50bf3f561129e9137a51dad06d2bc48bb30b3 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Fri, 8 Nov 2024 02:30:24 +0900 Subject: [PATCH 13/13] :bug:mission(#6) : delete using constructor in MemberMission --- .../MemberMissionRepositoryImpl.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java index 0207ed9..3ec02ca 100644 --- a/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java +++ b/spring/src/main/java/umc/spring/repository/MemberMissionRepository/MemberMissionRepositoryImpl.java @@ -39,13 +39,7 @@ public Page findMissionsByMemberAndStatus(Long memberId, String s } List result = jpaQueryFactory - .select(new QMemberMission( - mission.id, - store.name, - mission.reward, - mission.missionSpec, - memberMission.status - )) + .select(memberMission) .from(member) .join(memberMission).on(member.id.eq(memberMission.member.id)) .join(mission).on(memberMission.mission.id.eq(mission.id))