From de9d066457aca8784036d82cf2f22c442b88f6cc Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 02:56:17 +0900 Subject: [PATCH 1/8] =?UTF-8?q?docs:=20README.md=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ .../service/rest/major/AdminMajorQuestionMakeService.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2fa19b1 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# 프로젝트 주요 목표 + +## 유지 보수성 +- diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/AdminMajorQuestionMakeService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/AdminMajorQuestionMakeService.java index f9f6fc0..3914bee 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/AdminMajorQuestionMakeService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/AdminMajorQuestionMakeService.java @@ -17,7 +17,7 @@ List makeMultipleChoiceQuestions( List requestNormalQuestionDto); MajorMultipleChoiceQuestion makeMultipleChoiceQuestion( - RequestMakeMultipleChoiceQuestionDto requestNormalQuestionDto) throws DuplicateQuestionContentException, DuplicateQuestionContentException; + RequestMakeMultipleChoiceQuestionDto requestNormalQuestionDto) throws DuplicateQuestionContentException; List makeDescriptiveQuestions( List requestNormalQuestionDto From 0fe56190d9eba20a2488f16f252432e89b72482b Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 03:45:53 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20ChoiceProvider=EB=A5=BC=20Choic?= =?UTF-8?q?eBehavior=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 객관식 문제가 하는 행동을 정의하는 인터페이스 --- .../persistence/question/domain/common/ChoiceBehavior.java | 7 +++++++ .../persistence/question/domain/common/ChoiceProvider.java | 7 ------- .../domain/license/LicenseMultipleChoiceQuestion.java | 5 +++-- .../question/domain/major/MajorMultipleChoiceQuestion.java | 4 ++-- .../querydsl/LevelsAndCategoryBooleanBuilder.java | 1 - 5 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java delete mode 100644 persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceProvider.java diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java b/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java new file mode 100644 index 0000000..449e715 --- /dev/null +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java @@ -0,0 +1,7 @@ +package com.comssa.persistence.question.domain.common; + +import java.util.List; + +public interface ChoiceBehavior { + List getQuestionChoices(); +} diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceProvider.java b/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceProvider.java deleted file mode 100644 index ab4641b..0000000 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.comssa.persistence.question.domain.common; - -import java.util.List; - -public interface ChoiceProvider { - List getQuestionChoices(); -} diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java index db61aef..df57acd 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java @@ -1,6 +1,6 @@ package com.comssa.persistence.question.domain.license; -import com.comssa.persistence.question.domain.common.ChoiceProvider; +import com.comssa.persistence.question.domain.common.ChoiceBehavior; import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.common.QuestionLevel; @@ -27,7 +27,7 @@ @NoArgsConstructor @ToString @DiscriminatorValue("LM") -public class LicenseMultipleChoiceQuestion extends Question implements ChoiceProvider { +public class LicenseMultipleChoiceQuestion extends Question implements ChoiceBehavior { @Enumerated(value = EnumType.STRING) protected LicenseCategory licenseCategory; @@ -54,6 +54,7 @@ public static LicenseMultipleChoiceQuestion makeWithDto( return licenseMultipleChoiceQuestion; } + public static LicenseMultipleChoiceQuestion makeForTest(String test) { LicenseMultipleChoiceQuestion licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.builder() .id(1L) diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java index 1c17668..d09eee2 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java @@ -1,6 +1,6 @@ package com.comssa.persistence.question.domain.major; -import com.comssa.persistence.question.domain.common.ChoiceProvider; +import com.comssa.persistence.question.domain.common.ChoiceBehavior; import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.common.QuestionLevel; @@ -23,7 +23,7 @@ @NoArgsConstructor @ToString @DiscriminatorValue("MM") -public class MajorMultipleChoiceQuestion extends Question implements ChoiceProvider { +public class MajorMultipleChoiceQuestion extends Question implements ChoiceBehavior { public boolean canBeShortAnswered; @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java index ed23219..3dd35b3 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java @@ -27,7 +27,6 @@ default BooleanBuilder whereCategoriesAndLevels( if (questionLevels != null && !questionLevels.isEmpty()) { condition.and(question.questionLevel.in(questionLevels)); } - return condition; } } From 5b74f34b5737c76415b9932e69f041a9dbfcc82e Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 04:33:45 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20ResponseQuestionDto=EA=B0=80,?= =?UTF-8?q?=20=20=EB=AC=B8=EC=A0=9C=20=EA=B5=AC=ED=98=84=EC=B2=B4=EA=B0=80?= =?UTF-8?q?=20=EC=95=84=EB=8B=8C=20=EB=AC=B8=EC=A0=9C=EC=9D=98=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4(=EA=B0=9D=EA=B4=80?= =?UTF-8?q?=EC=8B=9D,=20=EC=84=9C=EC=88=A0=ED=98=95)=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EB=B0=98=ED=99=98=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../license/AdminLicenseQuestionControllerTest.java | 2 +- .../question/domain/common/ChoiceBehavior.java | 4 ++-- .../license/LicenseMultipleChoiceQuestion.java | 2 +- .../domain/major/MajorMultipleChoiceQuestion.java | 2 +- .../response/ResponseMultipleChoiceQuestionDto.kt | 13 +++---------- .../dto/common/response/ResponseQuestionDto.kt | 6 ++---- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/application/src/test/java/com/comssa/api/question/license/AdminLicenseQuestionControllerTest.java b/application/src/test/java/com/comssa/api/question/license/AdminLicenseQuestionControllerTest.java index 762d8eb..00236fd 100644 --- a/application/src/test/java/com/comssa/api/question/license/AdminLicenseQuestionControllerTest.java +++ b/application/src/test/java/com/comssa/api/question/license/AdminLicenseQuestionControllerTest.java @@ -50,7 +50,7 @@ void setUp() { responseMultipleChoiceQuestionDtos = new ArrayList<>(); licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.makeForTest("test"); licenseMultipleChoiceQuestions.add(licenseMultipleChoiceQuestion); - responseMultipleChoiceQuestionDto = ResponseMultipleChoiceQuestionDto.forLicense(licenseMultipleChoiceQuestion); + responseMultipleChoiceQuestionDto = ResponseMultipleChoiceQuestionDto.from(licenseMultipleChoiceQuestion); responseMultipleChoiceQuestionDtos.add(responseMultipleChoiceQuestionDto); } diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java b/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java index 449e715..93bfa45 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/common/ChoiceBehavior.java @@ -2,6 +2,6 @@ import java.util.List; -public interface ChoiceBehavior { - List getQuestionChoices(); +public interface ChoiceBehavior { + List getQuestionChoices(); } diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java index df57acd..18116f3 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java @@ -27,7 +27,7 @@ @NoArgsConstructor @ToString @DiscriminatorValue("LM") -public class LicenseMultipleChoiceQuestion extends Question implements ChoiceBehavior { +public class LicenseMultipleChoiceQuestion extends Question implements ChoiceBehavior { @Enumerated(value = EnumType.STRING) protected LicenseCategory licenseCategory; diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java index d09eee2..3750106 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/major/MajorMultipleChoiceQuestion.java @@ -23,7 +23,7 @@ @NoArgsConstructor @ToString @DiscriminatorValue("MM") -public class MajorMultipleChoiceQuestion extends Question implements ChoiceBehavior { +public class MajorMultipleChoiceQuestion extends Question implements ChoiceBehavior { public boolean canBeShortAnswered; @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt index 629af56..234cb8e 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt +++ b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt @@ -1,8 +1,7 @@ package com.comssa.persistence.question.dto.common.response +import com.comssa.persistence.question.domain.common.ChoiceBehavior import com.comssa.persistence.question.domain.common.Question -import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion -import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion open class ResponseMultipleChoiceQuestionDto( val questionChoices: List, @@ -13,14 +12,8 @@ open class ResponseMultipleChoiceQuestionDto( ) { companion object { @JvmStatic - fun forLicense(question: LicenseMultipleChoiceQuestion): ResponseMultipleChoiceQuestionDto = - ResponseMultipleChoiceQuestionDto( - question = question, - questionChoices = question.questionChoices.map { ResponseQuestionChoiceDto.from(it) }, - ) - - @JvmStatic - fun forMajor(question: MajorMultipleChoiceQuestion): ResponseMultipleChoiceQuestionDto = + fun from(question: Q): ResponseMultipleChoiceQuestionDto + where Q : Question, Q : ChoiceBehavior = ResponseMultipleChoiceQuestionDto( question = question, questionChoices = question.questionChoices.map { ResponseQuestionChoiceDto.from(it) }, diff --git a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseQuestionDto.kt b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseQuestionDto.kt index 904dba1..5695883 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseQuestionDto.kt +++ b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseQuestionDto.kt @@ -1,11 +1,10 @@ package com.comssa.persistence.question.dto.common.response +import com.comssa.persistence.question.domain.common.ChoiceBehavior import com.comssa.persistence.question.domain.common.Question import com.comssa.persistence.question.domain.common.QuestionCategory import com.comssa.persistence.question.domain.common.QuestionLevel -import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion -import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion abstract class ResponseQuestionDto( question: Question, @@ -23,8 +22,7 @@ abstract class ResponseQuestionDto( @JvmStatic fun from(question: Question): R = when (question) { - is LicenseMultipleChoiceQuestion -> ResponseMultipleChoiceQuestionDto.forLicense(question) as R - is MajorMultipleChoiceQuestion -> ResponseMultipleChoiceQuestionDto.forMajor(question) as R + is ChoiceBehavior -> ResponseMultipleChoiceQuestionDto.from(question) as R is MajorDescriptiveQuestion -> ResponseDescriptiveQuestionDto.forMajor(question) as R else -> throw IllegalArgumentException("Unsupported question type: ${question.javaClass.name}") } From fbf38f841984658b0501a048a6c14cf9e1d15138 Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 17:29:50 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20QueryDslRepository=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **Filter.impl가 각 기능에 맞는 쿼리 메소드를 가지고 있고 QueryDslRepository가 이를 상속 (ex -MajorDescriptiveDslRepository extends MajorQuestionSearchFilter MajorQuestionSearchFilter는 전공 문제를 검색할때 사용하는 메소드를 모아놓은 인터페이스 - QueryDslRepsotory가 상속받던 BooleanBuilder인터페이스를 Filter가 상속받도록 수정 - QueryDslRepository는 Filter의 메소드를 호출하거나, 구현체의 QQuestion등을 직접 반환하는 것을 구현 --- README.md | 4 -- .../BasicQuestionSelectorService.java | 8 ++-- .../AdminLicenseQuestionGetService.java | 2 +- .../UserLicenseQuestionGetService.java | 2 +- ...dminMajorQuestionClassifiedGetService.java | 4 +- ...UserMajorQuestionClassifiedGetService.java | 8 ++-- .../LicenseMultipleChoiceQuestion.java | 1 + .../querydsl/CommonQuestionFilter.java | 13 ++++++ .../querydsl/ExternalQuestionFilter.java | 24 +++++++++++ .../querydsl/MajorQuestionSearchFilter.java | 33 ++++++++++++++ .../querydsl/QueryDslJpaQueryMaker.java | 8 ---- ...seMultipleChoiceQuestionDslRepository.java | 27 +++++++++--- .../MajorDescriptiveDslRepository.java | 29 +++++++++---- ...orMultipleChoiceQuestionDslRepository.java | 43 +++++++++++++------ .../QuestionCustomRepositoryImpl.java | 3 +- 15 files changed, 154 insertions(+), 55 deletions(-) delete mode 100644 README.md create mode 100644 persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java create mode 100644 persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java create mode 100644 persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ => impl}/LicenseMultipleChoiceQuestionDslRepository.java (67%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ => impl}/MajorDescriptiveDslRepository.java (57%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ => impl}/MajorMultipleChoiceQuestionDslRepository.java (58%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ => impl}/QuestionCustomRepositoryImpl.java (88%) diff --git a/README.md b/README.md deleted file mode 100644 index 2fa19b1..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# 프로젝트 주요 목표 - -## 유지 보수성 -- diff --git a/application/src/main/java/com/comssa/api/question/service/rest/common/implement/BasicQuestionSelectorService.java b/application/src/main/java/com/comssa/api/question/service/rest/common/implement/BasicQuestionSelectorService.java index a0b298f..9d3d666 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/common/implement/BasicQuestionSelectorService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/common/implement/BasicQuestionSelectorService.java @@ -8,8 +8,8 @@ import com.comssa.persistence.question.domain.license.LicenseCategory; import com.comssa.persistence.question.domain.license.LicenseSession; import com.comssa.persistence.question.repository.jpa.LicenseSessionRepository; -import com.comssa.persistence.question.repository.querydsl.LicenseMultipleChoiceQuestionDslRepository; -import com.comssa.persistence.question.repository.querydsl.MajorMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.LicenseMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.MajorMultipleChoiceQuestionDslRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -56,10 +56,10 @@ public List getLicenseSessions(LicenseCategory licenseCategory) public List getAllQuestions(List questionCategories, boolean multipleChoice) { List questions = new ArrayList<>(); if (multipleChoice) { - questions.addAll(licenseMultipleChoiceQuestionDslRepository.findAllWhereQuestionCategories( + questions.addAll(licenseMultipleChoiceQuestionDslRepository.findAllWhereCategories( questionCategories)); questions.addAll(majorMultipleChoiceQuestionDslRepository - .findAllWhereQuestionCategories( + .findAllWhereCategories( questionCategories)); } return questions; diff --git a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java index dfee091..4aab662 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java @@ -6,7 +6,7 @@ import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion; -import com.comssa.persistence.question.repository.querydsl.LicenseMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.LicenseMultipleChoiceQuestionDslRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/UserLicenseQuestionGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/UserLicenseQuestionGetService.java index 30e7d06..3d55ec4 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/UserLicenseQuestionGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/UserLicenseQuestionGetService.java @@ -6,7 +6,7 @@ import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion; -import com.comssa.persistence.question.repository.querydsl.LicenseMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.LicenseMultipleChoiceQuestionDslRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java index 670f3ed..1ad51cc 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java @@ -7,8 +7,8 @@ import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion; import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion; -import com.comssa.persistence.question.repository.querydsl.MajorDescriptiveDslRepository; -import com.comssa.persistence.question.repository.querydsl.MajorMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.MajorDescriptiveDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.MajorMultipleChoiceQuestionDslRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java index 2573ddd..85cebb0 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java @@ -8,8 +8,8 @@ import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion; import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion; import com.comssa.persistence.question.dto.major.request.RequestGetQuestionByCategoryAndLevelDto; -import com.comssa.persistence.question.repository.querydsl.MajorDescriptiveDslRepository; -import com.comssa.persistence.question.repository.querydsl.MajorMultipleChoiceQuestionDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.MajorDescriptiveDslRepository; +import com.comssa.persistence.question.repository.querydsl.impl.MajorMultipleChoiceQuestionDslRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -32,7 +32,7 @@ public class UserMajorQuestionClassifiedGetService implements MajorQuestionClass public Map> getApprovedClassifiedMajorMultipleChoiceQuestions( RequestGetQuestionByCategoryAndLevelDto requestGetQuestionByCategoryAndLevelDto) { List majorMultipleChoiceQuestions = majorMultipleChoiceQuestionDslRepository - .findAllWhereCategoriesAndLevelsAndIfApproved( + .findAllCategoriesAndLevelsAndIfApproved( requestGetQuestionByCategoryAndLevelDto.getQuestionCategories(), requestGetQuestionByCategoryAndLevelDto.getQuestionLevels(), true); @@ -50,7 +50,7 @@ public Map> getApprovedClassifiedMajorMultipleC public Map> getApprovedClassifiedDescriptiveQuestions( RequestGetQuestionByCategoryAndLevelDto dto) { List majorDescriptiveQuestions = majorDescriptiveQuestionDslRepository - .findWithCategoriesAndLevelsAndIfApproved( + .findAllCategoriesAndLevelsAndIfApproved( dto.getQuestionCategories(), dto.getQuestionLevels(), true diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java index 18116f3..30db5d3 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java @@ -36,6 +36,7 @@ public class LicenseMultipleChoiceQuestion extends Question implements ChoiceBeh private LicenseSession licenseSession; @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true) private List questionChoices; + public static LicenseMultipleChoiceQuestion makeWithDto( RequestMakeMultipleChoiceQuestionDto dto, diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java new file mode 100644 index 0000000..0924fff --- /dev/null +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java @@ -0,0 +1,13 @@ +package com.comssa.persistence.question.repository.querydsl; + +import com.comssa.persistence.question.domain.common.QQuestion; +import com.comssa.persistence.question.domain.common.Question; +import com.querydsl.jpa.impl.JPAQuery; + +public interface CommonQuestionFilter { + //구현체에서 Select할 테이블을 따로 구현 + JPAQuery getQuestion(); + + //구현체에서 QQuestion을 반환 + QQuestion getQuestionQClass(); +} diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java new file mode 100644 index 0000000..fe72982 --- /dev/null +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java @@ -0,0 +1,24 @@ +package com.comssa.persistence.question.repository.querydsl; + +import com.comssa.persistence.question.domain.common.Question; +import com.comssa.persistence.question.domain.common.QuestionCategory; +import com.querydsl.jpa.impl.JPAQuery; + +import java.util.List; + +public interface ExternalQuestionFilter + extends LevelsAndCategoryBooleanBuilder, CommonQuestionFilter { + // 구현체에서 구현해야하는 통일된 메소드 이름 + List findAllWhereCategories(List questionCategory); + + default JPAQuery selectWhereCategories(List questionCategories) { + return getQuestion() + .where( + whereCategoriesAndLevels( + getQuestionQClass(), + questionCategories, + null) + ); + } + +} diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java new file mode 100644 index 0000000..c0c66d5 --- /dev/null +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java @@ -0,0 +1,33 @@ +package com.comssa.persistence.question.repository.querydsl; + +import com.comssa.persistence.question.domain.common.Question; +import com.comssa.persistence.question.domain.common.QuestionCategory; +import com.comssa.persistence.question.domain.common.QuestionLevel; +import com.querydsl.jpa.impl.JPAQuery; + +import java.util.List; + +public interface MajorQuestionSearchFilter + extends LevelsAndCategoryBooleanBuilder, CommonQuestionFilter { + + List findAllCategoriesAndLevelsAndIfApproved( + List questionCategories, + List questionLevels, + boolean approved + ); + + + default JPAQuery selectWhereCategoriesAndLevelsAndIfApproved( + List questionCategories, + List questionLevels, + boolean approved) { + return getQuestion() + .where( + whereCategoriesAndLevels( + getQuestionQClass(), + questionCategories, + questionLevels) + .and(getQuestionQClass().ifApproved.eq(approved)) + ); + } +} diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java index c75e545..0ff774d 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java @@ -1,7 +1,6 @@ package com.comssa.persistence.question.repository.querydsl; -import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.EntityPathBase; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -22,13 +21,6 @@ public abstract class QueryDslJpaQueryMaker { protected final JPAQueryFactory jpaQueryFactory; - - public JPAQuery getQuery(EntityPathBase entityPathBase, - Predicate condition) { - return jpaQueryFactory.selectFrom(entityPathBase) - .where(condition); - } - public JPAQuery getQuery(EntityPathBase entityPathBase) { return jpaQueryFactory.selectFrom(entityPathBase); } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LicenseMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java similarity index 67% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LicenseMultipleChoiceQuestionDslRepository.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java index 21f1200..0733f0c 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LicenseMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java @@ -1,9 +1,13 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.impl; +import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion; import com.comssa.persistence.question.domain.license.QLicenseMultipleChoiceQuestion; +import com.comssa.persistence.question.repository.querydsl.ExternalQuestionFilter; +import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; @@ -12,7 +16,7 @@ @Repository public class LicenseMultipleChoiceQuestionDslRepository extends QueryDslJpaQueryMaker - implements LevelsAndCategoryBooleanBuilder { + implements ExternalQuestionFilter { public LicenseMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { super(jpaQueryFactory); @@ -48,14 +52,23 @@ public List findAllWhereLicenseSessionIdAndIfAppr .fetch(); } - public List findAllWhereQuestionCategories( + @Override + public List findAllWhereCategories( List questionCategories ) { - return getQuery( - question, - whereCategoriesAndLevels(question._super, questionCategories, null)) - .distinct() + return selectWhereCategories(questionCategories) .leftJoin(question.questionChoices).fetchJoin() .fetch(); } + + + @Override + public QQuestion getQuestionQClass() { + return question._super; + } + + @Override + public JPAQuery getQuestion() { + return getQuery(question); + } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorDescriptiveDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java similarity index 57% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorDescriptiveDslRepository.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java index ba78ea9..e9d1c12 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorDescriptiveDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java @@ -1,9 +1,13 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.impl; +import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.common.QuestionLevel; import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion; import com.comssa.persistence.question.domain.major.QMajorDescriptiveQuestion; +import com.comssa.persistence.question.repository.querydsl.MajorQuestionSearchFilter; +import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Service; @@ -12,30 +16,37 @@ @Service public class MajorDescriptiveDslRepository extends QueryDslJpaQueryMaker - implements LevelsAndCategoryBooleanBuilder { + implements MajorQuestionSearchFilter { private final QMajorDescriptiveQuestion question = QMajorDescriptiveQuestion.majorDescriptiveQuestion; public MajorDescriptiveDslRepository(JPAQueryFactory jpaQueryFactory) { super(jpaQueryFactory); } - public List findWithCategoriesAndLevelsAndIfApproved( + + @Override + public List findAllCategoriesAndLevelsAndIfApproved( List questionCategories, List questionLevels, boolean approved) { - return getQuery(question, whereCategoriesAndLevels( - question._super, - questionCategories, - questionLevels) - .and(question.ifApproved.eq(approved))) + return selectWhereCategoriesAndLevelsAndIfApproved(questionCategories, questionLevels, approved) .fetch(); } + @Override + public JPAQuery getQuestion() { + return null; + } + + @Override + public QQuestion getQuestionQClass() { + return null; + } + public List findAllOrderByIfApprovedAsc() { return getQuery(question) // 정렬 기준 .orderBy(question.ifApproved.asc()) .fetch(); } - } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java similarity index 58% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorMultipleChoiceQuestionDslRepository.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java index 253962f..bb5fe44 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java @@ -1,10 +1,15 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.impl; +import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.common.QuestionLevel; import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion; import com.comssa.persistence.question.domain.major.QMajorMultipleChoiceQuestion; +import com.comssa.persistence.question.repository.querydsl.ExternalQuestionFilter; +import com.comssa.persistence.question.repository.querydsl.MajorQuestionSearchFilter; +import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; @@ -13,7 +18,8 @@ @Repository public class MajorMultipleChoiceQuestionDslRepository extends QueryDslJpaQueryMaker - implements LevelsAndCategoryBooleanBuilder { + implements ExternalQuestionFilter, + MajorQuestionSearchFilter { public MajorMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { super(jpaQueryFactory); @@ -21,33 +27,42 @@ public MajorMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) private final QMajorMultipleChoiceQuestion question = QMajorMultipleChoiceQuestion.majorMultipleChoiceQuestion; - public List findAllWhereCategoriesAndLevelsAndIfApproved( + + @Override + public List findAllCategoriesAndLevelsAndIfApproved( List questionCategories, List questionLevels, - boolean approved - ) { - - return getQuery(question, whereCategoriesAndLevels( - question._super, + boolean approved) { + return selectWhereCategoriesAndLevelsAndIfApproved( questionCategories, - questionLevels - ).and(question.ifApproved.eq(approved))) + questionLevels, + approved + ) .distinct() .leftJoin(question.questionChoices).fetchJoin() .fetch(); } - public List findAllWhereQuestionCategories( + @Override + public List findAllWhereCategories( List questionCategories ) { - return getQuery( - question, - whereCategoriesAndLevels(question._super, questionCategories, null)) + return selectWhereCategories(questionCategories) .distinct() .leftJoin(question.questionChoices).fetchJoin() .fetch(); } + @Override + public JPAQuery getQuestion() { + return getQuery(question); + } + + @Override + public QQuestion getQuestionQClass() { + return question._super; + } + public List findAllOrderByIfApprovedAsc() { return getQuery(question) .distinct() diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QuestionCustomRepositoryImpl.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/QuestionCustomRepositoryImpl.java similarity index 88% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QuestionCustomRepositoryImpl.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/QuestionCustomRepositoryImpl.java index ea8a0c2..161cb21 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QuestionCustomRepositoryImpl.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/QuestionCustomRepositoryImpl.java @@ -1,9 +1,10 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.impl; import com.comssa.persistence.comment.domain.QComment; import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.Question; +import com.comssa.persistence.question.repository.querydsl.QuestionCustomRepository; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.Optional; From 92c5fddad2a82fb7bc3bf37205beeb281308078c Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 17:57:36 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20**Filter=EB=A5=BC=20**Query?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인터페이스마다 수행해야하는 쿼리가 정의되어있음으로 보다 표시성이 높은 이름으로 수정 --- .../LicenseMultipleChoiceQuestionDslRepository.java | 4 ++-- .../impl/MajorDescriptiveDslRepository.java | 9 ++++----- .../MajorMultipleChoiceQuestionDslRepository.java | 12 ++++++------ .../MajorQuestionSearchQuery.java} | 13 ++++++++++--- .../QuestionApiTransmissionQuery.java} | 7 ++++--- .../QuestionQuerySupport.java} | 4 ++-- .../LevelsAndCategoryBooleanBuilder.java | 2 +- 7 files changed, 29 insertions(+), 22 deletions(-) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{MajorQuestionSearchFilter.java => query/MajorQuestionSearchQuery.java} (62%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ExternalQuestionFilter.java => query/QuestionApiTransmissionQuery.java} (64%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{CommonQuestionFilter.java => query/QuestionQuerySupport.java} (71%) rename persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/{ => query/booleanbuilder}/LevelsAndCategoryBooleanBuilder.java (92%) diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java index 0733f0c..ca71adf 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java @@ -5,8 +5,8 @@ import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.license.LicenseMultipleChoiceQuestion; import com.comssa.persistence.question.domain.license.QLicenseMultipleChoiceQuestion; -import com.comssa.persistence.question.repository.querydsl.ExternalQuestionFilter; import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.comssa.persistence.question.repository.querydsl.query.QuestionApiTransmissionQuery; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; @@ -16,7 +16,7 @@ @Repository public class LicenseMultipleChoiceQuestionDslRepository extends QueryDslJpaQueryMaker - implements ExternalQuestionFilter { + implements QuestionApiTransmissionQuery { public LicenseMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { super(jpaQueryFactory); diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java index e9d1c12..118b825 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java @@ -5,8 +5,8 @@ import com.comssa.persistence.question.domain.common.QuestionLevel; import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion; import com.comssa.persistence.question.domain.major.QMajorDescriptiveQuestion; -import com.comssa.persistence.question.repository.querydsl.MajorQuestionSearchFilter; import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.comssa.persistence.question.repository.querydsl.query.MajorQuestionSearchQuery; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Service; @@ -16,7 +16,7 @@ @Service public class MajorDescriptiveDslRepository extends QueryDslJpaQueryMaker - implements MajorQuestionSearchFilter { + implements MajorQuestionSearchQuery { private final QMajorDescriptiveQuestion question = QMajorDescriptiveQuestion.majorDescriptiveQuestion; public MajorDescriptiveDslRepository(JPAQueryFactory jpaQueryFactory) { @@ -43,10 +43,9 @@ public QQuestion getQuestionQClass() { return null; } + @Override public List findAllOrderByIfApprovedAsc() { - return getQuery(question) - // 정렬 기준 - .orderBy(question.ifApproved.asc()) + return selectOrderByIfApprovedAsc() .fetch(); } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java index bb5fe44..d60c2de 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java @@ -6,9 +6,9 @@ import com.comssa.persistence.question.domain.common.QuestionLevel; import com.comssa.persistence.question.domain.major.MajorMultipleChoiceQuestion; import com.comssa.persistence.question.domain.major.QMajorMultipleChoiceQuestion; -import com.comssa.persistence.question.repository.querydsl.ExternalQuestionFilter; -import com.comssa.persistence.question.repository.querydsl.MajorQuestionSearchFilter; import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; +import com.comssa.persistence.question.repository.querydsl.query.MajorQuestionSearchQuery; +import com.comssa.persistence.question.repository.querydsl.query.QuestionApiTransmissionQuery; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; @@ -18,8 +18,8 @@ @Repository public class MajorMultipleChoiceQuestionDslRepository extends QueryDslJpaQueryMaker - implements ExternalQuestionFilter, - MajorQuestionSearchFilter { + implements QuestionApiTransmissionQuery, + MajorQuestionSearchQuery { public MajorMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { super(jpaQueryFactory); @@ -63,11 +63,11 @@ public QQuestion getQuestionQClass() { return question._super; } + @Override public List findAllOrderByIfApprovedAsc() { - return getQuery(question) + return selectOrderByIfApprovedAsc() .distinct() .leftJoin(question.questionChoices).fetchJoin() - .orderBy(question.ifApproved.asc()) .fetch(); } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java similarity index 62% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java index c0c66d5..fa507cd 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/MajorQuestionSearchFilter.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java @@ -1,14 +1,15 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.query; import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; import com.comssa.persistence.question.domain.common.QuestionLevel; +import com.comssa.persistence.question.repository.querydsl.query.booleanbuilder.LevelsAndCategoryBooleanBuilder; import com.querydsl.jpa.impl.JPAQuery; import java.util.List; -public interface MajorQuestionSearchFilter - extends LevelsAndCategoryBooleanBuilder, CommonQuestionFilter { +public interface MajorQuestionSearchQuery + extends LevelsAndCategoryBooleanBuilder, QuestionQuerySupport { List findAllCategoriesAndLevelsAndIfApproved( List questionCategories, @@ -16,6 +17,12 @@ List findAllCategoriesAndLevelsAndIfApproved( boolean approved ); + List findAllOrderByIfApprovedAsc(); + + default JPAQuery selectOrderByIfApprovedAsc() { + return getQuestion() + .orderBy(getQuestionQClass().ifApproved.asc()); + } default JPAQuery selectWhereCategoriesAndLevelsAndIfApproved( List questionCategories, diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java similarity index 64% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java index fe72982..8954fe7 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/ExternalQuestionFilter.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java @@ -1,13 +1,14 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.query; import com.comssa.persistence.question.domain.common.Question; import com.comssa.persistence.question.domain.common.QuestionCategory; +import com.comssa.persistence.question.repository.querydsl.query.booleanbuilder.LevelsAndCategoryBooleanBuilder; import com.querydsl.jpa.impl.JPAQuery; import java.util.List; -public interface ExternalQuestionFilter - extends LevelsAndCategoryBooleanBuilder, CommonQuestionFilter { +public interface QuestionApiTransmissionQuery + extends LevelsAndCategoryBooleanBuilder, QuestionQuerySupport { // 구현체에서 구현해야하는 통일된 메소드 이름 List findAllWhereCategories(List questionCategory); diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java similarity index 71% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java index 0924fff..24f02f9 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/CommonQuestionFilter.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java @@ -1,10 +1,10 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.query; import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.Question; import com.querydsl.jpa.impl.JPAQuery; -public interface CommonQuestionFilter { +public interface QuestionQuerySupport { //구현체에서 Select할 테이블을 따로 구현 JPAQuery getQuestion(); diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java similarity index 92% rename from persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java rename to persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java index 3dd35b3..376d38f 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/LevelsAndCategoryBooleanBuilder.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java @@ -1,4 +1,4 @@ -package com.comssa.persistence.question.repository.querydsl; +package com.comssa.persistence.question.repository.querydsl.query.booleanbuilder; import com.comssa.persistence.question.domain.common.QQuestion; import com.comssa.persistence.question.domain.common.QuestionCategory; From f35c8ff467326d9628f231abe5f39e8b07bb41d1 Mon Sep 17 00:00:00 2001 From: starwook Date: Mon, 30 Dec 2024 21:23:02 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20MajorDescriptiveDslRepository?= =?UTF-8?q?=EA=B0=80=20MajorQuestionSearchQuery=EC=9D=98=20default=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../querydsl/QueryDslJpaQueryMaker.java | 1 + .../impl/MajorDescriptiveDslRepository.java | 22 ++----------------- .../query/MajorQuestionSearchQuery.java | 14 +++++++++--- .../query/QuestionApiTransmissionQuery.java | 7 ++++-- .../querydsl/query/QuestionQuerySupport.java | 3 ++- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java index 0ff774d..75eb7e5 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/QueryDslJpaQueryMaker.java @@ -24,4 +24,5 @@ public abstract class QueryDslJpaQueryMaker { public JPAQuery getQuery(EntityPathBase entityPathBase) { return jpaQueryFactory.selectFrom(entityPathBase); } + } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java index 118b825..bed4ce9 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorDescriptiveDslRepository.java @@ -1,8 +1,6 @@ package com.comssa.persistence.question.repository.querydsl.impl; import com.comssa.persistence.question.domain.common.QQuestion; -import com.comssa.persistence.question.domain.common.QuestionCategory; -import com.comssa.persistence.question.domain.common.QuestionLevel; import com.comssa.persistence.question.domain.major.MajorDescriptiveQuestion; import com.comssa.persistence.question.domain.major.QMajorDescriptiveQuestion; import com.comssa.persistence.question.repository.querydsl.QueryDslJpaQueryMaker; @@ -11,8 +9,6 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Service; -import java.util.List; - @Service public class MajorDescriptiveDslRepository extends QueryDslJpaQueryMaker @@ -24,28 +20,14 @@ public MajorDescriptiveDslRepository(JPAQueryFactory jpaQueryFactory) { } - @Override - public List findAllCategoriesAndLevelsAndIfApproved( - List questionCategories, - List questionLevels, - boolean approved) { - return selectWhereCategoriesAndLevelsAndIfApproved(questionCategories, questionLevels, approved) - .fetch(); - } - @Override public JPAQuery getQuestion() { - return null; + return getQuery(question); } @Override public QQuestion getQuestionQClass() { - return null; + return question._super; } - @Override - public List findAllOrderByIfApprovedAsc() { - return selectOrderByIfApprovedAsc() - .fetch(); - } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java index fa507cd..1f528ff 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java @@ -11,13 +11,21 @@ public interface MajorQuestionSearchQuery extends LevelsAndCategoryBooleanBuilder, QuestionQuerySupport { - List findAllCategoriesAndLevelsAndIfApproved( + default List findAllCategoriesAndLevelsAndIfApproved( List questionCategories, List questionLevels, boolean approved - ); + ) { + return selectWhereCategoriesAndLevelsAndIfApproved(questionCategories, questionLevels, approved) + .fetch(); + } + + default List findAllOrderByIfApprovedAsc() { + return selectOrderByIfApprovedAsc() + .fetch(); + } - List findAllOrderByIfApprovedAsc(); + ; default JPAQuery selectOrderByIfApprovedAsc() { return getQuestion() diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java index 8954fe7..4130349 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionApiTransmissionQuery.java @@ -10,7 +10,11 @@ public interface QuestionApiTransmissionQuery extends LevelsAndCategoryBooleanBuilder, QuestionQuerySupport { // 구현체에서 구현해야하는 통일된 메소드 이름 - List findAllWhereCategories(List questionCategory); + + default List findAllWhereCategories(List questionCategories) { + return selectWhereCategories(questionCategories) + .fetch(); + } default JPAQuery selectWhereCategories(List questionCategories) { return getQuestion() @@ -21,5 +25,4 @@ default JPAQuery selectWhereCategories(List questionCategor null) ); } - } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java index 24f02f9..a65c457 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java @@ -5,8 +5,9 @@ import com.querydsl.jpa.impl.JPAQuery; public interface QuestionQuerySupport { - //구현체에서 Select할 테이블을 따로 구현 + //구현체에서 Select할 테이블을 선택 JPAQuery getQuestion(); + //구현체에서 QQuestion을 반환 QQuestion getQuestionQClass(); From 560bac0c05b0ddc35952275eafa7d40965cdefba Mon Sep 17 00:00:00 2001 From: starwook Date: Tue, 31 Dec 2024 01:10:06 +0900 Subject: [PATCH 7/8] =?UTF-8?q?style:=20=EC=BD=94=EB=94=A9=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminLicenseQuestionGetService.java | 28 ++-- ...dminMajorQuestionClassifiedGetService.java | 42 +++--- .../BasicAdminMajorQuestionMakeService.java | 124 +++++++++--------- ...UserMajorQuestionClassifiedGetService.java | 68 +++++----- .../LicenseMultipleChoiceQuestion.java | 90 ++++++------- ...seMultipleChoiceQuestionDslRepository.java | 96 +++++++------- ...orMultipleChoiceQuestionDslRepository.java | 91 +++++++------ .../query/MajorQuestionSearchQuery.java | 2 - .../querydsl/query/QuestionQuerySupport.java | 10 +- .../LevelsAndCategoryBooleanBuilder.java | 40 +++--- 10 files changed, 294 insertions(+), 297 deletions(-) diff --git a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java index 4aab662..fb74cdf 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/license/implement/AdminLicenseQuestionGetService.java @@ -19,19 +19,19 @@ @RequiredArgsConstructor public class AdminLicenseQuestionGetService implements LicenseQuestionGetService { - private final LicenseMultipleChoiceQuestionDslRepository licenseMultipleChoiceQuestionDslRepository; - private final QuestionClassifyByCategoryService questionClassifyByCategoryService; + private final LicenseMultipleChoiceQuestionDslRepository licenseMultipleChoiceQuestionDslRepository; + private final QuestionClassifyByCategoryService questionClassifyByCategoryService; - /** - * 관리자 조회시 허용 여부와 관련 없이 모든 문제를 가져온다. - * 문제지도 섞지 않는다. - * 허용 여부 순대로 섞는다 - */ - @Override - public Map> getClassifiedLicenseMultipleChoiceQuestion( - Long sessionId) { - List licenseMultipleChoiceQuestions = licenseMultipleChoiceQuestionDslRepository - .findAllWhereLicenseSessionId(sessionId); - return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(licenseMultipleChoiceQuestions); - } + /** + * 관리자 조회시 허용 여부와 관련 없이 모든 문제를 가져온다. + * 문제지도 섞지 않는다. + * 허용 여부 순대로 섞는다 + */ + @Override + public Map> getClassifiedLicenseMultipleChoiceQuestion( + Long sessionId) { + List licenseMultipleChoiceQuestions = licenseMultipleChoiceQuestionDslRepository + .findAllWhereLicenseSessionId(sessionId); + return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(licenseMultipleChoiceQuestions); + } } diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java index 1ad51cc..9fb7237 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionClassifiedGetService.java @@ -20,27 +20,27 @@ @RequiredArgsConstructor @Transactional public class BasicAdminMajorQuestionClassifiedGetService implements AdminMajorQuestionClassifiedGetService { - private final QuestionClassifyByCategoryService questionClassifyByCategoryService; - private final MajorDescriptiveDslRepository majorDescriptiveQuestionChooseRepository; - private final MajorMultipleChoiceQuestionDslRepository majorMultipleChoiceQuestionDslRepository; + private final QuestionClassifyByCategoryService questionClassifyByCategoryService; + private final MajorDescriptiveDslRepository majorDescriptiveQuestionChooseRepository; + private final MajorMultipleChoiceQuestionDslRepository majorMultipleChoiceQuestionDslRepository; - /** - * 관리자가 조회시 Approve됐는지 기준으로 정렬되며(false인 것부터), - * 이후엔 객관식 -> 주관식으로 정렬된다. - * - * @return - */ - @Override - public Map> getClassifiedAllMajorMultipleChoiceQuestions() { - List majorMultipleChoiceQuestions = majorMultipleChoiceQuestionDslRepository - .findAllOrderByIfApprovedAsc(); - return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorMultipleChoiceQuestions); - } + /** + * 관리자가 조회시 Approve됐는지 기준으로 정렬되며(false인 것부터), + * 이후엔 객관식 -> 주관식으로 정렬된다. + * + * @return + */ + @Override + public Map> getClassifiedAllMajorMultipleChoiceQuestions() { + List majorMultipleChoiceQuestions = majorMultipleChoiceQuestionDslRepository + .findAllOrderByIfApprovedAsc(); + return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorMultipleChoiceQuestions); + } - @Override - public Map> getClassifiedAllMajorDescriptiveQuestions() { - List majorDescriptiveQuestions = - majorDescriptiveQuestionChooseRepository.findAllOrderByIfApprovedAsc(); - return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorDescriptiveQuestions); - } + @Override + public Map> getClassifiedAllMajorDescriptiveQuestions() { + List majorDescriptiveQuestions = + majorDescriptiveQuestionChooseRepository.findAllOrderByIfApprovedAsc(); + return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorDescriptiveQuestions); + } } diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionMakeService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionMakeService.java index ef2f13f..4c8eab5 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionMakeService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/BasicAdminMajorQuestionMakeService.java @@ -22,74 +22,74 @@ @Transactional public class BasicAdminMajorQuestionMakeService implements AdminMajorQuestionMakeService { - private final QuestionRepository questionRepository; - private final MajorMultipleChoiceQuestionRepository majorMultipleChoiceQuestionRepository; - private final QuestionChoiceService questionChoiceService; - private final DuplicateQuestionDetector duplicateQuestionDetector; + private final QuestionRepository questionRepository; + private final MajorMultipleChoiceQuestionRepository majorMultipleChoiceQuestionRepository; + private final QuestionChoiceService questionChoiceService; + private final DuplicateQuestionDetector duplicateQuestionDetector; - /** - * 리스트로 생성 - */ - @Override - public List makeMultipleChoiceQuestions( - List requestDtos) { - // 중복되지 않은 질문을 필터링하여 저장 - return requestDtos.stream() - .filter(this::isNotDuplicateQuestion) - .map(this::saveMajorMultipleChoiceQuestion) - .collect(Collectors.toList()); - } + /** + * 리스트로 생성 + */ + @Override + public List makeMultipleChoiceQuestions( + List requestDtos) { + // 중복되지 않은 질문을 필터링하여 저장 + return requestDtos.stream() + .filter(this::isNotDuplicateQuestion) + .map(this::saveMajorMultipleChoiceQuestion) + .collect(Collectors.toList()); + } - /** - * 단일 생성 - */ - @Override - public MajorMultipleChoiceQuestion makeMultipleChoiceQuestion( - RequestMakeMultipleChoiceQuestionDto requestDto) throws DuplicateQuestionContentException { - if (!isNotDuplicateQuestion(requestDto)) { - throw new DuplicateQuestionContentException(); - } - return saveMajorMultipleChoiceQuestion(requestDto); - } + /** + * 단일 생성 + */ + @Override + public MajorMultipleChoiceQuestion makeMultipleChoiceQuestion( + RequestMakeMultipleChoiceQuestionDto requestDto) throws DuplicateQuestionContentException { + if (!isNotDuplicateQuestion(requestDto)) { + throw new DuplicateQuestionContentException(); + } + return saveMajorMultipleChoiceQuestion(requestDto); + } - @Override - public List makeDescriptiveQuestions( - List requestNormalQuestionDto) { + @Override + public List makeDescriptiveQuestions( + List requestNormalQuestionDto) { - return requestNormalQuestionDto.stream() - .map(this::saveMajorDescriptiveQuestion) - .collect(Collectors.toList()); - } + return requestNormalQuestionDto.stream() + .map(this::saveMajorDescriptiveQuestion) + .collect(Collectors.toList()); + } - /** - * 중복되지 않은 질문인지 확인하는 메서드 - * 매번 DB에서 새롭게 조회 후 검증한다.(DTO 자체의 중복된 데이터) - */ - private boolean isNotDuplicateQuestion(RequestMakeMultipleChoiceQuestionDto requestDto) { - return majorMultipleChoiceQuestionRepository.findAll().stream() - .noneMatch(existingQuestion -> duplicateQuestionDetector.isQuestionDuplicate( - existingQuestion.getContent(), requestDto.getContent())); - } + /** + * 중복되지 않은 질문인지 확인하는 메서드 + * 매번 DB에서 새롭게 조회 후 검증한다.(DTO 자체의 중복된 데이터) + */ + private boolean isNotDuplicateQuestion(RequestMakeMultipleChoiceQuestionDto requestDto) { + return majorMultipleChoiceQuestionRepository.findAll().stream() + .noneMatch(existingQuestion -> duplicateQuestionDetector.isQuestionDuplicate( + existingQuestion.getContent(), requestDto.getContent())); + } - /** - * 새로운 질문을 저장하고 선택지를 저장하는 메서드 - */ - private MajorMultipleChoiceQuestion saveMajorMultipleChoiceQuestion( - RequestMakeMultipleChoiceQuestionDto requestDto) { - MajorMultipleChoiceQuestion question = MajorMultipleChoiceQuestion.makeWithDto(requestDto); - questionRepository.save(question); - questionChoiceService.saveWith(requestDto, question); - return question; - } + /** + * 새로운 질문을 저장하고 선택지를 저장하는 메서드 + */ + private MajorMultipleChoiceQuestion saveMajorMultipleChoiceQuestion( + RequestMakeMultipleChoiceQuestionDto requestDto) { + MajorMultipleChoiceQuestion question = MajorMultipleChoiceQuestion.makeWithDto(requestDto); + questionRepository.save(question); + questionChoiceService.saveWith(requestDto, question); + return question; + } - private MajorDescriptiveQuestion saveMajorDescriptiveQuestion( - RequestMakeMajorDescriptiveQuestionDto requestDto - ) { - MajorDescriptiveQuestion question = MajorDescriptiveQuestion.makeWithDto( - requestDto - ); - questionRepository.save(question); - return question; - } + private MajorDescriptiveQuestion saveMajorDescriptiveQuestion( + RequestMakeMajorDescriptiveQuestionDto requestDto + ) { + MajorDescriptiveQuestion question = MajorDescriptiveQuestion.makeWithDto( + requestDto + ); + questionRepository.save(question); + return question; + } } diff --git a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java index 85cebb0..bba3ae7 100644 --- a/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java +++ b/application/src/main/java/com/comssa/api/question/service/rest/major/implement/UserMajorQuestionClassifiedGetService.java @@ -20,41 +20,41 @@ @Service @RequiredArgsConstructor public class UserMajorQuestionClassifiedGetService implements MajorQuestionClassifiedGetService { - private final MajorMultipleChoiceQuestionDslRepository majorMultipleChoiceQuestionDslRepository; - private final QuestionClassifyByCategoryService questionClassifyByCategoryService; - private final MajorDescriptiveDslRepository majorDescriptiveQuestionDslRepository; + private final MajorMultipleChoiceQuestionDslRepository majorMultipleChoiceQuestionDslRepository; + private final QuestionClassifyByCategoryService questionClassifyByCategoryService; + private final MajorDescriptiveDslRepository majorDescriptiveQuestionDslRepository; - /** - * 분야, 난이도 파라미터로 문제를 조회하는 경우 - 객관식. - * 문제 선택지들을 섞어준다. - */ - @Override - public Map> getApprovedClassifiedMajorMultipleChoiceQuestions( - RequestGetQuestionByCategoryAndLevelDto requestGetQuestionByCategoryAndLevelDto) { - List majorMultipleChoiceQuestions = majorMultipleChoiceQuestionDslRepository - .findAllCategoriesAndLevelsAndIfApproved( - requestGetQuestionByCategoryAndLevelDto.getQuestionCategories(), - requestGetQuestionByCategoryAndLevelDto.getQuestionLevels(), - true); - for (MajorMultipleChoiceQuestion question : majorMultipleChoiceQuestions) { - Collections.shuffle(question.getQuestionChoices()); - } - return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorMultipleChoiceQuestions); - } + /** + * 분야, 난이도 파라미터로 문제를 조회하는 경우 - 객관식. + * 문제 선택지들을 섞어준다. + */ + @Override + public Map> getApprovedClassifiedMajorMultipleChoiceQuestions( + RequestGetQuestionByCategoryAndLevelDto requestGetQuestionByCategoryAndLevelDto) { + List majorMultipleChoiceQuestions = majorMultipleChoiceQuestionDslRepository + .findAllCategoriesAndLevelsAndIfApproved( + requestGetQuestionByCategoryAndLevelDto.getQuestionCategories(), + requestGetQuestionByCategoryAndLevelDto.getQuestionLevels(), + true); + for (MajorMultipleChoiceQuestion question : majorMultipleChoiceQuestions) { + Collections.shuffle(question.getQuestionChoices()); + } + return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorMultipleChoiceQuestions); + } - /** - * 분야, 난이도 파라미터로 문제를 조회하는 경우 - 서술형 - */ - @Override - public Map> getApprovedClassifiedDescriptiveQuestions( - RequestGetQuestionByCategoryAndLevelDto dto) { - List majorDescriptiveQuestions = majorDescriptiveQuestionDslRepository - .findAllCategoriesAndLevelsAndIfApproved( - dto.getQuestionCategories(), - dto.getQuestionLevels(), - true - ); - return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorDescriptiveQuestions); - } + /** + * 분야, 난이도 파라미터로 문제를 조회하는 경우 - 서술형 + */ + @Override + public Map> getApprovedClassifiedDescriptiveQuestions( + RequestGetQuestionByCategoryAndLevelDto dto) { + List majorDescriptiveQuestions = majorDescriptiveQuestionDslRepository + .findAllCategoriesAndLevelsAndIfApproved( + dto.getQuestionCategories(), + dto.getQuestionLevels(), + true + ); + return questionClassifyByCategoryService.classifyQuestionByCategoryOrdered(majorDescriptiveQuestions); + } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java index 30db5d3..fa87496 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java +++ b/persistence/src/main/java/com/comssa/persistence/question/domain/license/LicenseMultipleChoiceQuestion.java @@ -29,54 +29,54 @@ @DiscriminatorValue("LM") public class LicenseMultipleChoiceQuestion extends Question implements ChoiceBehavior { - @Enumerated(value = EnumType.STRING) - protected LicenseCategory licenseCategory; - @ManyToOne - @JoinColumn(name = "license_session_id") - private LicenseSession licenseSession; - @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true) - private List questionChoices; - + @Enumerated(value = EnumType.STRING) + protected LicenseCategory licenseCategory; + @ManyToOne + @JoinColumn(name = "license_session_id") + private LicenseSession licenseSession; + @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true) + private List questionChoices; - public static LicenseMultipleChoiceQuestion makeWithDto( - RequestMakeMultipleChoiceQuestionDto dto, - LicenseSession licenseSession, - LicenseCategory licenseCategory) { - LicenseMultipleChoiceQuestion licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.builder() - .content(dto.getContent()) - .questionCategory(dto.getQuestionCategory()) - .questionLevel(dto.getQuestionLevel()) - .description(dto.getDescription()) - .imageUrl(null) - .licenseSession(licenseSession) - .licenseCategory(licenseCategory) - .build(); - licenseMultipleChoiceQuestion.initDefaults(); - return licenseMultipleChoiceQuestion; - } + public static LicenseMultipleChoiceQuestion makeWithDto( + RequestMakeMultipleChoiceQuestionDto dto, + LicenseSession licenseSession, + LicenseCategory licenseCategory) { + LicenseMultipleChoiceQuestion licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.builder() + .content(dto.getContent()) + .questionCategory(dto.getQuestionCategory()) + .questionLevel(dto.getQuestionLevel()) + .description(dto.getDescription()) + .imageUrl(null) + .licenseSession(licenseSession) + .licenseCategory(licenseCategory) + .build(); + licenseMultipleChoiceQuestion.initDefaults(); + return licenseMultipleChoiceQuestion; + } - public static LicenseMultipleChoiceQuestion makeForTest(String test) { - LicenseMultipleChoiceQuestion licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.builder() - .id(1L) - .content(test) - .questionCategory(QuestionCategory.ALGORITHM) - .questionLevel(QuestionLevel.LOW) - .description(test) - .imageUrl(null) - .licenseSession(LicenseSession.builder() - .licenseCategory(LicenseCategory.SQLD) - .content(test) - .build()) - .licenseCategory(LicenseCategory.SQLD) - .build(); - licenseMultipleChoiceQuestion.initDefaults(); - return licenseMultipleChoiceQuestion; - } - @Override - public void initDefaults() { - this.questionChoices = new ArrayList<>(); - } + public static LicenseMultipleChoiceQuestion makeForTest(String test) { + LicenseMultipleChoiceQuestion licenseMultipleChoiceQuestion = LicenseMultipleChoiceQuestion.builder() + .id(1L) + .content(test) + .questionCategory(QuestionCategory.ALGORITHM) + .questionLevel(QuestionLevel.LOW) + .description(test) + .imageUrl(null) + .licenseSession(LicenseSession.builder() + .licenseCategory(LicenseCategory.SQLD) + .content(test) + .build()) + .licenseCategory(LicenseCategory.SQLD) + .build(); + licenseMultipleChoiceQuestion.initDefaults(); + return licenseMultipleChoiceQuestion; + } + + @Override + public void initDefaults() { + this.questionChoices = new ArrayList<>(); + } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java index ca71adf..13473bb 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/LicenseMultipleChoiceQuestionDslRepository.java @@ -15,60 +15,60 @@ @Repository public class LicenseMultipleChoiceQuestionDslRepository - extends QueryDslJpaQueryMaker - implements QuestionApiTransmissionQuery { + extends QueryDslJpaQueryMaker + implements QuestionApiTransmissionQuery { - public LicenseMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { - super(jpaQueryFactory); - } + private final QLicenseMultipleChoiceQuestion question = QLicenseMultipleChoiceQuestion + .licenseMultipleChoiceQuestion; - private final QLicenseMultipleChoiceQuestion question = QLicenseMultipleChoiceQuestion - .licenseMultipleChoiceQuestion; + public LicenseMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { + super(jpaQueryFactory); + } - public List findAllWhereLicenseSessionId( - Long licenseId - ) { - return getQuery(question) - .where( - question.licenseSession.id.eq(licenseId) - ) - .distinct() - .leftJoin(question.questionChoices).fetchJoin() - .orderBy(question.ifApproved.asc()) - .fetch(); - } + public List findAllWhereLicenseSessionId( + Long licenseId + ) { + return getQuery(question) + .where( + question.licenseSession.id.eq(licenseId) + ) + .distinct() + .leftJoin(question.questionChoices).fetchJoin() + .orderBy(question.ifApproved.asc()) + .fetch(); + } - public List findAllWhereLicenseSessionIdAndIfApproved( - Long licenseId, - boolean ifApproved - ) { - return getQuery(question) - .where( - question.licenseSession.id.eq(licenseId) - .and(question.ifApproved.eq(ifApproved)) - ) - .distinct() - .leftJoin(question.questionChoices).fetchJoin() - .fetch(); - } + public List findAllWhereLicenseSessionIdAndIfApproved( + Long licenseId, + boolean ifApproved + ) { + return getQuery(question) + .where( + question.licenseSession.id.eq(licenseId) + .and(question.ifApproved.eq(ifApproved)) + ) + .distinct() + .leftJoin(question.questionChoices).fetchJoin() + .fetch(); + } - @Override - public List findAllWhereCategories( - List questionCategories - ) { - return selectWhereCategories(questionCategories) - .leftJoin(question.questionChoices).fetchJoin() - .fetch(); - } + @Override + public List findAllWhereCategories( + List questionCategories + ) { + return selectWhereCategories(questionCategories) + .leftJoin(question.questionChoices).fetchJoin() + .fetch(); + } - @Override - public QQuestion getQuestionQClass() { - return question._super; - } + @Override + public QQuestion getQuestionQClass() { + return question._super; + } - @Override - public JPAQuery getQuestion() { - return getQuery(question); - } + @Override + public JPAQuery getQuestion() { + return getQuery(question); + } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java index d60c2de..60d312f 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/impl/MajorMultipleChoiceQuestionDslRepository.java @@ -17,59 +17,58 @@ @Repository public class MajorMultipleChoiceQuestionDslRepository - extends QueryDslJpaQueryMaker - implements QuestionApiTransmissionQuery, - MajorQuestionSearchQuery { + extends QueryDslJpaQueryMaker + implements QuestionApiTransmissionQuery, + MajorQuestionSearchQuery { - public MajorMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { - super(jpaQueryFactory); - } + private final QMajorMultipleChoiceQuestion question = QMajorMultipleChoiceQuestion.majorMultipleChoiceQuestion; - private final QMajorMultipleChoiceQuestion question = QMajorMultipleChoiceQuestion.majorMultipleChoiceQuestion; + public MajorMultipleChoiceQuestionDslRepository(JPAQueryFactory jpaQueryFactory) { + super(jpaQueryFactory); + } + @Override + public List findAllCategoriesAndLevelsAndIfApproved( + List questionCategories, + List questionLevels, + boolean approved) { + return selectWhereCategoriesAndLevelsAndIfApproved( + questionCategories, + questionLevels, + approved + ) + .distinct() + .leftJoin(question.questionChoices).fetchJoin() + .fetch(); + } - @Override - public List findAllCategoriesAndLevelsAndIfApproved( - List questionCategories, - List questionLevels, - boolean approved) { - return selectWhereCategoriesAndLevelsAndIfApproved( - questionCategories, - questionLevels, - approved - ) - .distinct() - .leftJoin(question.questionChoices).fetchJoin() - .fetch(); - } + @Override + public List findAllWhereCategories( + List questionCategories + ) { + return selectWhereCategories(questionCategories) + .distinct() + .leftJoin(question.questionChoices).fetchJoin() + .fetch(); + } - @Override - public List findAllWhereCategories( - List questionCategories - ) { - return selectWhereCategories(questionCategories) - .distinct() - .leftJoin(question.questionChoices).fetchJoin() - .fetch(); - } + @Override + public JPAQuery getQuestion() { + return getQuery(question); + } - @Override - public JPAQuery getQuestion() { - return getQuery(question); - } + @Override + public QQuestion getQuestionQClass() { + return question._super; + } - @Override - public QQuestion getQuestionQClass() { - return question._super; - } - - @Override - public List findAllOrderByIfApprovedAsc() { - return selectOrderByIfApprovedAsc() - .distinct() - .leftJoin(question.questionChoices).fetchJoin() - .fetch(); - } + @Override + public List findAllOrderByIfApprovedAsc() { + return selectOrderByIfApprovedAsc() + .distinct() + .leftJoin(question.questionChoices).fetchJoin() + .fetch(); + } } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java index 1f528ff..487513c 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/MajorQuestionSearchQuery.java @@ -25,8 +25,6 @@ default List findAllOrderByIfApprovedAsc() { .fetch(); } - ; - default JPAQuery selectOrderByIfApprovedAsc() { return getQuestion() .orderBy(getQuestionQClass().ifApproved.asc()); diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java index a65c457..623ad6e 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/QuestionQuerySupport.java @@ -5,10 +5,10 @@ import com.querydsl.jpa.impl.JPAQuery; public interface QuestionQuerySupport { - //구현체에서 Select할 테이블을 선택 - JPAQuery getQuestion(); - + //구현체에서 Select할 테이블을 선택 + JPAQuery getQuestion(); - //구현체에서 QQuestion을 반환 - QQuestion getQuestionQClass(); + + //구현체에서 QQuestion을 반환 + QQuestion getQuestionQClass(); } diff --git a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java index 376d38f..bc47836 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java +++ b/persistence/src/main/java/com/comssa/persistence/question/repository/querydsl/query/booleanbuilder/LevelsAndCategoryBooleanBuilder.java @@ -9,24 +9,24 @@ public interface LevelsAndCategoryBooleanBuilder { - /** - * @param question 호출부에선 QQuestion 그대로 삽입하거나 - * 실제 상속받는 관계일 떄는 Q*Question._super를 인자로 넣어 호출한다 - */ - default BooleanBuilder whereCategoriesAndLevels( - QQuestion question, - List questionCategories, - List questionLevels - ) { - BooleanBuilder condition = new BooleanBuilder(); - // 카테고리 조건 - if (questionCategories != null && !questionCategories.isEmpty()) { - condition.and(question.questionCategory.in(questionCategories)); - } - // 레벨 조건 - if (questionLevels != null && !questionLevels.isEmpty()) { - condition.and(question.questionLevel.in(questionLevels)); - } - return condition; - } + /** + * @param question 호출부에선 QQuestion 그대로 삽입하거나 + * 실제 상속받는 관계일 떄는 Q*Question._super를 인자로 넣어 호출한다 + */ + default BooleanBuilder whereCategoriesAndLevels( + QQuestion question, + List questionCategories, + List questionLevels + ) { + BooleanBuilder condition = new BooleanBuilder(); + // 카테고리 조건 + if (questionCategories != null && !questionCategories.isEmpty()) { + condition.and(question.questionCategory.in(questionCategories)); + } + // 레벨 조건 + if (questionLevels != null && !questionLevels.isEmpty()) { + condition.and(question.questionLevel.in(questionLevels)); + } + return condition; + } } From e84836bbbe0c9b5b8a0b250de96d94193d9ca9dd Mon Sep 17 00:00:00 2001 From: starwook Date: Tue, 31 Dec 2024 01:50:07 +0900 Subject: [PATCH 8/8] =?UTF-8?q?style:=20=EC=BD=94=EB=94=A9=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/comssa/api/config/SwaggerConfig.kt | 14 +++++++------- build.gradle | 4 ++-- .../response/ResponseMultipleChoiceQuestionDto.kt | 3 +-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/application/src/main/kotlin/com/comssa/api/config/SwaggerConfig.kt b/application/src/main/kotlin/com/comssa/api/config/SwaggerConfig.kt index d243aa0..e9bb67b 100644 --- a/application/src/main/kotlin/com/comssa/api/config/SwaggerConfig.kt +++ b/application/src/main/kotlin/com/comssa/api/config/SwaggerConfig.kt @@ -83,13 +83,13 @@ class SwaggerConfig { // WebMvcEndpointHandlerMapping 객체를 생성하여 반환합니다. return WebMvcEndpointHandlerMapping( - endpointMapping, // 엔드포인트 매핑 - webEndpoints, // 웹 엔드포인트 컬렉션 - endpointMediaTypes, // 엔드포인트 미디어 타입 - corsProperties.toCorsConfiguration(), // CORS 설정 - EndpointLinksResolver(allEndpoints, basePath), // 엔드포인트 링크 리졸버 - shouldRegisterLinksMapping, // 링크 매핑 등록 여부 - null, // 추가적인 설정 (여기서는 null로 설정) + endpointMapping, + webEndpoints, + endpointMediaTypes, + corsProperties.toCorsConfiguration(), + EndpointLinksResolver(allEndpoints, basePath), + shouldRegisterLinksMapping, + null, ) } diff --git a/build.gradle b/build.gradle index a2d3652..59a6fc0 100644 --- a/build.gradle +++ b/build.gradle @@ -154,6 +154,6 @@ subprojects { } -bootJar.enabled = false; -jar.enabled = false; +bootJar.enabled = false +jar.enabled = false diff --git a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt index 234cb8e..f530bcf 100644 --- a/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt +++ b/persistence/src/main/java/com/comssa/persistence/question/dto/common/response/ResponseMultipleChoiceQuestionDto.kt @@ -12,8 +12,7 @@ open class ResponseMultipleChoiceQuestionDto( ) { companion object { @JvmStatic - fun from(question: Q): ResponseMultipleChoiceQuestionDto - where Q : Question, Q : ChoiceBehavior = + fun from(question: Q): ResponseMultipleChoiceQuestionDto where Q : Question, Q : ChoiceBehavior = ResponseMultipleChoiceQuestionDto( question = question, questionChoices = question.questionChoices.map { ResponseQuestionChoiceDto.from(it) },