From 11513eb95b2e38db41c619abddaa6c8638e2bbd1 Mon Sep 17 00:00:00 2001 From: khyaejin Date: Fri, 25 Apr 2025 17:14:42 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20[fix]=20GraphNode=20En?= =?UTF-8?q?tity=20=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95=20-=20includeSen?= =?UTF-8?q?tence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/going/server/domain/graph/entity/GraphNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java index 7281e9c..fb48f05 100644 --- a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java +++ b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java @@ -21,7 +21,7 @@ public class GraphNode { private String label; private int level; - private String description; + private String includeSentence; //해당 노드(단어)가 포함된 문장(,로 구분) @Relationship(type = "HAS_GRAPH", direction = Relationship.Direction.INCOMING) private Graph graph; From 749c8b363c8de41244e51c069c1f0274874c2166 Mon Sep 17 00:00:00 2001 From: khyaejin Date: Fri, 25 Apr 2025 21:44:24 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E2=9C=A8=20[feat]=20=ED=80=B4=EC=A6=88=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20(listenUp)=20-=20Service=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/graph/entity/GraphNode.java | 2 +- .../quiz/controller/QuizController.java | 5 +- .../domain/quiz/dto/ListenUpQuizDto.java | 1 + .../quiz/dto/QuizCreateResponseDto.java | 2 + .../domain/quiz/service/QuizService.java | 3 +- .../domain/quiz/service/QuizServiceImpl.java | 54 +++++++++++++++++-- 6 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java index fb48f05..b0657ed 100644 --- a/src/main/java/com/going/server/domain/graph/entity/GraphNode.java +++ b/src/main/java/com/going/server/domain/graph/entity/GraphNode.java @@ -21,7 +21,7 @@ public class GraphNode { private String label; private int level; - private String includeSentence; //해당 노드(단어)가 포함된 문장(,로 구분) + private String includeSentence; //해당 노드(단어)가 포함된 문장 @Relationship(type = "HAS_GRAPH", direction = Relationship.Direction.INCOMING) private Graph graph; diff --git a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java index b978861..e1bbca5 100644 --- a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java +++ b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java @@ -1,6 +1,7 @@ package com.going.server.domain.quiz.controller; import com.going.server.domain.quiz.dto.QuizCreateResponseDto; +import com.going.server.domain.quiz.service.QuizService; import com.going.server.domain.quiz.service.QuizServiceImpl; import com.going.server.global.response.SuccessResponse; import io.swagger.v3.oas.annotations.Operation; @@ -18,9 +19,9 @@ @Tag(name="[캡스톤]ListenUpQuiz", description = "퀴즈 관련 통신을 위한 API") public class QuizController { - private QuizServiceImpl quizService; + private final QuizService quizService; - @PostMapping("/{graphId}?mode={mode}") + @PostMapping("/{graphId}") @Operation(summary = "[퀴즈화면] 퀴즈 생성", description = "퀴즈 화면에서 해당 모드의 퀴즈를 생성합니다.") @ApiResponses({ @ApiResponse( diff --git a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java index e4fea1d..b15282c 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java @@ -3,6 +3,7 @@ import lombok.Builder; import java.util.List; +@Builder public class ListenUpQuizDto { private List quizzes; diff --git a/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java b/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java index 35a1f5f..12cd857 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/QuizCreateResponseDto.java @@ -2,9 +2,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; +import lombok.Getter; // 퀴즈 생성 반환 DTO @AllArgsConstructor +@Getter public class QuizCreateResponseDto { private String graphId; private String mode; // listenUp, connect, picture diff --git a/src/main/java/com/going/server/domain/quiz/service/QuizService.java b/src/main/java/com/going/server/domain/quiz/service/QuizService.java index 6126530..544f39c 100644 --- a/src/main/java/com/going/server/domain/quiz/service/QuizService.java +++ b/src/main/java/com/going/server/domain/quiz/service/QuizService.java @@ -3,9 +3,8 @@ import com.going.server.domain.quiz.dto.QuizCreateResponseDto; import org.springframework.stereotype.Service; -@Service public interface QuizService { // 모드 별 퀴즈 생성 - public QuizCreateResponseDto quizCreate(String mode, String graphId); + public QuizCreateResponseDto quizCreate(String graphId, String mode); } diff --git a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java index 9239865..d9c1bbf 100644 --- a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java +++ b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java @@ -1,6 +1,7 @@ package com.going.server.domain.quiz.service; import com.going.server.domain.graph.entity.Graph; +import com.going.server.domain.graph.entity.GraphNode; import com.going.server.domain.graph.exception.GraphNotFoundException; import com.going.server.domain.graph.repository.GraphRepository; import com.going.server.domain.quiz.dto.ConnectQuizDto; @@ -8,13 +9,17 @@ import com.going.server.domain.quiz.dto.PictureQuizDto; import com.going.server.domain.quiz.dto.QuizCreateResponseDto; import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.*; + +@Service @AllArgsConstructor public class QuizServiceImpl implements QuizService{ private final GraphRepository graphRepository; @Override - public QuizCreateResponseDto quizCreate(String mode, String graphIdStr) { + public QuizCreateResponseDto quizCreate(String graphIdStr, String mode) { Long graphId = Long.valueOf(graphIdStr); // 404 : 지식그래프 찾을 수 없음 @@ -42,8 +47,51 @@ public QuizCreateResponseDto quizCreate(String mode, String graphIdStr) { // listenUp 퀴즈 생성 메서드 private ListenUpQuizDto listenUpQuizCreate(Graph graph) { - // TODO : listenUp 퀴즈 생성 로직 작성 - return new ListenUpQuizDto(); + // 최종 리턴할 퀴즈 리스트 (3개) + List quizzes = new ArrayList<>(); + + Random random = new Random(); + + // 몇 개 퀴즈 만들었는지 세기 위한 변수 (3개까지만 만들 거임) + int count = 0; + + // 그래프에 연결된 노드를 하나씩 확인 + for (GraphNode node : graph.getNodes()) { + + // includeSentence가 null이거나 공백이면 건너뛰기 + if (node.getIncludeSentence() == null || node.getIncludeSentence().isBlank()) { + continue; + } + + // includeSentence 문장을 띄어쓰기 기준으로 단어 분리 + String[] words = node.getIncludeSentence().trim().split("\\s+"); + + // 단어 리스트를 정답 리스트로 저장 + List answer = Arrays.asList(words); + + // 정답 리스트를 복사해서 셔플할 리스트로 사용 + List shuffled = new ArrayList<>(answer); + Collections.shuffle(shuffled, random); // 무작위로 단어 순서 섞기 + + // 하나의 퀴즈 생성 + ListenUpQuizDto.ListenUpQuiz quiz = ListenUpQuizDto.ListenUpQuiz.builder() + .answer(answer) // 정답 리스트 + .shuffled(shuffled) // 섞인(문제) 리스트 + .description(node.getIncludeSentence()) // TTS로 읽어줄 원문 문장 + .build(); + + // 퀴즈 리스트에 추가 + quizzes.add(quiz); + count++; + + // 3개 만들었으면 종료 + if (count >= 3) break; + } + + // 최종 퀴즈 DTO에 담아서 리턴 + return ListenUpQuizDto.builder() + .quizzes(quizzes) + .build(); } // connect 퀴즈 생성 메서드 From b6f4245ed38b44b0b778f68d4975c234e24fee24 Mon Sep 17 00:00:00 2001 From: khyaejin Date: Fri, 25 Apr 2025 21:59:56 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=94=A7=20[chore]=20Cypher=20deprecati?= =?UTF-8?q?on=20Warning=20=EB=81=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/going/server/domain/graph/GraphMockDataLoader.java | 5 ++--- .../going/server/domain/quiz/controller/QuizController.java | 2 +- .../com/going/server/domain/quiz/dto/ConnectQuizDto.java | 5 +++++ .../com/going/server/domain/quiz/dto/ListenUpQuizDto.java | 4 ++++ .../com/going/server/domain/quiz/dto/PictureQuizDto.java | 5 +++++ .../going/server/domain/quiz/service/QuizServiceImpl.java | 6 ++++-- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java index 6ca21c3..b9efa94 100644 --- a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java +++ b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java @@ -39,7 +39,6 @@ OPTIONAL MATCH (n)-[r:RELATED]->(m:GraphNode) -/* package com.going.server.domain.graph; import com.going.server.domain.graph.entity.Graph; @@ -95,7 +94,7 @@ public void run(String... args) { node.setId(Long.valueOf(arr[0])); node.setLabel(arr[1]); node.setLevel(Integer.parseInt(arr[2])); - node.setDescription(arr[3]); + node.setIncludeSentence(arr[3]); node.setGraph(graph); nodeMap.put(arr[0], node); } @@ -126,5 +125,5 @@ private GraphEdge createEdge(Long edgeId, String label, GraphNode source, GraphN edge.setTarget(target); return edge; } -}*/ +} diff --git a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java index e1bbca5..35890f5 100644 --- a/src/main/java/com/going/server/domain/quiz/controller/QuizController.java +++ b/src/main/java/com/going/server/domain/quiz/controller/QuizController.java @@ -35,7 +35,7 @@ public class QuizController { }) public SuccessResponse createQuiz(@PathVariable String graphId, @RequestParam String mode) { QuizCreateResponseDto result = quizService.quizCreate(graphId, mode); - return SuccessResponse.of(result); + return SuccessResponse.of(result, "201"); } } diff --git a/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java index 2098b22..564dff5 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/ConnectQuizDto.java @@ -1,4 +1,9 @@ package com.going.server.domain.quiz.dto; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter public class ConnectQuizDto { } diff --git a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java index b15282c..ecd81af 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/ListenUpQuizDto.java @@ -1,13 +1,17 @@ package com.going.server.domain.quiz.dto; import lombok.Builder; +import lombok.Getter; + import java.util.List; @Builder +@Getter public class ListenUpQuizDto { private List quizzes; @Builder + @Getter public static class ListenUpQuiz { private List shuffled; private List answer; diff --git a/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java b/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java index db23b62..d6d5c4b 100644 --- a/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java +++ b/src/main/java/com/going/server/domain/quiz/dto/PictureQuizDto.java @@ -1,4 +1,9 @@ package com.going.server.domain.quiz.dto; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter public class PictureQuizDto { } diff --git a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java index d9c1bbf..926ddd6 100644 --- a/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java +++ b/src/main/java/com/going/server/domain/quiz/service/QuizServiceImpl.java @@ -97,12 +97,14 @@ private ListenUpQuizDto listenUpQuizCreate(Graph graph) { // connect 퀴즈 생성 메서드 private ConnectQuizDto connectQuizCreate(Graph graph) { // TODO : connect 퀴즈 생성 로직 작성 - return new ConnectQuizDto(); + return ConnectQuizDto.builder() + .build(); } // picture 퀴즈 생성 메서드 private PictureQuizDto pictureQuizCreate(Graph graph) { // TODO : picture 퀴즈 생성 로직 작성 - return new PictureQuizDto(); + return PictureQuizDto.builder() + .build(); } } \ No newline at end of file From 22e5c5d194803c7713bacbc93331a43978009cd3 Mon Sep 17 00:00:00 2001 From: khyaejin Date: Fri, 25 Apr 2025 22:05:55 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=94=A7=20[settings]=20submodule=20upd?= =?UTF-8?q?ate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backend_Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Backend_Config b/Backend_Config index fecc796..03853da 160000 --- a/Backend_Config +++ b/Backend_Config @@ -1 +1 @@ -Subproject commit fecc796811df62f41fde050e178dd27378808622 +Subproject commit 03853da9fd65f2acf9e61e070cd9148f2c39ebe9 From fc6757625838e6bcd5e6ce2a68a967fb3927ecd0 Mon Sep 17 00:00:00 2001 From: khyaejin Date: Fri, 25 Apr 2025 22:36:37 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20[fix]=20Mock=20Data=20?= =?UTF-8?q?=EC=82=BD=EC=9E=85=20=EC=BD=94=EB=93=9C=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/graph/GraphMockDataLoader.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java index b9efa94..5d175ab 100644 --- a/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java +++ b/src/main/java/com/going/server/domain/graph/GraphMockDataLoader.java @@ -1,4 +1,5 @@ -/* 사이퍼 쿼리문 예시 +// 사이퍼 쿼리문 예시 +/* import com.going.server.domain.graph.entity.GraphNode; CREATE (g:KnowledgeGraph { @@ -32,14 +33,15 @@ MATCH (a:GraphNode { nodeId: 2 }), (b:GraphNode { nodeId: 3 }) CREATE (a)-[:RELATED { label: "응고" }]->(b); +// 전체 조회 MATCH (g:KnowledgeGraph { title: "물의 상태 변화" })-[:HAS_NODE]->(n:GraphNode) OPTIONAL MATCH (n)-[r:RELATED]->(m:GraphNode) RETURN g, n, r, m; */ - -package com.going.server.domain.graph; +// 목 데이터 삽입 +/*package com.going.server.domain.graph; import com.going.server.domain.graph.entity.Graph; import com.going.server.domain.graph.entity.GraphEdge; @@ -125,5 +127,4 @@ private GraphEdge createEdge(Long edgeId, String label, GraphNode source, GraphN edge.setTarget(target); return edge; } -} - +}*/