diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..dea924c
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
index e40ff58..cb29ace 100644
--- a/.project
+++ b/.project
@@ -5,7 +5,30 @@
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.springframework.ide.eclipse.boot.validation.springbootbuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
+ org.eclipse.jdt.core.javanature
diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100644
index 0000000..d4313d4
--- /dev/null
+++ b/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..e82d82e
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..48ff4f3
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/.settings/org.springframework.ide.eclipse.prefs b/.settings/org.springframework.ide.eclipse.prefs
new file mode 100644
index 0000000..a12794d
--- /dev/null
+++ b/.settings/org.springframework.ide.eclipse.prefs
@@ -0,0 +1,2 @@
+boot.validation.initialized=true
+eclipse.preferences.version=1
diff --git a/bin/com/codeboy/CodeBoyBackendApplication.class b/bin/com/codeboy/CodeBoyBackendApplication.class
new file mode 100644
index 0000000..ad03b8e
Binary files /dev/null and b/bin/com/codeboy/CodeBoyBackendApplication.class differ
diff --git a/bin/com/codeboy/CodeBoyBackendApplicationTests.class b/bin/com/codeboy/CodeBoyBackendApplicationTests.class
new file mode 100644
index 0000000..072a481
Binary files /dev/null and b/bin/com/codeboy/CodeBoyBackendApplicationTests.class differ
diff --git a/bin/com/codeboy/common/Category.class b/bin/com/codeboy/common/Category.class
new file mode 100644
index 0000000..fda0c6a
Binary files /dev/null and b/bin/com/codeboy/common/Category.class differ
diff --git a/bin/com/codeboy/common/Status.class b/bin/com/codeboy/common/Status.class
new file mode 100644
index 0000000..c5f01af
Binary files /dev/null and b/bin/com/codeboy/common/Status.class differ
diff --git a/bin/com/codeboy/mvc/config/SwaggerConfig.class b/bin/com/codeboy/mvc/config/SwaggerConfig.class
new file mode 100644
index 0000000..2e54993
Binary files /dev/null and b/bin/com/codeboy/mvc/config/SwaggerConfig.class differ
diff --git a/bin/com/codeboy/mvc/controller/MemberController.class b/bin/com/codeboy/mvc/controller/MemberController.class
new file mode 100644
index 0000000..9b32456
Binary files /dev/null and b/bin/com/codeboy/mvc/controller/MemberController.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/CommentDao.class b/bin/com/codeboy/mvc/model/dao/CommentDao.class
new file mode 100644
index 0000000..26d5a0e
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/CommentDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class b/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class
new file mode 100644
index 0000000..da97c4b
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/MemberDao.class b/bin/com/codeboy/mvc/model/dao/MemberDao.class
new file mode 100644
index 0000000..775c4f4
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/MemberDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/ProblemDao.class b/bin/com/codeboy/mvc/model/dao/ProblemDao.class
new file mode 100644
index 0000000..2dfb2b1
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/ProblemDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class b/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class
new file mode 100644
index 0000000..b99a818
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/ScoreDao.class b/bin/com/codeboy/mvc/model/dao/ScoreDao.class
new file mode 100644
index 0000000..2d9d910
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/ScoreDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class b/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class
new file mode 100644
index 0000000..caf04d0
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dao/UserProblemDao.class b/bin/com/codeboy/mvc/model/dao/UserProblemDao.class
new file mode 100644
index 0000000..48c9073
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/UserProblemDao.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/Comment.class b/bin/com/codeboy/mvc/model/dto/Comment.class
new file mode 100644
index 0000000..0af17be
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Comment.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/IncorrectNote.class b/bin/com/codeboy/mvc/model/dto/IncorrectNote.class
new file mode 100644
index 0000000..7718f2a
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/IncorrectNote.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/Member.class b/bin/com/codeboy/mvc/model/dto/Member.class
new file mode 100644
index 0000000..95a6fbb
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Member.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class b/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class
new file mode 100644
index 0000000..61a0d62
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/Problem.class b/bin/com/codeboy/mvc/model/dto/Problem.class
new file mode 100644
index 0000000..5cea3fc
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Problem.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/QuizRoom.class b/bin/com/codeboy/mvc/model/dto/QuizRoom.class
new file mode 100644
index 0000000..dc60dc5
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/QuizRoom.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class b/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class
new file mode 100644
index 0000000..4883913
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class b/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class
new file mode 100644
index 0000000..0db1604
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/UserProblem.class b/bin/com/codeboy/mvc/model/dto/UserProblem.class
new file mode 100644
index 0000000..df5b7b0
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserProblem.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/UserProblemSet.class b/bin/com/codeboy/mvc/model/dto/UserProblemSet.class
new file mode 100644
index 0000000..5b3cb6d
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserProblemSet.class differ
diff --git a/bin/com/codeboy/mvc/model/dto/UserScore.class b/bin/com/codeboy/mvc/model/dto/UserScore.class
new file mode 100644
index 0000000..484e95a
Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserScore.class differ
diff --git a/bin/com/codeboy/mvc/model/service/CommentService.class b/bin/com/codeboy/mvc/model/service/CommentService.class
new file mode 100644
index 0000000..d44b062
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/CommentService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class b/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class
new file mode 100644
index 0000000..eea54f0
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/MemberService.class b/bin/com/codeboy/mvc/model/service/MemberService.class
new file mode 100644
index 0000000..0d73745
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/MemberService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/ProblemService.class b/bin/com/codeboy/mvc/model/service/ProblemService.class
new file mode 100644
index 0000000..53d84b2
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/ProblemService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/QuizRoomService.class b/bin/com/codeboy/mvc/model/service/QuizRoomService.class
new file mode 100644
index 0000000..11f4bb1
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/QuizRoomService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class b/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class
new file mode 100644
index 0000000..bf485f0
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class differ
diff --git a/bin/com/codeboy/mvc/model/service/ScoreService.class b/bin/com/codeboy/mvc/model/service/ScoreService.class
new file mode 100644
index 0000000..384f9b4
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/ScoreService.class differ
diff --git a/bin/com/codeboy/mvc/model/service/UserProblemService.class b/bin/com/codeboy/mvc/model/service/UserProblemService.class
new file mode 100644
index 0000000..3f98a1d
Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/UserProblemService.class differ
diff --git a/codeBoy_backend/.gitignore b/codeBoy_backend/.gitignore
index 667aaef..4f0d27e 100644
--- a/codeBoy_backend/.gitignore
+++ b/codeBoy_backend/.gitignore
@@ -31,3 +31,6 @@ build/
### VS Code ###
.vscode/
+/.metadata/
+
+.class
\ No newline at end of file
diff --git a/codeBoy_backend/pom.xml b/codeBoy_backend/pom.xml
index aa498cf..1605b95 100644
--- a/codeBoy_backend/pom.xml
+++ b/codeBoy_backend/pom.xml
@@ -1,6 +1,6 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.springframework.boot
@@ -30,6 +30,7 @@
17
+
org.springframework.boot
spring-boot-starter-web
@@ -63,11 +64,11 @@
test
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
- 2.3.0
-
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.3.0
+
org.springframework.boot
spring-boot-starter
@@ -75,8 +76,10 @@
org.projectlombok
lombok
- true
+ 1.18.42
+ provided
+
@@ -85,27 +88,15 @@
org.springframework.boot
spring-boot-maven-plugin
-
-
- org.projectlombok
- lombok
-
-
+
org.apache.maven.plugins
maven-compiler-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
+
-
+
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java
new file mode 100644
index 0000000..f657d4d
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java
@@ -0,0 +1,10 @@
+package com.codeboy.mvc.config;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@MapperScan("com.codeboy.mvc.model.dao")
+public class MyBatisConfig {
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java
new file mode 100644
index 0000000..ec4166a
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java
@@ -0,0 +1,166 @@
+package com.codeboy.mvc.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.codeboy.mvc.model.dto.request.CommentUpdateRequest;
+import com.codeboy.mvc.model.dto.response.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PatchMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.codeboy.mvc.model.dto.Comment;
+import com.codeboy.mvc.model.service.CommentService;
+
+@RestController
+@RequestMapping("/api/comments")
+@Tag(name="Comment RESTful API", description = "Comment CRUD를 할 수 있는 REST API")
+public class CommentController {
+ private final CommentService commentService;
+
+
+ @Autowired
+ public CommentController(CommentService commentService) {
+ this.commentService = commentService;
+ }
+
+
+ @GetMapping("{userProblemSetId}")
+ //숫자가 아닌 값이 userProblemSetId에 오면 스프링이 컨트롤러에 도달하기전에 400BAD_REQUEST를 보내줌
+ public ResponseEntity>> getAllCommentsById(@PathVariable("userProblemSetId") long userProblemSetId){
+ List comments = commentService.getAllCommentsById(userProblemSetId);
+
+ if (comments.isEmpty()) {
+ //댓글이 달리지 않은 경우
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "댓글이 없습니다.", new ArrayList()));
+ }
+ //댓글 조회에 성공한 경우
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "댓글 조회 성공", comments));
+
+ }
+
+ @PostMapping("{userProblemSetId}")
+ public ResponseEntity> addComment(@PathVariable long userProblemSetId,
+ @RequestBody Comment comment, HttpSession session) {
+ if (comment.getContent() == null || comment.getContent().isBlank()) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "댓글 내용은 비어 있을 수 없습니다."));
+ }
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ // 인증 안 됨
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+ comment.setMemberId(memberId);
+ int result = commentService.addComment(userProblemSetId, comment);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "잘못된 요청. 댓글 추가 실패"));
+ }
+
+ return ResponseEntity.status(HttpStatus.CREATED)
+ .body(ApiResponse.success(HttpStatus.CREATED, "댓글 추가 성공", null));
+ }
+
+
+ //리소스의 일부(content)만 수정하므로 패치매핑
+ @PatchMapping("{userProblemSetId}/{commentId}")
+ public ResponseEntity> updateComment(
+ @PathVariable long userProblemSetId,
+ @PathVariable long commentId,
+ @RequestBody CommentUpdateRequest commentUpdateRequest,
+ HttpSession session) {
+
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ // 인증 안 됨
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ if (!memberId.equals(commentUpdateRequest.getMemberId())) {
+ // 인가 실패
+ // 로그인 중인 회원이 자신이 작성한 댓글이 아닌 것을 수정하려할 때
+ return ResponseEntity.status(HttpStatus.FORBIDDEN)
+ .body(ApiResponse.failure(HttpStatus.FORBIDDEN, "본인의 댓글만 수정할 수 있습니다."));
+ }
+
+ //댓글이 비어있을 때
+ if (commentUpdateRequest.getContent() == null || commentUpdateRequest.getContent().isBlank()) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "수정할 댓글 내용을 입력해주세요."));
+ }
+
+ Comment comment = new Comment();
+ comment.setContent(commentUpdateRequest.getContent());
+
+ int result = commentService.updateComment(commentId, comment);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "존재하지 않는 댓글입니다."));
+
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "댓글 수정 성공", null));
+ }
+
+
+ @DeleteMapping("{userProblemSetId}/{commentId}")
+ public ResponseEntity> deleteComment(@PathVariable long userProblemSetId,
+ @PathVariable long commentId,
+ HttpSession session) {
+
+ Long memberId = (Long) session.getAttribute("memberId");
+
+ // 로그인 안한 상태
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ // DB에서 댓글 작성자 ID 조회
+ Long ownerId = commentService.getCommentOwnerId(commentId);
+
+ // 댓글ID가 존재하지 않는 경우
+ if (ownerId == null) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "존재하지 않는 댓글입니다."));
+ }
+
+ // 권한 없음 (본인 댓글 아님)
+ if (!memberId.equals(ownerId)) {
+ return ResponseEntity.status(HttpStatus.FORBIDDEN)
+ .body(ApiResponse.failure(HttpStatus.FORBIDDEN, "본인이 작성한 댓글만 삭제할 수 있습니다."));
+ }
+
+ // 삭제 실행
+ int result = commentService.deleteComment(commentId);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "댓글 삭제에 실패했습니다."));
+ }
+
+ // 삭제 실패 (DB 오류 등의 상황)
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "댓글 삭제 성공", null));
+ }
+
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java
new file mode 100644
index 0000000..405b907
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java
@@ -0,0 +1,73 @@
+package com.codeboy.mvc.controller;
+
+import com.codeboy.mvc.model.dto.request.IncorrectNoteRequest;
+import com.codeboy.mvc.model.dto.response.ApiResponse;
+import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse;
+import com.codeboy.mvc.model.service.IncorrectNoteService;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpSession;
+
+import org.apache.ibatis.javassist.NotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("api/incorrect-note")
+@Tag(name="Incorrect-note RESTful API", description = "Incorrect-note CRUD를 할 수 있는 REST API")
+public class IncorrectNoteController {
+
+ private final IncorrectNoteService incorrectNoteService;
+
+ public IncorrectNoteController(IncorrectNoteService incorrectNoteService) {
+ this.incorrectNoteService = incorrectNoteService;
+ }
+
+ //한 회원의 오답노트를 모두 조회
+ @GetMapping
+ public ResponseEntity>> getIncorrectNote(HttpSession session) {
+ try {
+ //TODO : 세션 or spring security에서 memberId 가져오기
+ Long memberId = (Long) session.getAttribute("memberId");
+ List incorrectNoteList = incorrectNoteService.getIncorrectNoteList(memberId);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "오답노트가 성공적으로 조회되었습니다", incorrectNoteList));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (NotFoundException e) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage()));
+ }
+ }
+
+ //오답노트에 문제 넣기
+ @PostMapping
+ public ResponseEntity> addIncorrectNote(@RequestBody IncorrectNoteRequest incorrectNoteRequest, HttpSession session) {
+ //TODO : 세션에서 멤버 id 가져오기
+ Long memberId = (Long) session.getAttribute("memberId");
+ Long problemId = incorrectNoteRequest.getProblemId();
+ Long userProblemId = incorrectNoteRequest.getUserProblemId();
+ Boolean isUserProblem = incorrectNoteRequest.getIsUserProblem();
+
+ try {
+ Long incorrectNoteId = incorrectNoteService.addIncorrectNote(memberId, problemId, userProblemId, isUserProblem);
+ return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "오답노트를 성공적으로 생성하였습니다.", incorrectNoteId));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+
+ }
+
+ @DeleteMapping("/{incorrectNoteId}")
+ public ResponseEntity> deleteIncorrectNote(@PathVariable long incorrectNoteId) {
+
+ try {
+ incorrectNoteService.deleteIncorrectNote(incorrectNoteId);
+ return ResponseEntity.ok(ApiResponse.success(HttpStatus.OK, "오답노트가 삭제되었습니다"));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java
index 0a18715..be695a1 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java
@@ -1,32 +1,240 @@
package com.codeboy.mvc.controller;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
import com.codeboy.mvc.model.dto.Member;
-
+import com.codeboy.mvc.model.dto.request.DuplicateCheckRequest;
+import com.codeboy.mvc.model.dto.request.LoginRequest;
+import com.codeboy.mvc.model.dto.request.MemberUpdateRequest;
+import com.codeboy.mvc.model.dto.response.ApiResponse;
+import com.codeboy.mvc.model.dto.response.DuplicateCheckResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatusCode;
+
+import org.springframework.http.HttpStatus;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import com.codeboy.mvc.model.service.MemberService;
+
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.NoSuchElementException;
@RestController
-@RequestMapping("/api-member")
+@RequestMapping("/api")
@Tag(name="Member RESTful API", description = "Member CRUD를 할 수 있는 REST API")
public class MemberController {
-
-// @Autowired
-// private MemberService memberService;
-
-
- @PostMapping("/signup")
- public String signup(@ModelAttribute Member member){
- return "회원가입 성공?";
- }
-
- @GetMapping(){
-
- }
-
-
+ private final MemberService memberService;
+
+ @Autowired
+ public MemberController(MemberService memberService) {
+ this.memberService = memberService;
+ }
+
+ /**
+ * 회원가입
+ * POST /api/members
+ * RequestBody: { id, password, nickname, email }
+ * Response:
+ * 201 생성 성공
+ * 400 잘못된 요청
+ * 409 아이디/이메일 중복
+ */
+ @PostMapping("/member")
+ public ResponseEntity> signUp(@RequestBody Member member) {
+ // TODO: 아이디/이메일 중복 체크 로직은 나중에 추가
+ int result = memberService.signUp(member);
+
+ if (result == 1) {
+ // Location 헤더에 새로 생성된 리소스 URI 넣어줄 수도 있음
+ URI location = URI.create("/api/members/" + member.getMemberId());
+ return ResponseEntity
+ .status(HttpStatusCode.valueOf(201))
+ .location(location)
+ .body("회원가입 성공");
+ } else {
+ return ResponseEntity
+ .status(HttpStatusCode.valueOf(400))
+ .body("회원가입 실패");
+ }
+ //아이디/이메일 중복로직은 나중에 구
+ }
+
+ /**
+ * 로그인
+ * POST /api/auth/login
+ * RequestBody: { id, password }
+ * Response:
+ * 200 성공 시 { token, memberId, nickname }
+ * 401 실패 시 { error: "로그인 실패" }
+ */
+ @PostMapping("/auth/login")
+ public ResponseEntity> login(@RequestBody LoginRequest request, HttpSession session) {
+ try {
+ // Service를 통해 로그인 처리
+ Member member = memberService.login(request.getId(), request.getPassword());
+
+ // 세션에 member_id 저장
+ session.setAttribute("memberId", member.getMemberId());
+ session.setAttribute("id", member.getId());
+ session.setAttribute("nickname", member.getNickname());
+
+ // 성공 응답 반환
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "로그인 성공",
+ new HashMap() {private static final long serialVersionUID = 5698154608853982208L;
+
+ {
+ put("memberId", member.getMemberId());
+ put("nickname", member.getNickname());
+ put("id", member.getId());
+ }}));
+ } catch (IllegalArgumentException e) {
+ // 로그인 실패 (ID/비밀번호 오류 등)
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, e.getMessage()));
+ } catch (Exception e) {
+ // 기타 오류
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "로그인 처리 중 오류가 발생했습니다."));
+ }
+ }
+ /**
+ * 로그아웃
+ * POST /api/auth/logout
+ * RequestBody: 없음
+ * Response:
+ * 204 성공 시 본문 없음
+ */
+ @PostMapping("/auth/logout")
+ public ResponseEntity> logout(HttpSession session) {
+ // 세션 무효화
+ session.invalidate();
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "로그아웃 성공", null));
+
+ }
+ /**
+ * 내 정보 수정
+ * PUT /api/members/me
+ * RequestBody: { nickname?, email?, password? }
+ * Response:
+ * 200 성공 시 수정된 정보 or 메시지
+ * 400 잘못된 요청
+ * 401 인증 실패
+ */
+ //회원정보 전체를 업데이트하지않고 일부만 수정하는 거라서 Put에서 Patch매핑으로 변경
+ @PatchMapping("/members/{memberId}")
+ public ResponseEntity> updateMe(@RequestBody MemberUpdateRequest request, @PathVariable long memberId ) {
+ //파라미터로 memberId받아서 해당회원의 정보를 수정
+
+ Member member = memberService.getMemberById(memberId);
+ //회원을 못찾는 경우 ->존재하지 않는 memberId인경우
+ if (member == null) {
+ return ResponseEntity
+ .status(HttpStatusCode.valueOf(401))
+ .body("인증된 회원을 찾을 수 없습니다.");
+ }
+
+ //닉네임과 이메일은 바꿀 수 있다고 가정. 필요하면 ID도..?
+ //닉네임, 아이디, 이메일
+ if (request == null) {
+ return ResponseEntity
+ .status(HttpStatusCode.valueOf(401))
+ .body("요청값이 null 입니다.");
+ }
+
+ return ResponseEntity
+ .status(HttpStatusCode.valueOf(200))
+ .body("회원정보 수정 성공");
+ }
+
+ //회원 조회
+ @GetMapping("/members/")
+ public ResponseEntity> getMemberInfo(HttpSession session) {
+ Long memberId = 1L;
+ try {
+ Member member = memberService.getMemberById(memberId);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원정보가 조회되었습니다", member));
+
+ } catch (NoSuchElementException e) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage()));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ //회원 탈퇴
+ @DeleteMapping
+ public ResponseEntity> deleteMember() {
+ //TODO : memberId 받아오기
+ Long memberId = 1L;
+ try {
+ memberService.deactivateMember(memberId);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원이 성공적으로 삭제되었습니다."));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (NoSuchElementException e) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage()));
+ }
+ }
+
+ //회원 정보 업데이트
+ @PatchMapping
+ public ResponseEntity> updateMember(@RequestBody MemberUpdateRequest request) {
+ //TODO : memberId 받아오기
+ Long memberId = 1L;
+ try {
+ memberService.updateMember(memberId, request);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원정보 업데이트에 성공했습니다."));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (IllegalStateException e) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage()));
+ }
+ }
+
+ //ID, 닉네임, 이메일 중복체크
+ @PostMapping("/check-id")
+ public ResponseEntity> checkId(@RequestBody DuplicateCheckRequest request) {
+ try {
+ boolean duplicated = memberService.checkIdDuplicate(request.getValue());
+ DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "아이디 중복 확인 완료", response));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ @PostMapping("/check-email")
+ public ResponseEntity> checkEmail(@RequestBody DuplicateCheckRequest request) {
+ try {
+ boolean duplicated = memberService.checkEmailDuplicate(request.getValue());
+ DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "이메일 중복 확인 완료", response));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ @PostMapping("/check-nickname")
+ public ResponseEntity> checkNickname(@RequestBody DuplicateCheckRequest request) {
+ try {
+ boolean duplicated = memberService.checkNicknameDuplicate(request.getValue());
+ DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "닉네임 중복 확인 완료", response));
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java
new file mode 100644
index 0000000..a666f9a
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java
@@ -0,0 +1,34 @@
+
+package com.codeboy.mvc.controller;
+
+import com.codeboy.common.Category;
+import com.codeboy.mvc.model.dto.response.ApiResponse;
+import com.codeboy.mvc.model.dto.Problem;
+import com.codeboy.mvc.model.service.ProblemServiceImpl;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/problem")
+@Tag(name="Problem RESTful API", description = "Problem CRUD를 할 수 있는 REST API")
+public class ProblemController {
+
+ @Autowired
+ private ProblemServiceImpl problemService;
+
+ @GetMapping
+ public ResponseEntity>> getProblems(@RequestParam int limit, @RequestParam Category category) {
+ try {
+ List problems = problemService.getProblems(limit, category);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "문제가 성공적으로 반환되었습니다.", problems));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST , e.getMessage()));
+ }
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java
new file mode 100644
index 0000000..37abdb6
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java
@@ -0,0 +1,107 @@
+package com.codeboy.mvc.controller;
+
+import com.codeboy.mvc.model.dto.*;
+import com.codeboy.mvc.model.dto.request.JoinQuizRoomRequest;
+import com.codeboy.mvc.model.dto.response.ApiResponse;
+import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse;
+import com.codeboy.mvc.model.service.QuizRoomService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/quiz-room")
+@Tag(name="Quiz-room RESTful API", description = "Quiz-room CRUD를 할 수 있는 REST API")
+public class QuizRoomController {
+ private final QuizRoomService quizRoomService;
+
+ public QuizRoomController(QuizRoomService quizRoomService) {
+ this.quizRoomService = quizRoomService;
+ }
+
+ //호스트 - 퀴즈방 만들기
+ //TODO : 테스트용으로 memberId를 PathVariable로 넘김
+ @PostMapping("/create/{memberId}")
+ //TODO : 로그인 구현되면 memberId를 requestBody로 넘기지 말고 세션에서 가져오도록 하기
+ public ResponseEntity> createQuizRoom(@PathVariable long memberId) {
+ try {
+ //새로운 채팅방 생성하기
+ long quizRoomId = quizRoomService.createQuizRoom();
+ //3. QuizRoomMember 객체 생성
+// Long memberId = 1L;
+ QuizRoomMember quizRoomMember = new QuizRoomMember();
+ //4. setter로 객체 만들기
+ quizRoomMember.setMemberId(memberId);
+ quizRoomMember.setRoomId(quizRoomId);
+ quizRoomMember.setIsHost(true);
+
+ //5. 채팅방에 넣기
+ quizRoomService.joinQuizRoom(quizRoomMember);
+ return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "퀴즈방이 성공적으로 생성되었습니다.", quizRoomId));
+
+ } catch (IllegalStateException | IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ //채팅방 참여하기
+ @PostMapping("/join")
+ //TODO : 로그인 구현되면 memberId를 requestBody로 넘기지 말고 세션에서 가져오도록 하기
+ public ResponseEntity> joinQuizRoom(@RequestBody JoinQuizRoomRequest request) {
+ long memberId = request.getMemberId();
+ long roomId = request.getRoomId();
+ try {
+ //QuizRoomMember 생성
+ QuizRoomMember quizRoomMember = new QuizRoomMember();
+ quizRoomMember.setIsHost(false);
+ quizRoomMember.setMemberId(memberId);
+ quizRoomMember.setRoomId(roomId);
+
+ //채팅방에 참가
+ quizRoomService.joinQuizRoom(quizRoomMember);
+ return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "퀴즈방 입장에 성공하였습니다."));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ //채팅방 목록 보여주기
+ @GetMapping
+ public ResponseEntity>> getQuizRoomList() {
+ try {
+ List quizRooms = quizRoomService.getQuizRoomList();
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "퀴즈방 목록 조회 성공", quizRooms));
+
+ } catch (IllegalStateException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+
+ //현재 참가자 목록 보여주기
+ @GetMapping("/{roomId}/member")
+ public ResponseEntity>> getQuizRoomMembers(@PathVariable long roomId) {
+ try {
+ List memberList = quizRoomService.getOneQuizRoomMember(roomId);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "멤버 리스트를 반환합니다.", memberList));
+ } catch (IllegalStateException | IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+
+ //채팅방 삭제하기
+ @DeleteMapping("/{roomId}")
+ public ResponseEntity> deleteQuizRoom(@PathVariable long roomId) {
+ try {
+ quizRoomService.deleteQuizRoom(roomId);
+ return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "채팅방이 성공적으로 삭제되었습니다."));
+
+ } catch (IllegalStateException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ }
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java
new file mode 100644
index 0000000..dd89b65
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java
@@ -0,0 +1,154 @@
+package com.codeboy.mvc.controller;
+
+import com.codeboy.mvc.model.dto.UserProblem;
+import com.codeboy.mvc.model.dto.response.ApiResponse; // 실제 패키지에 맞게 수정
+import com.codeboy.mvc.model.service.UserProblemService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/user-problems")
+@Tag(name="User-problems RESTful API", description = "User-problems CRUD를 할 수 있는 REST API")
+public class UserProblemController {
+
+
+ private final UserProblemService userProblemService;
+
+ public UserProblemController(UserProblemService userProblemService) {
+ this.userProblemService = userProblemService;
+ }
+
+ // 특정 문제세트 안의 모든 문제 조회
+ @GetMapping("/sets/{userProblemSetId}")
+ public ResponseEntity>> getProblemsByUserProblemSetId(
+ @PathVariable Long userProblemSetId
+ ) {
+ try {
+ List problems = userProblemService.getProblemsByUserProblemSetId(userProblemSetId);
+
+ if (problems == null || problems.isEmpty()) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "해당 문제세트에 등록된 문제가 없습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "문제 목록 조회 성공", problems));
+
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제 목록을 조회하지 못했습니다."));
+ }
+ }
+
+ // user_problem테이블에 문제들 일괄 등록
+ @PostMapping("/sets/{userProblemSetId}")
+ public ResponseEntity> createUserProblems(
+ @PathVariable Long userProblemSetId,
+ @RequestBody List userProblems,
+ HttpSession session
+ ) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ try {
+ // 세트 ID 세팅
+ for (UserProblem p : userProblems) {
+ p.setUserProblemSetId(userProblemSetId);
+ }
+
+ int inserted = userProblemService.addUserProblems(userProblems);
+
+ if (inserted == 0) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "문제 등록에 실패했습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.CREATED)
+ .body(ApiResponse.success(HttpStatus.CREATED, "문제 등록 성공", null));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 등록하지 못했습니다."));
+ }
+ }
+
+ // 문제 수정
+ @PutMapping("/{userProblemId}")
+ public ResponseEntity> updateUserProblem(
+ @PathVariable Long userProblemId,
+ @RequestBody UserProblem userProblem,
+ HttpSession session
+ ) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ try {
+ userProblem.setUserProblemId(userProblemId);
+
+ int result = userProblemService.updateUserProblem(userProblem);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "수정할 문제가 존재하지 않습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "문제 수정 성공", null));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 수정하지 못했습니다."));
+ }
+ }
+
+ // 문제 삭제
+ @DeleteMapping("/{userProblemId}")
+ public ResponseEntity> deleteUserProblem(
+ @PathVariable Long userProblemId,
+ HttpSession session
+ ) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ try {
+ int result = userProblemService.deleteUserProblem(userProblemId);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "삭제할 문제가 존재하지 않습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "문제 삭제 성공", null));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 삭제하지 못했습니다."));
+ }
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java
new file mode 100644
index 0000000..b60fe26
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java
@@ -0,0 +1,139 @@
+package com.codeboy.mvc.controller;
+
+import com.codeboy.mvc.model.dto.UserProblemSet;
+import com.codeboy.mvc.model.dto.response.ApiResponse; // 실제 패키지에 맞게 수정
+import com.codeboy.mvc.model.service.UserProblemSetService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/user-problem-sets")
+@Tag(name="User-problems-sets RESTful API", description = "User-problems-sets CRUD를 할 수 있는 REST API")
+
+public class UserProblemSetController {
+
+
+ private final UserProblemSetService userProblemSetService;
+
+ public UserProblemSetController(UserProblemSetService userProblemSetService) {
+ this.userProblemSetService = userProblemSetService;
+ }
+
+ // 모든 문제 세트 조회
+ @GetMapping
+ public ResponseEntity>> getAllUserProblemSets() {
+ try {
+ List sets = userProblemSetService.getAllUserProblemSets();
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "유저 문제세트 전체 조회 성공", sets));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 조회하지 못했습니다."));
+ }
+ }
+
+ // 마이페이지 - 내가 만든 문제세트 조회
+ @GetMapping("/me")
+ public ResponseEntity> getMyUserProblemSet(HttpSession session) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ try {
+ UserProblemSet set = userProblemSetService.getUserProblemSetByMemberId(memberId);
+
+ if (set == null) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "등록된 유저 문제세트가 없습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "나의 유저 문제세트 조회 성공", set));
+
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 나의 문제세트를 조회하지 못했습니다."));
+ }
+ }
+
+ // 마이페이지 - 문제세트 생성
+ @PostMapping
+ public ResponseEntity> createMyUserProblemSet(HttpSession session) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ try {
+ //문제 세트가 생성되기전에는 PK가 존재하질 않아서
+ //문제세트를 등록함과 동시에 이 PK값을 UserProblemController에도 넘겨줘야함.
+ //따라서 UserProblemSet 객체를 생성하여 memberId를 세팅해서 넘겨줌,
+ //프론트에서 이를 받아서 다시 문제 하나하나를 user_problem테이블에 저장 할 때 이 userProblemSetId를 같이 넘겨줘야함.
+ //이 부분은 프론트와 백엔드간의 협의가 필요.
+ //UserProblemSetMapper에도 generateKey를 추가해서 PK값을 set에 담을 수 있었다.
+ UserProblemSet set = new UserProblemSet();
+ set.setMemberId(memberId);
+ System.out.println(set);
+
+ int result = userProblemSetService.createUserProblemSet(set);
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "유저 문제세트 생성에 실패했습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.CREATED)
+ .body(ApiResponse.success(HttpStatus.CREATED, "유저 문제세트 생성 성공", null));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 생성하지 못했습니다."));
+ }
+ }
+
+ // 마이페이지 - 문제세트 삭제
+ @DeleteMapping("/{userProblemSetId}")
+ public ResponseEntity> deleteUserProblemSet(
+ @PathVariable Long userProblemSetId,
+ HttpSession session
+ ) {
+ Long memberId = (Long) session.getAttribute("memberId");
+ if (memberId == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
+ .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다."));
+ }
+
+ // TODO: userProblemSetId가 memberId가 만든 세트인지 owner 체크 로직을 Service/Dao에 추가하면 더 안전함
+
+ try {
+ int result = userProblemSetService.deleteUserProblemSet(userProblemSetId);
+
+ if (result == 0) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND)
+ .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "삭제할 유저 문제세트가 존재하지 않습니다."));
+ }
+
+ return ResponseEntity.status(HttpStatus.OK)
+ .body(ApiResponse.success(HttpStatus.OK, "유저 문제세트 삭제 성공", null));
+
+ } catch (IllegalArgumentException e) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+ .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage()));
+ } catch (Exception e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 삭제하지 못했습니다."));
+ }
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java
index df05e7e..1f75116 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java
@@ -2,14 +2,24 @@
import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+
import com.codeboy.mvc.model.dto.Comment;
+@Mapper
public interface CommentDao {
- public List selectAllByProblemId(long problemId);
-
- public void insertComment(Comment comment);
+ public List selectCommentsByuserProblemSetId(Long userProblemSetId);
+
+ //유저문제세트 id에다가 댓글을 달아야하므로 long userProblemSetId으로 지정
+ public int insertComment(Long userProblemSetId, Comment comment);
- public void updateComment(Comment comment);
+ //조회된 댓글의 id를 가져와서 수정하고 삭제함.
+ public int updateComment(Long commentId, Comment comment);
+
+ //조회된 댓글의 id를 가져와서 수정하고 삭제함.
+ public int deleteComment(Long commentId);
+
+ //댓글아이디로 댓글 작성자의 아이디를 가져옴
+ public Long selectCommentOwnerId(Long commentId);
- public void deleteComment(long commentId);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java
index 5a617b2..2782bb9 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java
@@ -1,17 +1,32 @@
package com.codeboy.mvc.model.dao;
import java.util.List;
+import java.util.Map;
-import com.codeboy.mvc.model.dto.Problem;
+import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse;
+import org.apache.ibatis.annotations.Mapper;
+@Mapper
public interface IncorrectNoteDao {
//유저의 아이디로 유저가 틀린 문제들의 모음을 조회
- public List selectIncorrectProblems(long memberId);
+ //sql의 관점에서
+ //
+ public List selectIncorrectProblems(Long memberId);
//유저가 자신의 오답노트 안에서 문제를 삭제
- public void deleteIncorrectProblem(long memberId, long problemId);
-
+ public int deleteIncorrectProblem(Long incorrectNoteId);
+
//오답노트에 문제 추가
- public void insertIncorrectProblem(long memberId, long problemId);
+ public void insertIncorrectProblem(Map params);
+
+ //문제 존재 여부 체크
+ boolean existsProblemById(Long problemId);
+
+ //유저 문제 존재 여부 체크
+ boolean existsUserProblemById(Long userProblemId);
+
+ //incorrectNoteId 존재 여부 체크
+ boolean existsIncorrectNoteById(Long incorrectNoteId);
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java
index 6615b7c..b1dc5e2 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java
@@ -1,18 +1,38 @@
package com.codeboy.mvc.model.dao;
import com.codeboy.mvc.model.dto.Member;
-import com.codeboy.mvc.model.dto.MemberUpdateRequest;
-
+import com.codeboy.mvc.model.dto.request.MemberUpdateRequest;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
public interface MemberDao {
- public void insertMember(Member member);
-
- public Member selectMember(String id, String password);
-
- //멤버 삭제 -> db에서는 status 변경
- public void delete(int memberId);
-
+ int insertMember(Member member);
+
+ Member selectMemberById(Long memberId);
+
+ //멤버 삭제 -> db에서는 status 변경
+ int deactivateMemberById(Long memberId);
+
//멤버 업데이트 -> db에서는 patch(nickname, email, id)
- public void updateMember(long memberId, MemberUpdateRequest memberUpdateRequest);
+ int updateMemberById(@Param("memberId") Long memberId, @Param("update") MemberUpdateRequest memberUpdateRequest);
+
+ //아이디 중복 체크
+ Boolean existsId(String id);
+
+ //닉네임 중복 체크
+ Boolean existsNickname(String nickname);
+
+ //이메일 중복 체크
+ Boolean existsEmail(String email);
+
+ //멤버가 활성화 상태인지 확인
+ Boolean isMemberActive(Long memberId);
+
+ // 회원 비활성화(탈퇴) - status, isDeleted 업데이트
+ int deleteMember(long memberId);
+
+ // 로그인 - ID와 password로 회원 조회
+ Member selectMemberByIdAndPassword(@Param("id") String id, @Param("password") String password);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java
index d98bc01..8cbad50 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java
@@ -4,9 +4,11 @@
import com.codeboy.common.Category;
import com.codeboy.mvc.model.dto.Problem;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
public interface ProblemDao {
//문제 조회
- public List selectProblem(Category category);
-
+ public List selectProblem(@Param("limit") int limit, @Param("category") Category category);
}
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java
index 67a7ce4..60f8a2d 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java
@@ -4,28 +4,32 @@
import com.codeboy.mvc.model.dto.QuizRoom;
import com.codeboy.mvc.model.dto.QuizRoomMember;
+import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse;
+import org.apache.ibatis.annotations.Mapper;
+@Mapper
public interface QuizRoomDao {
-
//quiz_room 테이블. 퀴즈룸 생성. 생성된 퀴즈룸 id 반환
- public int insertQuizRoom();
-
- //quiz_room_member 테이블에 값 넣기 (퀴즈방 입장) - 참가자/호스트
- public void insertMemberToQuizRoom(QuizRoomMember quizRoomMember);
+ public void insertQuizRoom(QuizRoom room);
-
+ //quiz_room_member 테이블에 값 넣기 (퀴즈방 입장) - 참가자/호스트
+ public int insertMemberToQuizRoom(QuizRoomMember quizRoomMember);
//모든 퀴즈룸 조회하기
public List selectAllQuizRoom();
-
-
//하나의 퀴즈룸 조회(참가 멤버확인)
- public List selectOneQuizRoom(int roomId);
-
+ public List selectOneQuizRoom(Long roomId);
+
//퀴즈룸 수정
-
-
//퀴즈룸 삭제
- public void deleteQuizRoom(long roomId);
+ //TODO : 지금은 멤버가 전체 퀴즈방 테이블에 중복으로 들어가면 에러 터짐
+ //TODO : 채팅방이 끝나면 바로 삭제하는 로직 만들어야 함.
+
+ public boolean deleteQuizRoom(Long roomId);
+
+ //퀴즈룸 존재하는지 확인
+ public int existsQuizRoom(Long roomId);
+ //퀴즈룸에 특정 멤버가 있는지 확인
+ public int isDuplicatedMember(Long memberId);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java
index 40a981a..f61f3ab 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java
@@ -7,15 +7,15 @@
public interface ScoreDao {
//스코어 등록
public void insertScore(UserScore userScore);
-
- //모든 스코어 조회
+
+ //모든 스코어 조회
public List selectAllUserScore();
-
+
//한 멤버의 스코어 조회
- public int selectOneUserScore(int memberId);
-
+ public int selectOneUserScore(Long memberId);
+
//멤버 스코어 업데이트
public void updateUserScore(UserScore userScore);
-
-
+
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java
deleted file mode 100644
index 537c5e1..0000000
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.codeboy.mvc.model.dao;
-
-import java.util.List;
-
-import com.codeboy.mvc.model.dto.Problem;
-import com.codeboy.mvc.model.dto.UserProblem;
-
-public interface UserIncorrectNoteDao {
-
- //유저의 아이디로 유저가 틀린 문제들의 모음을 조회
- public List selectUserIncorrectProblems(long memberId);
-
- //유저가 자신의 오답노트 안에서 문제를 삭제
- public void deleteUserIncorrectProblem(long memberId, long userProblemId);
-
- //(중간자 테이블)오답노트에 문제 추가
- public void insertUserIncorrectProblem(long memberId, long userProblemId);
-}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java
index b2ad1ff..61f7b11 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java
@@ -3,23 +3,22 @@
import java.util.List;
import com.codeboy.common.Category;
-import com.codeboy.mvc.model.dto.Problem;
import com.codeboy.mvc.model.dto.UserProblem;
public interface UserProblemDao extends ProblemDao{
-
- //문제세트 조회
- public List selectUserProblem(Category category);
- //문제 생성하기
- public void insertUserProblem(UserProblem userProblem);
-
- //문제 세트 만들기
- public void insertUserProblemSet(List userProblemList);
-
- //문제 수정
- public void updateUserProblem(UserProblem userProblem);
-
- //문제 삭제
- public int deleteUserProblem(int id);
+
+ //유저제작 문제풀이 페이지에서 문제세트를 선택했을때, 그 문제세트에 속한문제들 조회
+ List selectProblemsByUserProblemSetId(Long userProblemSetId);
+
+ //문제 생성 시 문제세트를 등록함과 동시에 문제들을 전부 user_problem 테이블에 넣기
+ int insertUserProblemList(List userProblems);
+
+ //제작자 본인이 자신의 문제들을 수정하는 로직
+ int updateUserProblem(UserProblem userProblem);
+
+ //제작자 본인이 자신의 문제를 삭제하는 로직
+ int deleteUserProblemById(Long userProblemId);
+
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java
new file mode 100644
index 0000000..3607529
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java
@@ -0,0 +1,25 @@
+package com.codeboy.mvc.model.dao;
+
+import com.codeboy.mvc.model.dto.Problem;
+import com.codeboy.mvc.model.dto.UserProblem;
+import com.codeboy.mvc.model.dto.UserProblemSet;
+
+import java.util.List;
+
+public interface UserProblemSetDao {
+ //다른 사용자들이 만든 유저제작 문제세트들을 모두 조회
+ List selectUserProblemSets();
+
+
+ //마이페이지에서 자신이 제작한 문제세트 조회
+ UserProblemSet selectUserProblemSetByMemberId(long memberId);
+
+ //문제 세트 등록 memberId = 문제 제작자만 넘겨주고 문제들은 problemDao에서 insertUserProblem으로 넣음 (마이페이지에서 생성)
+ int insertUserProblemSet(Long memberId);
+
+ // 문제세트 삭제 (마이페이지에서 삭제)
+ int deleteUserProblemSetById(Long userProblemSetId);
+
+
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java
index 032ad95..bf7599c 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java
@@ -13,7 +13,8 @@
@NoArgsConstructor
@Getter
@Setter
-public class Comment {
+public class
+Comment {
private long commentId;
private long memberId;
private String content;
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java
index f5d7ed0..288ba54 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java
@@ -15,4 +15,7 @@ public class IncorrectNote {
private long incorrectNoteId;
private long memberId;
private long problemId;
+ private long userProblemId;
+ private Boolean isUserProblem;
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java
index f657755..25f245b 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java
@@ -1,7 +1,9 @@
package com.codeboy.mvc.model.dto;
import java.sql.Timestamp;
+
import com.codeboy.common.Status;
+
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -20,7 +22,10 @@ public class Member {
private String nickname;
private String email;
private Timestamp signupDate;
- private Status status;
+ private Boolean isActive;
private Timestamp deletedDate;
+
+
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java
deleted file mode 100644
index eb94e12..0000000
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.codeboy.mvc.model.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Getter
-@Setter
-@Schema(description="유저 정보 수정 DTO")
-public class MemberUpdateRequest {
- private String nickName;
- private String id;
- private String email;
-}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java
index e93caa9..195d199 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java
@@ -22,5 +22,5 @@ public class Problem {
private String choice4;
private String answer;
private Category category;
-
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java
index 059c4aa..01ca516 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java
@@ -13,4 +13,6 @@
@Schema(description="퀴즈방 DTO")
public class QuizRoom {
private long roomId;
+
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java
index d6cdd6e..8079a50 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java
@@ -12,8 +12,34 @@
@Setter
@Schema(description="회원 퀴즈방 중간 DTO")
public class QuizRoomMember {
- private long quizRoomMemberId;
- private long memberId;
- private long roomId;
+ private Long quizRoomMemberId;
+ private Long memberId;
+ private Long roomId;
private Boolean isHost;
+ public Long getQuizRoomMemberId() {
+ return quizRoomMemberId;
+ }
+ public void setQuizRoomMemberId(long quizRoomMemberId) {
+ this.quizRoomMemberId = quizRoomMemberId;
+ }
+ public Long getMemberId() {
+ return memberId;
+ }
+ public void setMemberId(long memberId) {
+ this.memberId = memberId;
+ }
+ public Long getRoomId() {
+ return roomId;
+ }
+ public void setRoomId(long roomId) {
+ this.roomId = roomId;
+ }
+ public Boolean getIsHost() {
+ return isHost;
+ }
+ public void setIsHost(Boolean isHost) {
+ this.isHost = isHost;
+ }
+
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java
index fa4f9b3..85aecc3 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java
@@ -14,7 +14,7 @@
@Getter
@Setter
public class UserProblem {
- private long userProblemId;
+ private Long userProblemId;
private String problemDescription;
private Category category;
private String choice1;
@@ -23,5 +23,5 @@ public class UserProblem {
private String choice4;
private String answer;
private int commentCount;
- private long userProblemSetId;
+ private Long userProblemSetId;
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java
index d460eb4..9a90aa1 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java
@@ -5,13 +5,15 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import lombok.ToString;
@Schema(description = "유저제작문제세트 DTO")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
+@ToString
public class UserProblemSet {
- private long userProblemSetId;
- private long memberId;
+ private Long userProblemSetId;
+ private Long memberId;
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java
index e65a711..03c3747 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java
@@ -15,6 +15,6 @@
public class UserScore {
private long memberId;
private int score;
-
+
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java
new file mode 100644
index 0000000..5614319
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java
@@ -0,0 +1,17 @@
+package com.codeboy.mvc.model.dto.request;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class CommentUpdateRequest {
+ //댓글을 업데이트할 때 content만 수정하니 수정할 content만 전달하는 DTO
+ private String content;
+ private long memberId;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java
new file mode 100644
index 0000000..8a366f4
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java
@@ -0,0 +1,14 @@
+package com.codeboy.mvc.model.dto.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+public class DuplicateCheckRequest {
+ private String value;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java
new file mode 100644
index 0000000..ffc92f4
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java
@@ -0,0 +1,14 @@
+package com.codeboy.mvc.model.dto.request;
+
+import lombok.*;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+@ToString
+public class IncorrectNoteRequest {
+ private Long problemId;
+ private Long userProblemId;
+ private Boolean isUserProblem;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java
new file mode 100644
index 0000000..079bd8c
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java
@@ -0,0 +1,14 @@
+package com.codeboy.mvc.model.dto.request;
+
+import lombok.*;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+@ToString
+public class JoinQuizRoomRequest {
+ private long memberId;
+ private long roomId;
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java
new file mode 100644
index 0000000..3ddd898
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java
@@ -0,0 +1,16 @@
+package com.codeboy.mvc.model.dto.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+@AllArgsConstructor
+@NoArgsConstructor
+@Setter
+@Getter
+public class LoginRequest {
+ //로그인을 할 때에는 id와 password만 사용하니 이를 간편하게 전달하기 위한 DTO
+ private String id;
+ private String password;
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java
new file mode 100644
index 0000000..c8b5e96
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java
@@ -0,0 +1,18 @@
+package com.codeboy.mvc.model.dto.request;
+
+ import io.swagger.v3.oas.annotations.media.Schema;
+ import lombok.AllArgsConstructor;
+ import lombok.Getter;
+ import lombok.NoArgsConstructor;
+ import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+@Schema(description="유저 정보 수정 DTO")
+public class MemberUpdateRequest {
+ private String nickname;
+ private String id;
+ private String email;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java
new file mode 100644
index 0000000..f257350
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java
@@ -0,0 +1,34 @@
+package com.codeboy.mvc.model.dto.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.http.HttpStatus;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApiResponse {
+ private HttpStatus status;
+ private String message;
+ private T data;
+
+// public ApiResponse(HttpStatus status, String message, T data) {
+// super();
+// this.status = status;
+// this.message = message;
+// this.data = data;
+// }
+
+ public static ApiResponse success(HttpStatus status, T data) {
+ return new ApiResponse(status, null, data);
+ }
+
+ public static ApiResponse success(HttpStatus status, String message, T data) {
+ return new ApiResponse(status, message, data);
+ }
+
+ public static ApiResponse failure(HttpStatus status, String message) {
+ return new ApiResponse(status, message, null);
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java
new file mode 100644
index 0000000..17a6543
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java
@@ -0,0 +1,15 @@
+package com.codeboy.mvc.model.dto.response;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class DuplicateCheckResponse {
+ private boolean duplicated;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java
new file mode 100644
index 0000000..9ec59ed
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java
@@ -0,0 +1,13 @@
+package com.codeboy.mvc.model.dto.response;
+
+import lombok.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class GetQuizRoomMembersResponse {
+ private Long memberId;
+ private String nickname;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java
new file mode 100644
index 0000000..f86a4c2
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java
@@ -0,0 +1,20 @@
+package com.codeboy.mvc.model.dto.response;
+
+import com.codeboy.common.Category;
+import lombok.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class IncorrectNoteResponse {
+ private Long incorrectNoteId;
+ private String problemDescription;
+ private String choice1;
+ private String choice2;
+ private String choice3;
+ private String choice4;
+ private String answer;
+ private Category category;
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java
index 962d5ec..d1b02dd 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java
@@ -1,5 +1,24 @@
package com.codeboy.mvc.model.service;
-public class CommentService {
+import java.util.List;
+
+import com.codeboy.mvc.model.dto.Comment;
+
+public interface CommentService {
+ /**
+ * 유저제작 문제 세트Id로 조회
+ * @param userProblemSetId
+ * @return
+ */
+ public List getAllCommentsById(Long userProblemSetId);
+
+ //유저제작 문제 세트Id로 조회후 해당 세트에 댓글 작성
+ public int addComment(Long userProblemSetId, Comment comment);
+//
+ public int updateComment(Long commentId, Comment comment);
+//
+ public int deleteComment(Long commentId);
+
+ public Long getCommentOwnerId(Long commentId);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java
new file mode 100644
index 0000000..2d1dedd
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java
@@ -0,0 +1,58 @@
+package com.codeboy.mvc.model.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.codeboy.mvc.model.dao.CommentDao;
+import com.codeboy.mvc.model.dto.Comment;
+
+@Service
+public class CommentServiceImpl implements CommentService {
+
+ private final CommentDao commentDao;
+
+ @Autowired
+ public CommentServiceImpl(CommentDao commentDao) {
+ this.commentDao = commentDao;
+ }
+
+
+
+ // 유저제작 문제 세트Id로 조회
+ @Override
+ public List getAllCommentsById(Long userProblemSetId) {
+ return commentDao.selectCommentsByuserProblemSetId(userProblemSetId);
+ }
+
+ @Override
+ public int addComment(Long userProblemSetId, Comment comment ) {
+
+ return commentDao.insertComment(userProblemSetId, comment);
+ }
+
+
+
+ @Override
+ public int updateComment(Long commentId, Comment comment) {
+ return commentDao.updateComment(commentId, comment);
+
+ }
+
+
+
+ @Override
+ public int deleteComment(Long commentId) {
+ return commentDao.deleteComment(commentId);
+
+ }
+
+
+ @Override
+ public Long getCommentOwnerId(Long commentId){
+ return commentDao.selectCommentOwnerId(commentId);
+ }
+
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java
index e8d653a..a3a64b2 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java
@@ -1,5 +1,78 @@
package com.codeboy.mvc.model.service;
+import com.codeboy.mvc.model.dao.IncorrectNoteDao;
+import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse;
+import org.apache.ibatis.javassist.NotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
public class IncorrectNoteService {
+ @Autowired
+ private IncorrectNoteDao incorrectNoteDao;
+
+ public Long addIncorrectNote(Long memberId, Long problemId, Long userProblemId, Boolean isUserProblem) {
+ if (!isUserProblem) {
+ boolean exists = incorrectNoteDao.existsProblemById(problemId);
+ if (!exists) {
+ throw new IllegalArgumentException("DB에 존재하지 않는 문제 ID입니다.:" + problemId);
+ }
+ } else {
+ boolean exists = incorrectNoteDao.existsUserProblemById(userProblemId);
+ if (!exists) {
+ throw new IllegalArgumentException("DB에 존재하지 않는 유저문제 ID입니다.:" + userProblemId);
+ }
+ }
+
+ //TODO : DB에 존재하는지 검증하는 로직 필요
+ if (memberId == null) {
+ throw new IllegalArgumentException("유효하지 않은 회원 ID입니다.: " + memberId);
+ }
+ if ((!isUserProblem && (problemId == null || userProblemId != null)) ||
+ (isUserProblem && (problemId != null || userProblemId == null))) {
+ throw new IllegalArgumentException("유효하지 않은 문제 ID 입니다.:" );
+ }
+
+ Map params = new HashMap<>();
+ params.put("memberId", memberId);
+ params.put("problemId", problemId);
+ params.put("userProblemId", userProblemId);
+ params.put("isUserProblem", isUserProblem);
+
+ params.put("incorrectNoteId", null);
+
+ incorrectNoteDao.insertIncorrectProblem(params);
+
+ BigInteger id = (BigInteger) params.get("incorrectNoteId");
+ return id != null ? id.longValue() : null;
+
+ }
+
+ public List getIncorrectNoteList(Long memberId) throws NotFoundException {
+ //TODO : DB에 존재하는지 검증하는 로직
+// if (memberId == null || !memberDao.existsById(memberId)) {
+// throw new IllegalArgumentException("유효하지 않은 회원 ID입니다.");
+// }
+ if (memberId == null) {
+ throw new IllegalArgumentException("유효하지 않은 회원 ID입니다.");
+ }
+ List list = incorrectNoteDao.selectIncorrectProblems(memberId);
+
+ if (list == null || list.isEmpty()) {
+ throw new NotFoundException("오답노트를 조회할 수 없습니다.");
+ }
+ return list;
+ }
+ public void deleteIncorrectNote(long incorrectNoteId) {
+ boolean exists = incorrectNoteDao.existsIncorrectNoteById(incorrectNoteId);
+ if (!exists) {
+ throw new IllegalArgumentException("DB에 존재하지 않는 오답노트ID 입니다.: " + incorrectNoteId);
+ }
+ incorrectNoteDao.deleteIncorrectProblem(incorrectNoteId);
+ }
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java
index 90316ff..697bd31 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java
@@ -1,19 +1,31 @@
package com.codeboy.mvc.model.service;
import com.codeboy.mvc.model.dto.Member;
-import com.codeboy.mvc.model.dto.MemberUpdateRequest;
-import com.codeboy.mvc.model.dto.MemberUpdateRequest;
+import com.codeboy.mvc.model.dto.request.MemberUpdateRequest;
public interface MemberService {
- //회원가입
- public void signupMember();
- //회원 정보 가져오기기
- public Member readMember(String id, String password);
+ // 회원정보 조회
+ Member getMemberById(Long memberId);
- //회원 탈퇴
- public void withdrawal(int memberId);
+ // 회원 탈퇴
+ void deactivateMember(Long memberId);
+
+ // 회원 정보 수정
+ void updateMember(Long memberId, MemberUpdateRequest memberUpdateRequest);
+
+ // 중복검사 (ID)
+ boolean checkIdDuplicate(String id);
+
+ // 중복검사 (Nickname)
+ boolean checkNicknameDuplicate(String nickname);
+
+ // 중복검사 (Email)
+ boolean checkEmailDuplicate(String email);
+
+ int signUp(Member member);
+
- //회원정보 수정-> db에서는 patch(nickname, email, id)
- public void updateMember(long memberId, MemberUpdateRequest memberUpdateRequest);
+ // 로그인
+ Member login(String id, String password);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java
new file mode 100644
index 0000000..b7fb51a
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java
@@ -0,0 +1,118 @@
+package com.codeboy.mvc.model.service;
+
+import com.codeboy.mvc.model.dao.MemberDao;
+import com.codeboy.mvc.model.dto.Member;
+import com.codeboy.mvc.model.dto.request.MemberUpdateRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.NoSuchElementException;
+
+@Service
+public class MemberServiceImpl implements MemberService {
+ @Autowired
+ MemberDao memberDao;
+
+ //회원 정보 가져오기기
+ public Member getMemberById(Long memberId) {
+ isMemberExist(memberId);
+
+ Member member = memberDao.selectMemberById(memberId);
+ if (member == null) {
+ throw new NoSuchElementException("Id에 해당하는 회원 정보를 찾을 수 없습니다. memberId:" + memberId);
+ }
+ return member;
+ };
+
+ //회원 탈퇴
+ public void deactivateMember(Long memberId){
+ isMemberExist(memberId);
+
+ int updatedRows = memberDao.deactivateMemberById(memberId);
+ if (updatedRows == 0) {
+ throw new IllegalStateException("회원 탈퇴 실패 : memberId: " + memberId);
+ }
+ }
+
+
+ public void updateMember(Long memberId, MemberUpdateRequest memberUpdateRequest){
+ isMemberExist(memberId);
+ //중복된 id, email이 있는지 검증 로직
+ String id = memberUpdateRequest.getId();
+ String nickname = memberUpdateRequest.getNickname();
+ String email = memberUpdateRequest.getEmail();
+ validateMemberUpdate(id, nickname, email);
+
+ int affectedRows = memberDao.updateMemberById(memberId, memberUpdateRequest);
+
+ if (affectedRows == 0) {
+ throw new IllegalStateException("회원 정보 수정에 실패하였습니다. memberId: " + memberId);
+ }
+
+ };
+ public boolean checkIdDuplicate(String id) {
+ if (id == null) {
+ throw new IllegalArgumentException("유효하지 않은 Id 입니다.");
+ }
+ return memberDao.existsId(id);
+ }
+
+ public boolean checkNicknameDuplicate(String nickname ) {
+ if (nickname == null) {
+ throw new IllegalArgumentException("유효하지 않은 Id 입니다.");
+ }
+ return memberDao.existsNickname(nickname);
+ }
+
+ public boolean checkEmailDuplicate(String email) {
+ if (email == null) {
+ throw new IllegalArgumentException("유효하지 않은 Id 입니다.");
+ }
+ return memberDao.existsEmail(email);
+ }
+
+ @Override
+ public int signUp(Member member) {
+ return memberDao.insertMember(member);
+ }
+
+ public void isMemberExist(Long memberId) {
+ if (memberId == null) {
+ throw new IllegalArgumentException("유효하지 않은 memberId입니다. memberId: " );
+ }
+
+ boolean isActive = memberDao.isMemberActive(memberId);
+ if (!isActive) {
+ throw new IllegalArgumentException("비활성화된 멤버 id 입니다. memberId: " + memberId);
+ }
+ }
+
+ // 최종 제출 시 전체 검증
+ public void validateMemberUpdate(String id, String nickname, String email) {
+ if (id != null && memberDao.existsId(id)) {
+ throw new IllegalArgumentException("중복된 ID입니다.");
+ }
+ if (nickname != null && memberDao.existsNickname(nickname)) {
+ throw new IllegalArgumentException("중복된 닉네임입니다.");
+ }
+ if (email != null && memberDao.existsEmail(email)) {
+ throw new IllegalArgumentException("중복된 이메일입니다.");
+ }
+ }
+
+ // 로그인
+ public Member login(String id, String password) {
+ if (id == null || password == null) {
+ throw new IllegalArgumentException("ID와 비밀번호를 입력해주세요.");
+ }
+
+ Member member = memberDao.selectMemberByIdAndPassword(id, password);
+ if (member == null) {
+ throw new IllegalArgumentException("ID 또는 비밀번호가 올바르지 않습니다.");
+ }
+
+ return member;
+ }
+
+
+};
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java
index 959188b..bd2fd88 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java
@@ -1,5 +1,14 @@
package com.codeboy.mvc.model.service;
-public class ProblemService {
+import com.codeboy.common.Category;
+import com.codeboy.mvc.model.dto.Problem;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface ProblemService {
+
+ public List getProblems(int limit, Category category);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java
new file mode 100644
index 0000000..38ead0c
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java
@@ -0,0 +1,34 @@
+package com.codeboy.mvc.model.service;
+
+import com.codeboy.common.Category;
+import com.codeboy.mvc.model.dao.ProblemDao;
+import com.codeboy.mvc.model.dto.Problem;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ProblemServiceImpl implements ProblemService{
+ @Autowired
+ private ProblemDao problemDao;
+
+ @Override
+ public List getProblems(int limit, Category category) {
+ if (limit <= 0) {
+ throw new IllegalArgumentException("limit의 수는 0이상이어야 합니다. limit: " + limit);
+ }
+ if (category == null) {
+ throw new IllegalArgumentException("category의 값은 null이 될 수 없습니다. : category: ");
+ }
+ List problems = problemDao.selectProblem(limit,category);
+
+ //만약 요청 수보다 존재하는 문제 수가 적다면
+ if (limit > problems.size()) {
+ throw new IllegalArgumentException("limit의 값은 문제 수보다 클 수 없습니다. problems: " + problems.size());
+ }
+
+ return problems;
+ }
+
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java
index cd3f65e..ea246e0 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java
@@ -2,22 +2,84 @@
import java.util.List;
+import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.codeboy.mvc.model.dao.QuizRoomDao;
import com.codeboy.mvc.model.dto.QuizRoom;
+import com.codeboy.mvc.model.dto.QuizRoomMember;
+import org.springframework.stereotype.Service;
+
+@Service
+public class QuizRoomService{
+ @Autowired
+ private QuizRoomDao quizRoomDao;
+
+ public List getQuizRoomList() {
+ List quizRooms = quizRoomDao.selectAllQuizRoom();
+ if (quizRooms == null) {
+ throw new IllegalStateException("퀴즈방 정보를 가져오지 못했습니다");
+ }
+ return quizRooms;
+ }
+
+ public List getOneQuizRoomMember(long roomId) {
+ validateRoomId(roomId);
+
+ List memberList = quizRoomDao.selectOneQuizRoom(roomId);
+ if (memberList.isEmpty()) {
+ throw new IllegalStateException("퀴즈방에 참가자가 없습니다.");
+ }
+ return memberList;
+ }
+
+ public long createQuizRoom() {
+ QuizRoom room = new QuizRoom();
+ quizRoomDao.insertQuizRoom(room);
+
+ Long roomId = room.getRoomId();
+
+ validateRoomId(roomId);
+ return roomId;
+ }
+
+ public void joinQuizRoom(QuizRoomMember quizRoomMember) {
+ Long memberId = quizRoomMember.getMemberId();
+ Long roomId = quizRoomMember.getRoomId();
+ validateRoomId(roomId);
+ memberDuplicateCheck(memberId);
+
+ //멤버 id가 실제로 존재하는지 확인
+ if (memberId == null) {
+ throw new IllegalArgumentException("멤버 ID가 유효하지 않습니다. :" );
+ }
+ //TODO : 채팅방 참여 인원이 초과되었는지 검증하는 로직 추가
+ int rowAffected = quizRoomDao.insertMemberToQuizRoom(quizRoomMember);
+ if (rowAffected <= 0) {
+ throw new IllegalStateException("퀴즈방 입장에 실패하였습니다.");
+ }
+ }
+
+ public void deleteQuizRoom(long roomId) {
+ validateRoomId(roomId);
+ boolean deleted = quizRoomDao.deleteQuizRoom(roomId);
+ if (!deleted) {
+ throw new IllegalStateException("퀴즈방 삭제에 실패했습니다.");
+ }
+ }
+
+ private void validateRoomId(Long roomId) {
+ boolean existRoom = quizRoomDao.existsQuizRoom(roomId) > 0;
+ if (roomId == null || roomId <= 0 || !existRoom) {
+ throw new IllegalArgumentException("퀴즈방 ID가 유효하지 않습니다. : " + roomId);
+ }
+ }
+
+ private void memberDuplicateCheck(Long memberId) {
+ boolean duplicated = quizRoomDao.isDuplicatedMember(memberId) > 0;
+ if (duplicated) {
+ throw new IllegalArgumentException("한 멤버는 하나의 채팅방에만 들어갈 수 있습니다.");
+ }
+ }
-public interface QuizRoomService {
-
- //퀴즈방 전체 조회
- public List getQuizRoomList();
-
- //퀴즈 방 만들기 -> 생성된 퀴즈방 id를 return
- //퀴즈방 생성하고 생성된 퀴즈방에 방장 id 넣기
- public int createQuizRoom(long memberId);
-
- //참가자 채팅방 입장
- public void joinQuizRoom(long memberId, long quizRoomId);
-
- //퀴즈룸 삭제
- public boolean deleteQuizRoom()
-
-
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java
index c315c3b..2a25a51 100644
--- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java
@@ -1,5 +1,16 @@
package com.codeboy.mvc.model.service;
-public class UserProblemService {
+import com.codeboy.mvc.model.dto.UserProblem;
+import java.util.List;
+
+public interface UserProblemService {
+
+ List getProblemsByUserProblemSetId(Long userProblemSetId);
+
+ int addUserProblems(List userProblems);
+
+ int updateUserProblem(UserProblem userProblem);
+
+ int deleteUserProblem(Long userProblemId);
}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java
new file mode 100644
index 0000000..d3c23a5
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java
@@ -0,0 +1,46 @@
+package com.codeboy.mvc.model.service;
+
+import com.codeboy.mvc.model.dao.UserProblemDao;
+import com.codeboy.mvc.model.dto.UserProblem;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserProblemServiceImpl implements UserProblemService {
+
+ private final UserProblemDao userProblemDao;
+
+ public UserProblemServiceImpl(UserProblemDao userProblemDao) {
+ this.userProblemDao = userProblemDao;
+ }
+
+ @Override
+ public List getProblemsByUserProblemSetId(Long userProblemSetId) {
+ return userProblemDao.selectProblemsByUserProblemSetId(userProblemSetId);
+ }
+
+ @Override
+ public int addUserProblems(List userProblems) {
+ if (userProblems == null || userProblems.isEmpty()) {
+ throw new IllegalArgumentException("등록할 문제가 하나 이상 있어야 합니다.");
+ }
+ return userProblemDao.insertUserProblemList(userProblems);
+ }
+
+ @Override
+ public int updateUserProblem(UserProblem userProblem) {
+ if (userProblem == null || userProblem.getUserProblemId() == null) {
+ throw new IllegalArgumentException("수정할 문제를 찾을 수 없습니다. 문제Id를 확인하세요.");
+ }
+ return userProblemDao.updateUserProblem(userProblem);
+ }
+
+ @Override
+ public int deleteUserProblem(Long userProblemId) {
+ if (userProblemId == null) {
+ throw new IllegalArgumentException("삭제할 문제를 찾을 수 없습니다. 삭제할 문제 ID를 확인하세요.");
+ }
+ return userProblemDao.deleteUserProblemById(userProblemId);
+ }
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java
new file mode 100644
index 0000000..e063488
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java
@@ -0,0 +1,15 @@
+package com.codeboy.mvc.model.service;
+
+import com.codeboy.mvc.model.dto.UserProblemSet;
+
+import java.util.List;
+
+public interface UserProblemSetService {
+ List getAllUserProblemSets();
+
+ UserProblemSet getUserProblemSetByMemberId(Long memberId);
+
+ int createUserProblemSet(UserProblemSet set);
+
+ int deleteUserProblemSet(Long userProblemSetId);
+}
diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java
new file mode 100644
index 0000000..4d15576
--- /dev/null
+++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java
@@ -0,0 +1,46 @@
+package com.codeboy.mvc.model.service;
+
+import com.codeboy.mvc.model.dao.UserProblemSetDao;
+import com.codeboy.mvc.model.dto.UserProblemSet;
+import org.springframework.stereotype.Service;
+
+
+import java.util.List;
+
+@Service
+public class UserProblemSetServiceImpl implements UserProblemSetService {
+
+ private final UserProblemSetDao userProblemSetDao;
+
+ public UserProblemSetServiceImpl(UserProblemSetDao userProblemSetDao) {
+ this.userProblemSetDao = userProblemSetDao;
+ }
+
+ @Override
+ public List getAllUserProblemSets() {
+ return userProblemSetDao.selectUserProblemSets();
+ }
+
+ @Override
+ public UserProblemSet getUserProblemSetByMemberId(Long memberId) {
+ long memberIdl = memberId;
+ return userProblemSetDao.selectUserProblemSetByMemberId(memberIdl);
+ }
+
+ @Override
+ public int createUserProblemSet(UserProblemSet set) {
+ if (set.getMemberId() == null) {
+ throw new IllegalArgumentException("회원 ID가 필요합니다.");
+ }
+ long memberId = set.getMemberId();
+ return userProblemSetDao.insertUserProblemSet(memberId);
+ }
+
+ @Override
+ public int deleteUserProblemSet(Long userProblemSetId) {
+ if (userProblemSetId == null) {
+ throw new IllegalArgumentException("삭제할 문제세트 ID가 필요합니다.");
+ }
+ return userProblemSetDao.deleteUserProblemSetById(userProblemSetId);
+ }
+}
diff --git a/codeBoy_backend/src/main/resources/application.properties b/codeBoy_backend/src/main/resources/application.properties
index 603f194..b8c6c8d 100644
--- a/codeBoy_backend/src/main/resources/application.properties
+++ b/codeBoy_backend/src/main/resources/application.properties
@@ -9,7 +9,7 @@ spring.application.name=codeBoy_backend
#
#
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.url=jdbc:mysql://localhost:3306/ssafy_board?serverTimezone=UTC
+spring.datasource.url=jdbc:mysql://localhost:3306/board_test?serverTimezone=UTC
spring.datasource.username=ssafy
spring.datasource.password=ssafy
diff --git a/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml b/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml
new file mode 100644
index 0000000..21c1d0f
--- /dev/null
+++ b/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml b/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml
new file mode 100644
index 0000000..b9d4395
--- /dev/null
+++ b/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DELETE FROM incorrect_note
+ WHERE incorrect_note_id = #{incorrectNoteId}
+
+
+
+
+ INSERT INTO incorrect_note (member_id, problem_id, user_problem_id, is_user_problem)
+ VALUES (#{memberId}, #{problemId}, #{userProblemId}, #{isUserProblem})
+
+
+
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml b/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml
new file mode 100644
index 0000000..d253890
--- /dev/null
+++ b/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+ UPDATE member
+ SET is_active = 0
+ WHERE member_id = #{memberId}
+
+
+
+ UPDATE member
+
+
+ nickname = #{update.nickname}
+
+
+ id = #{update.id}
+
+
+ email = #{update.email}
+
+
+ WHERE member_id = #{memberId}
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO member (ID, password, nickname, email, is_active, signup_date)
+ VALUES (#{id}, #{password}, #{nickname}, #{email}, 1, NOW());
+
+
+
+
+
diff --git a/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml b/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml
index b994f53..c48de03 100644
--- a/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml
+++ b/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml
@@ -1 +1,15 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml b/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml
index d5660c4..29115a6 100644
--- a/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml
+++ b/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml
@@ -3,23 +3,24 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
+
INSERT INTO
quiz_room()
VALUES();
-
+ parameterType="QuizRoomMember"
+ >
INSERT INTO
quiz_room_member(member_id, room_id, is_host)
- VALUES(#{memberId, roomId, isHost});
+ VALUES(#{memberId}, #{roomId}, #{isHost});
@@ -31,21 +32,35 @@
-
-
- DELETE FROM quiz_room_member
- WHERE room_id = #{roomId}
-
+
DELETE FROM quiz_room
WHERE room_id = #{roomId};
+
+
+
+
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml b/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml
index b994f53..d0b38ce 100644
--- a/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml
+++ b/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml
@@ -1 +1,8 @@
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/resources/mappers/UserMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserMapper.xml
deleted file mode 100644
index b994f53..0000000
--- a/codeBoy_backend/src/main/resources/mappers/UserMapper.xml
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml
new file mode 100644
index 0000000..3168486
--- /dev/null
+++ b/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO user_problem
+ (problem_description, category, choice_1, choice_2, choice_3, choice_4, answer, comment_count, user_problem_set_id)
+ VALUES
+
+ (#{item.problemDescription}, #{item.category}, #{item.choice1}, #{item.choice2}, #{item.choice3}, #{item.choice4}, #{item.answer}, #{item.commentCount}, #{item.userProblemSetId})
+
+
+
+
+
+
+ UPDATE user_problem
+ SET problem_description = #{problemDescription},
+ category = #{category},
+ choice_1 = #{choice1},
+ choice_2 = #{choice2},
+ choice_3 = #{choice3},
+ choice_4 = #{choice4},
+ answer = #{answer},
+ comment_count = #{commentCount}
+ WHERE user_problem_id = #{userProblemId}
+
+
+
+
+ DELETE FROM user_problem
+ WHERE user_problem_id = #{userProblemId}
+
+
+
+
+
+
+
diff --git a/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml
new file mode 100644
index 0000000..3498e1b
--- /dev/null
+++ b/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO user_problem_set (member_id)
+ VALUES (#{memberId})
+
+
+
+
+ DELETE FROM user_problem_set
+ WHERE user_problem_set_id = #{userProblemSetId}
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e38678b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,19 @@
+
+ 4.0.0
+ Backend
+ Backend
+ 0.0.1-SNAPSHOT
+
+ codeBoy_backend/src/main/java
+ codeBoy_backend/src/test/java
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 17
+
+
+
+
+
\ No newline at end of file
diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b55046a
--- /dev/null
+++ b/target/classes/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Build-Jdk-Spec: 17
+Created-By: Maven Integration for Eclipse
+
diff --git a/target/classes/META-INF/maven/Backend/Backend/pom.properties b/target/classes/META-INF/maven/Backend/Backend/pom.properties
new file mode 100644
index 0000000..4c142b9
--- /dev/null
+++ b/target/classes/META-INF/maven/Backend/Backend/pom.properties
@@ -0,0 +1,7 @@
+#Generated by Maven Integration for Eclipse
+#Fri Nov 28 09:27:07 KST 2025
+m2e.projectLocation=C\:\\minseung\\Backend
+m2e.projectName=Backend
+groupId=Backend
+artifactId=Backend
+version=0.0.1-SNAPSHOT
diff --git a/target/classes/META-INF/maven/Backend/Backend/pom.xml b/target/classes/META-INF/maven/Backend/Backend/pom.xml
new file mode 100644
index 0000000..e38678b
--- /dev/null
+++ b/target/classes/META-INF/maven/Backend/Backend/pom.xml
@@ -0,0 +1,19 @@
+
+ 4.0.0
+ Backend
+ Backend
+ 0.0.1-SNAPSHOT
+
+ codeBoy_backend/src/main/java
+ codeBoy_backend/src/test/java
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 17
+
+
+
+
+
\ No newline at end of file
diff --git a/target/classes/com/codeboy/CodeBoyBackendApplication.class b/target/classes/com/codeboy/CodeBoyBackendApplication.class
new file mode 100644
index 0000000..61bc0a9
Binary files /dev/null and b/target/classes/com/codeboy/CodeBoyBackendApplication.class differ
diff --git a/target/classes/com/codeboy/common/Category.class b/target/classes/com/codeboy/common/Category.class
new file mode 100644
index 0000000..fda0c6a
Binary files /dev/null and b/target/classes/com/codeboy/common/Category.class differ
diff --git a/target/classes/com/codeboy/common/Status.class b/target/classes/com/codeboy/common/Status.class
new file mode 100644
index 0000000..c5f01af
Binary files /dev/null and b/target/classes/com/codeboy/common/Status.class differ
diff --git a/target/classes/com/codeboy/mvc/config/SwaggerConfig.class b/target/classes/com/codeboy/mvc/config/SwaggerConfig.class
new file mode 100644
index 0000000..995d405
Binary files /dev/null and b/target/classes/com/codeboy/mvc/config/SwaggerConfig.class differ
diff --git a/target/classes/com/codeboy/mvc/controller/MemberController.class b/target/classes/com/codeboy/mvc/controller/MemberController.class
new file mode 100644
index 0000000..172042d
Binary files /dev/null and b/target/classes/com/codeboy/mvc/controller/MemberController.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/CommentDao.class b/target/classes/com/codeboy/mvc/model/dao/CommentDao.class
new file mode 100644
index 0000000..26d5a0e
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/CommentDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class b/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class
new file mode 100644
index 0000000..da97c4b
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/MemberDao.class b/target/classes/com/codeboy/mvc/model/dao/MemberDao.class
new file mode 100644
index 0000000..775c4f4
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/MemberDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class b/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class
new file mode 100644
index 0000000..2dfb2b1
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class b/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class
new file mode 100644
index 0000000..b99a818
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class b/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class
new file mode 100644
index 0000000..2d9d910
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class b/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class
new file mode 100644
index 0000000..caf04d0
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class b/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class
new file mode 100644
index 0000000..48c9073
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/Comment.class b/target/classes/com/codeboy/mvc/model/dto/Comment.class
new file mode 100644
index 0000000..98fa9b5
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Comment.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class b/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class
new file mode 100644
index 0000000..f68c8d4
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/Member.class b/target/classes/com/codeboy/mvc/model/dto/Member.class
new file mode 100644
index 0000000..c2cd778
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Member.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class b/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class
new file mode 100644
index 0000000..d3baf05
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/Problem.class b/target/classes/com/codeboy/mvc/model/dto/Problem.class
new file mode 100644
index 0000000..05724c8
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Problem.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class b/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class
new file mode 100644
index 0000000..23aa8f2
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class b/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class
new file mode 100644
index 0000000..bf7f780
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class b/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class
new file mode 100644
index 0000000..fa5024b
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/UserProblem.class b/target/classes/com/codeboy/mvc/model/dto/UserProblem.class
new file mode 100644
index 0000000..3a1e832
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserProblem.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class b/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class
new file mode 100644
index 0000000..d724a88
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class differ
diff --git a/target/classes/com/codeboy/mvc/model/dto/UserScore.class b/target/classes/com/codeboy/mvc/model/dto/UserScore.class
new file mode 100644
index 0000000..69aa0f0
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserScore.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/CommentService.class b/target/classes/com/codeboy/mvc/model/service/CommentService.class
new file mode 100644
index 0000000..d44b062
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/CommentService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class b/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class
new file mode 100644
index 0000000..eea54f0
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/MemberService.class b/target/classes/com/codeboy/mvc/model/service/MemberService.class
new file mode 100644
index 0000000..0d73745
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/MemberService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/ProblemService.class b/target/classes/com/codeboy/mvc/model/service/ProblemService.class
new file mode 100644
index 0000000..53d84b2
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/ProblemService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class b/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class
new file mode 100644
index 0000000..11f4bb1
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class b/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class
new file mode 100644
index 0000000..fc89017
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/ScoreService.class b/target/classes/com/codeboy/mvc/model/service/ScoreService.class
new file mode 100644
index 0000000..384f9b4
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/ScoreService.class differ
diff --git a/target/classes/com/codeboy/mvc/model/service/UserProblemService.class b/target/classes/com/codeboy/mvc/model/service/UserProblemService.class
new file mode 100644
index 0000000..3f98a1d
Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/UserProblemService.class differ
diff --git a/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class b/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class
new file mode 100644
index 0000000..12896d7
Binary files /dev/null and b/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class differ