From a3a497df260faa92a1ad5728a0710e1d886dac24 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 01/73] =?UTF-8?q?Article=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java new file mode 100644 index 0000000..d720416 --- /dev/null +++ b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java @@ -0,0 +1,12 @@ +package com.idol.board.repository.article; + +import com.idol.board.domain.entity.Article; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +public interface ArticleJpaRepository extends JpaRepository { + +} From bc9463b03eda818c80d5a999695cf4b311b04338 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:45 +0900 Subject: [PATCH 02/73] =?UTF-8?q?Article=20Custom=20Error=20Exception=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ArticleNotFoundException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/idol/global/exception/ArticleNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java new file mode 100644 index 0000000..caae945 --- /dev/null +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -0,0 +1,11 @@ +package com.idol.global.exception; + +public class ArticleNotFoundException extends RuntimeException { + public ArticleNotFoundException(String message) { + super(message); + } + + public ArticleNotFoundException(Long articleId) { + super("게시물을 찾을 수 없습니다: " + articleId); + } +} \ No newline at end of file From d6a6d72678c41c5bb03d332c111d0bef2b220ae0 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:45:42 +0900 Subject: [PATCH 03/73] =?UTF-8?q?Auditing=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/IdolApplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/idol/IdolApplication.java b/src/main/java/com/idol/IdolApplication.java index 4dfc5f5..062e146 100644 --- a/src/main/java/com/idol/IdolApplication.java +++ b/src/main/java/com/idol/IdolApplication.java @@ -6,6 +6,7 @@ @EnableJpaAuditing @SpringBootApplication +@EnableJpaAuditing public class IdolApplication { public static void main(String[] args) { From 9ef6b4a044b35bc5c60b23d1729015afcf816466 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 04/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From fbce44f8888b4dd32a0ae9245edbdc6549261ef1 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 05/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From 9bd2c347eea267facde597df2fd71441d649a547 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 06/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From 36d5434fc9d7da523aed31618e07dd358c965e85 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:07 +0900 Subject: [PATCH 07/73] =?UTF-8?q?Comment=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/comment/CommentJpaRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java new file mode 100644 index 0000000..8751ff2 --- /dev/null +++ b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java @@ -0,0 +1,8 @@ +package com.idol.board.repository.comment; + +import com.idol.board.domain.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CommentJpaRepository extends JpaRepository { + +} From f8af420ec81216dad8a855e4697b835b5983f058 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:35 +0900 Subject: [PATCH 08/73] =?UTF-8?q?Comment=20Controller=20Create=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateCommentController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java diff --git a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java new file mode 100644 index 0000000..91261de --- /dev/null +++ b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.comment.command; + +import com.idol.board.dto.request.comment.CommentCreateRequestDto; +import com.idol.board.usecase.comment.command.CreateCommentUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateCommentController { + private final CreateCommentUseCase createCommentUseCase; + + @PostMapping("/{articleId}/comment") + public ApiResponse createComment(@PathVariable Long articleId, @RequestBody CommentCreateRequestDto requestDto) { + // TODO :: 인증 연결 + Long userId = 1231414314L; + Long commentId = createCommentUseCase.createComment(requestDto, userId, articleId); + + return ApiResponse.ok(commentId, "댓글 생성 성공"); + } +} From f1ca5781e80ab1a4bc3bbadebb5055ba7147eb14 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 09/73] =?UTF-8?q?application=20yml=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC/=EB=A1=9C=EC=BB=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/main/resources/application.yml --- src/main/resources/application-dev.yml | 28 +++++++++++++++++ src/main/resources/application-local.yml | 38 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4ad3353 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,28 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${DB_URL} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 0 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..8f7c990 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,38 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/board + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 8080 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ + +cloud: + aws: + s3: + bucket: codit-project # 버킷 이름 + stack.auto: false + region.static: ap-northeast-2 # 버킷 리전 + credentials: + access-key: ${ACCESS_KEY} + secret-key: ${SECRET_KEY} From ff0771012a112031c7d3d81caf7c65789b41aa00 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 10/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From 48725a84a66ba4f298b46d0fd7b7becc11c212ef Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 11/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From a4702924b3b8bf33f5c9dddd7792421df1045767 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 12/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From d58ecf5be977566a4daab02b6eb1f5b452c7d3aa Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 13/73] =?UTF-8?q?application.yml=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 ----------------- src/main/resources/application-local.yml | 38 ------------------------ 2 files changed, 66 deletions(-) delete mode 100644 src/main/resources/application-dev.yml delete mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index 4ad3353..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: ${DB_URL} - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: validate - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 0 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 8f7c990..0000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,38 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/board - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 8080 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - -cloud: - aws: - s3: - bucket: codit-project # 버킷 이름 - stack.auto: false - region.static: ap-northeast-2 # 버킷 리전 - credentials: - access-key: ${ACCESS_KEY} - secret-key: ${SECRET_KEY} From a51f859c62f3361c131fc0dcfb8c7efd219075a0 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 14/73] =?UTF-8?q?Article=20Repository=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java deleted file mode 100644 index d720416..0000000 --- a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.idol.board.repository.article; - -import com.idol.board.domain.entity.Article; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.transaction.annotation.Transactional; - -public interface ArticleJpaRepository extends JpaRepository { - -} From 60aec6bea875bd45ab3cf2791bd3174d8c405e38 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:22 +0900 Subject: [PATCH 15/73] =?UTF-8?q?Comment=20Error=20Exception=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/CommentNotFoundException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/idol/global/exception/CommentNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java new file mode 100644 index 0000000..868b874 --- /dev/null +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -0,0 +1,11 @@ +package com.idol.global.exception; + +public class CommentNotFoundException extends RuntimeException { + public CommentNotFoundException(String message) { + super(message); + } + + public CommentNotFoundException(Long commentId) { + super("해당 댓글을 찾을 수 없습니다: " + commentId); + } +} \ No newline at end of file From 68e59b3ddb7bb4b575043dd09ce2a56d81a9f5f3 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:33 +0900 Subject: [PATCH 16/73] =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateCommentController.java | 23 ------------------- .../comment/CommentJpaRepository.java | 8 ------- 2 files changed, 31 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java delete mode 100644 src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java diff --git a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java deleted file mode 100644 index 91261de..0000000 --- a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.comment.command; - -import com.idol.board.dto.request.comment.CommentCreateRequestDto; -import com.idol.board.usecase.comment.command.CreateCommentUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateCommentController { - private final CreateCommentUseCase createCommentUseCase; - - @PostMapping("/{articleId}/comment") - public ApiResponse createComment(@PathVariable Long articleId, @RequestBody CommentCreateRequestDto requestDto) { - // TODO :: 인증 연결 - Long userId = 1231414314L; - Long commentId = createCommentUseCase.createComment(requestDto, userId, articleId); - - return ApiResponse.ok(commentId, "댓글 생성 성공"); - } -} diff --git a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java deleted file mode 100644 index 8751ff2..0000000 --- a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.idol.board.repository.comment; - -import com.idol.board.domain.entity.Comment; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface CommentJpaRepository extends JpaRepository { - -} From 022706f78e266c5956b4f399d40b75254a7d74dd Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:53 +0900 Subject: [PATCH 17/73] =?UTF-8?q?Comment=20Read=20=EC=A0=84=EC=9A=A9=20Dao?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/mapper/CommentReadDao.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/mapper/CommentReadDao.java diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java new file mode 100644 index 0000000..f2f409a --- /dev/null +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java @@ -0,0 +1,14 @@ +package com.idol.board.repository.mapper; + +import java.sql.Timestamp; + +public record CommentReadDao ( + Long commentId, + String content, + Long parentCommentId, + Long writerId, + boolean isDeleted, + Timestamp createdAt, + boolean secret +){ +} \ No newline at end of file From 2e2d2a6391882664221ea9e0bd97c3b1049b097b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 18/73] =?UTF-8?q?application=20yml=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC/=EB=A1=9C=EC=BB=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 +++++++++++++++++ src/main/resources/application-local.yml | 38 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4ad3353 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,28 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${DB_URL} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 0 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..8f7c990 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,38 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/board + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 8080 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ + +cloud: + aws: + s3: + bucket: codit-project # 버킷 이름 + stack.auto: false + region.static: ap-northeast-2 # 버킷 리전 + credentials: + access-key: ${ACCESS_KEY} + secret-key: ${SECRET_KEY} From 0ce44e8f87462c72634799c9040660023ded2427 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 19/73] =?UTF-8?q?Article=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java new file mode 100644 index 0000000..d720416 --- /dev/null +++ b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java @@ -0,0 +1,12 @@ +package com.idol.board.repository.article; + +import com.idol.board.domain.entity.Article; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +public interface ArticleJpaRepository extends JpaRepository { + +} From 9554182d90da6d71a117383afbc2ea8bf294f19a Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 20/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From 3d3c37e0e0e38f9d9902867296980003e1b00d87 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 21/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From 1b1f55fd97db9cf81b7552656026f6c5a7e9a2c4 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 22/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From 172ffb59c92cd07891700ff0789500bc5d7b62be Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 23/73] =?UTF-8?q?application.yml=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 ----------------- src/main/resources/application-local.yml | 38 ------------------------ 2 files changed, 66 deletions(-) delete mode 100644 src/main/resources/application-dev.yml delete mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index 4ad3353..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: ${DB_URL} - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: validate - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 0 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 8f7c990..0000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,38 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/board - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 8080 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - -cloud: - aws: - s3: - bucket: codit-project # 버킷 이름 - stack.auto: false - region.static: ap-northeast-2 # 버킷 리전 - credentials: - access-key: ${ACCESS_KEY} - secret-key: ${SECRET_KEY} From 532182669c75f6410c2639fe94c70beb4ead36c5 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 24/73] =?UTF-8?q?Article=20Repository=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java deleted file mode 100644 index d720416..0000000 --- a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.idol.board.repository.article; - -import com.idol.board.domain.entity.Article; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.transaction.annotation.Transactional; - -public interface ArticleJpaRepository extends JpaRepository { - -} From b58e1c7d3a351f6da332c8abb6fd62207054bf88 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Fri, 6 Jun 2025 22:54:45 +0900 Subject: [PATCH 25/73] =?UTF-8?q?=EA=B0=9C=ED=96=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/idol/board/repository/mapper/CommentReadDao.java | 2 +- .../com/idol/global/exception/ArticleNotFoundException.java | 2 +- .../com/idol/global/exception/CommentNotFoundException.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java index f2f409a..05005a5 100644 --- a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java @@ -11,4 +11,4 @@ public record CommentReadDao ( Timestamp createdAt, boolean secret ){ -} \ No newline at end of file +} diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java index caae945..f236d78 100644 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -8,4 +8,4 @@ public ArticleNotFoundException(String message) { public ArticleNotFoundException(Long articleId) { super("게시물을 찾을 수 없습니다: " + articleId); } -} \ No newline at end of file +} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java index 868b874..6874d5a 100644 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -8,4 +8,4 @@ public CommentNotFoundException(String message) { public CommentNotFoundException(Long commentId) { super("해당 댓글을 찾을 수 없습니다: " + commentId); } -} \ No newline at end of file +} From 88ab8877b2d40ccae9937a7d9387be7308a19be9 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:07:50 +0900 Subject: [PATCH 26/73] =?UTF-8?q?ErrorException=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/ArticleNotFoundException.java | 22 +++++++++---------- .../exception/CommentNotFoundException.java | 22 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java index f236d78..867310d 100644 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -1,11 +1,11 @@ -package com.idol.global.exception; - -public class ArticleNotFoundException extends RuntimeException { - public ArticleNotFoundException(String message) { - super(message); - } - - public ArticleNotFoundException(Long articleId) { - super("게시물을 찾을 수 없습니다: " + articleId); - } -} +//package com.idol.global.exception; +// +//public class ArticleNotFoundException extends RuntimeException { +// public ArticleNotFoundException(String message) { +// super(message); +// } +// +// public ArticleNotFoundException(Long articleId) { +// super("게시물을 찾을 수 없습니다: " + articleId); +// } +//} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java index 6874d5a..2834ebb 100644 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -1,11 +1,11 @@ -package com.idol.global.exception; - -public class CommentNotFoundException extends RuntimeException { - public CommentNotFoundException(String message) { - super(message); - } - - public CommentNotFoundException(Long commentId) { - super("해당 댓글을 찾을 수 없습니다: " + commentId); - } -} +//package com.idol.global.exception; +// +//public class CommentNotFoundException extends RuntimeException { +// public CommentNotFoundException(String message) { +// super(message); +// } +// +// public CommentNotFoundException(Long commentId) { +// super("해당 댓글을 찾을 수 없습니다: " + commentId); +// } +//} From db0231db710e36c7c4efd94c3ab820d1925aba89 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:13:23 +0900 Subject: [PATCH 27/73] =?UTF-8?q?Dao=20->=20QueryResult=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/mapper/CommentReadDao.java | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/mapper/CommentReadDao.java diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java deleted file mode 100644 index 05005a5..0000000 --- a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.idol.board.repository.mapper; - -import java.sql.Timestamp; - -public record CommentReadDao ( - Long commentId, - String content, - Long parentCommentId, - Long writerId, - boolean isDeleted, - Timestamp createdAt, - boolean secret -){ -} From 86656a0a612a35dabfdc251d3644dc3b816a0c2c Mon Sep 17 00:00:00 2001 From: JIWON <82360230+qowl880@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:53:18 +0900 Subject: [PATCH 28/73] Update IdolApplication.java --- src/main/java/com/idol/IdolApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/idol/IdolApplication.java b/src/main/java/com/idol/IdolApplication.java index 062e146..4dfc5f5 100644 --- a/src/main/java/com/idol/IdolApplication.java +++ b/src/main/java/com/idol/IdolApplication.java @@ -6,7 +6,6 @@ @EnableJpaAuditing @SpringBootApplication -@EnableJpaAuditing public class IdolApplication { public static void main(String[] args) { From 51a83c30e6d76cc5d132e6fa2963f4c8e314ef76 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 14 Jun 2025 09:27:21 +0900 Subject: [PATCH 29/73] =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=20=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ArticleNotFoundException.java | 11 ----------- .../global/exception/CommentNotFoundException.java | 11 ----------- 2 files changed, 22 deletions(-) delete mode 100644 src/main/java/com/idol/global/exception/ArticleNotFoundException.java delete mode 100644 src/main/java/com/idol/global/exception/CommentNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java deleted file mode 100644 index 867310d..0000000 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -//package com.idol.global.exception; -// -//public class ArticleNotFoundException extends RuntimeException { -// public ArticleNotFoundException(String message) { -// super(message); -// } -// -// public ArticleNotFoundException(Long articleId) { -// super("게시물을 찾을 수 없습니다: " + articleId); -// } -//} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java deleted file mode 100644 index 2834ebb..0000000 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -//package com.idol.global.exception; -// -//public class CommentNotFoundException extends RuntimeException { -// public CommentNotFoundException(String message) { -// super(message); -// } -// -// public CommentNotFoundException(Long commentId) { -// super("해당 댓글을 찾을 수 없습니다: " + commentId); -// } -//} From caa98e9fd3573ba89a14dc5881f311dc8f15ed35 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:36 +0900 Subject: [PATCH 30/73] =?UTF-8?q?Article=20Entity=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/board/domain/entity/Article.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/idol/board/domain/entity/Article.java b/src/main/java/com/idol/board/domain/entity/Article.java index 6ce03dd..08b92ed 100644 --- a/src/main/java/com/idol/board/domain/entity/Article.java +++ b/src/main/java/com/idol/board/domain/entity/Article.java @@ -21,8 +21,11 @@ @Table(name = "article") @Getter @ToString +@Builder +@AllArgsConstructor // 생성자마다 builder 사용 @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Where(clause = "is_deleted = false") public class Article extends BaseEntity { From fd72d43f25a20f73adb4a4172c062c1fc67e4704 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 31/73] =?UTF-8?q?Article=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java new file mode 100644 index 0000000..d720416 --- /dev/null +++ b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java @@ -0,0 +1,12 @@ +package com.idol.board.repository.article; + +import com.idol.board.domain.entity.Article; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +public interface ArticleJpaRepository extends JpaRepository { + +} From 506ac5fbf51ddfeda114287d8a556dc0f35c1ccc Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:45 +0900 Subject: [PATCH 32/73] =?UTF-8?q?Article=20Custom=20Error=20Exception=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ArticleNotFoundException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/idol/global/exception/ArticleNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java new file mode 100644 index 0000000..caae945 --- /dev/null +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -0,0 +1,11 @@ +package com.idol.global.exception; + +public class ArticleNotFoundException extends RuntimeException { + public ArticleNotFoundException(String message) { + super(message); + } + + public ArticleNotFoundException(Long articleId) { + super("게시물을 찾을 수 없습니다: " + articleId); + } +} \ No newline at end of file From 0d99d084626df159974e7126b9450981d08f5353 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:45:42 +0900 Subject: [PATCH 33/73] =?UTF-8?q?Auditing=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/IdolApplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/idol/IdolApplication.java b/src/main/java/com/idol/IdolApplication.java index 4dfc5f5..062e146 100644 --- a/src/main/java/com/idol/IdolApplication.java +++ b/src/main/java/com/idol/IdolApplication.java @@ -6,6 +6,7 @@ @EnableJpaAuditing @SpringBootApplication +@EnableJpaAuditing public class IdolApplication { public static void main(String[] args) { From 255317d5d071f95cb545d4d2a503d678462aa78e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 34/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From ea4d0aef77c04f4a5e2b1ec471936c20fad2ceaa Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 35/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From 6a4dc268549a48cfe70ad7ca880d655000580815 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 36/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From 1f226ffdca17f6f9ccb56767530cdeda175391f0 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:52:47 +0900 Subject: [PATCH 37/73] =?UTF-8?q?S3=20=EA=B4=80=EB=A0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=B0=8F=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imageUpload/service/command/ImageExpirationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java b/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java index 01c65ec..f92c408 100644 --- a/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java +++ b/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java @@ -12,4 +12,4 @@ public class ImageExpirationService implements ImageExpirationUseCase { public Duration getExpirationDuration() { return Duration.ofHours(1); } -} \ No newline at end of file +} From 3ef68dd4efd46c9724cf30e1ba5d35a6e6aeebdd Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:07 +0900 Subject: [PATCH 38/73] =?UTF-8?q?Comment=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/comment/CommentJpaRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java new file mode 100644 index 0000000..8751ff2 --- /dev/null +++ b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java @@ -0,0 +1,8 @@ +package com.idol.board.repository.comment; + +import com.idol.board.domain.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CommentJpaRepository extends JpaRepository { + +} From 54dfcf0f42fa0ff1640b817518a689e1a641cb7d Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:35 +0900 Subject: [PATCH 39/73] =?UTF-8?q?Comment=20Controller=20Create=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateCommentController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java diff --git a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java new file mode 100644 index 0000000..91261de --- /dev/null +++ b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.comment.command; + +import com.idol.board.dto.request.comment.CommentCreateRequestDto; +import com.idol.board.usecase.comment.command.CreateCommentUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateCommentController { + private final CreateCommentUseCase createCommentUseCase; + + @PostMapping("/{articleId}/comment") + public ApiResponse createComment(@PathVariable Long articleId, @RequestBody CommentCreateRequestDto requestDto) { + // TODO :: 인증 연결 + Long userId = 1231414314L; + Long commentId = createCommentUseCase.createComment(requestDto, userId, articleId); + + return ApiResponse.ok(commentId, "댓글 생성 성공"); + } +} From e5248a9f21f85ef9f5631d167e26f8c3230b6f5e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 40/73] =?UTF-8?q?application=20yml=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC/=EB=A1=9C=EC=BB=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/main/resources/application.yml --- src/main/resources/application-dev.yml | 28 +++++++++++++++++ src/main/resources/application-local.yml | 38 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4ad3353 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,28 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${DB_URL} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 0 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..8f7c990 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,38 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/board + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 8080 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ + +cloud: + aws: + s3: + bucket: codit-project # 버킷 이름 + stack.auto: false + region.static: ap-northeast-2 # 버킷 리전 + credentials: + access-key: ${ACCESS_KEY} + secret-key: ${SECRET_KEY} From ba32d253aa71f415f5a559d86700e4a1828230da Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 41/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From 95b2c4e7eafefe5ce7c6ad24a7c89cb6203cd063 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 42/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From be3516d4f71614169b218effafad64ace8891c14 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 43/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From 0650529ea6d2d7ef4f5faf7a305cc889b480009c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 44/73] =?UTF-8?q?application.yml=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 ----------------- src/main/resources/application-local.yml | 38 ------------------------ 2 files changed, 66 deletions(-) delete mode 100644 src/main/resources/application-dev.yml delete mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index 4ad3353..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: ${DB_URL} - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: validate - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 0 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 8f7c990..0000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,38 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/board - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 8080 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - -cloud: - aws: - s3: - bucket: codit-project # 버킷 이름 - stack.auto: false - region.static: ap-northeast-2 # 버킷 리전 - credentials: - access-key: ${ACCESS_KEY} - secret-key: ${SECRET_KEY} From 3820004584d1b5378beb6bc6fcedb8ac5c04467d Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 45/73] =?UTF-8?q?Article=20Repository=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java deleted file mode 100644 index d720416..0000000 --- a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.idol.board.repository.article; - -import com.idol.board.domain.entity.Article; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.transaction.annotation.Transactional; - -public interface ArticleJpaRepository extends JpaRepository { - -} From 0a2a99d758e933371a374d87fb445045f97b4baf Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:22 +0900 Subject: [PATCH 46/73] =?UTF-8?q?Comment=20Error=20Exception=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/CommentNotFoundException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/idol/global/exception/CommentNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java new file mode 100644 index 0000000..868b874 --- /dev/null +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -0,0 +1,11 @@ +package com.idol.global.exception; + +public class CommentNotFoundException extends RuntimeException { + public CommentNotFoundException(String message) { + super(message); + } + + public CommentNotFoundException(Long commentId) { + super("해당 댓글을 찾을 수 없습니다: " + commentId); + } +} \ No newline at end of file From 7e43fdde54a8449c14e61b5bf98dac2a69c1398e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:33 +0900 Subject: [PATCH 47/73] =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateCommentController.java | 23 ------------------- .../comment/CommentJpaRepository.java | 8 ------- 2 files changed, 31 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java delete mode 100644 src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java diff --git a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java b/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java deleted file mode 100644 index 91261de..0000000 --- a/src/main/java/com/idol/board/controller/comment/command/CreateCommentController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.comment.command; - -import com.idol.board.dto.request.comment.CommentCreateRequestDto; -import com.idol.board.usecase.comment.command.CreateCommentUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateCommentController { - private final CreateCommentUseCase createCommentUseCase; - - @PostMapping("/{articleId}/comment") - public ApiResponse createComment(@PathVariable Long articleId, @RequestBody CommentCreateRequestDto requestDto) { - // TODO :: 인증 연결 - Long userId = 1231414314L; - Long commentId = createCommentUseCase.createComment(requestDto, userId, articleId); - - return ApiResponse.ok(commentId, "댓글 생성 성공"); - } -} diff --git a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java b/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java deleted file mode 100644 index 8751ff2..0000000 --- a/src/main/java/com/idol/board/repository/comment/CommentJpaRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.idol.board.repository.comment; - -import com.idol.board.domain.entity.Comment; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface CommentJpaRepository extends JpaRepository { - -} From 244275cfcf6161e3e1512aaf685df6569c23d84c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:53 +0900 Subject: [PATCH 48/73] =?UTF-8?q?Comment=20Read=20=EC=A0=84=EC=9A=A9=20Dao?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/mapper/CommentReadDao.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/mapper/CommentReadDao.java diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java new file mode 100644 index 0000000..f2f409a --- /dev/null +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java @@ -0,0 +1,14 @@ +package com.idol.board.repository.mapper; + +import java.sql.Timestamp; + +public record CommentReadDao ( + Long commentId, + String content, + Long parentCommentId, + Long writerId, + boolean isDeleted, + Timestamp createdAt, + boolean secret +){ +} \ No newline at end of file From db691666a4a780da94e81d2e7f40533358f50daa Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 49/73] =?UTF-8?q?application=20yml=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC/=EB=A1=9C=EC=BB=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 +++++++++++++++++ src/main/resources/application-local.yml | 38 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4ad3353 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,28 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${DB_URL} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 0 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..8f7c990 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,38 @@ +spring: + application: + name: idol + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/board + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + highlight_sql: true + generate_statistics: false + show-sql: true + open-in-view: false + +server: + port: 8080 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ + +cloud: + aws: + s3: + bucket: codit-project # 버킷 이름 + stack.auto: false + region.static: ap-northeast-2 # 버킷 리전 + credentials: + access-key: ${ACCESS_KEY} + secret-key: ${SECRET_KEY} From d68caea21f8e6ac70ef602b395fbdd5ac3e7f52d Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 50/73] =?UTF-8?q?Article=20Repository=20Jpa=20/=20Query=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java new file mode 100644 index 0000000..d720416 --- /dev/null +++ b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java @@ -0,0 +1,12 @@ +package com.idol.board.repository.article; + +import com.idol.board.domain.entity.Article; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +public interface ArticleJpaRepository extends JpaRepository { + +} From 5d30c8f056fc6c8a46f1e122b72ea494fa22375a Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 51/73] =?UTF-8?q?Article=20Create=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java new file mode 100644 index 0000000..c8af750 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java @@ -0,0 +1,27 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.dto.request.article.ArticleCreateRequestDto; +import com.idol.board.usecase.article.command.CreateArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class CreateArticleController { + + private final CreateArticleUseCase createArticleUseCase; + + @PostMapping() + public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { + Long writerId = 1312441414L; + Long articleId = createArticleUseCase.createArticle(requestDto, writerId); + return ApiResponse.ok(articleId, "게시글 작성 성공"); + } + + +} From 2af16f63c789c40f1d8972aa00dd66830e2392dd Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 52/73] =?UTF-8?q?Article=20Delete=20Controller=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/DeleteArticleController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java new file mode 100644 index 0000000..3d62df2 --- /dev/null +++ b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java @@ -0,0 +1,23 @@ +package com.idol.board.controller.article.command; + +import com.idol.board.usecase.article.command.DeleteArticleUseCase; +import com.idol.global.common.response.ApiResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/board") +@RequiredArgsConstructor +public class DeleteArticleController { + private final DeleteArticleUseCase deleteArticleUseCase; + + @DeleteMapping("/{articleId}") + public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { + Long resultId = deleteArticleUseCase.delete(articleId); + + return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); + } +} From e5f2345d14d0506b3f9c56ae4b104a95ce5137f4 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 53/73] =?UTF-8?q?Article=20Controller=20CUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/CreateArticleController.java | 27 ------------------- .../command/DeleteArticleController.java | 23 ---------------- 2 files changed, 50 deletions(-) delete mode 100644 src/main/java/com/idol/board/controller/article/command/CreateArticleController.java delete mode 100644 src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java diff --git a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java b/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java deleted file mode 100644 index c8af750..0000000 --- a/src/main/java/com/idol/board/controller/article/command/CreateArticleController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.dto.request.article.ArticleCreateRequestDto; -import com.idol.board.usecase.article.command.CreateArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class CreateArticleController { - - private final CreateArticleUseCase createArticleUseCase; - - @PostMapping() - public ApiResponse createArticle(@RequestBody ArticleCreateRequestDto requestDto) { - Long writerId = 1312441414L; - Long articleId = createArticleUseCase.createArticle(requestDto, writerId); - return ApiResponse.ok(articleId, "게시글 작성 성공"); - } - - -} diff --git a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java b/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java deleted file mode 100644 index 3d62df2..0000000 --- a/src/main/java/com/idol/board/controller/article/command/DeleteArticleController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.idol.board.controller.article.command; - -import com.idol.board.usecase.article.command.DeleteArticleUseCase; -import com.idol.global.common.response.ApiResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/board") -@RequiredArgsConstructor -public class DeleteArticleController { - private final DeleteArticleUseCase deleteArticleUseCase; - - @DeleteMapping("/{articleId}") - public ApiResponse deleteArticle(@PathVariable("articleId") Long articleId) { - Long resultId = deleteArticleUseCase.delete(articleId); - - return ApiResponse.ok(resultId, "게시물 삭제가 완료되었습니다."); - } -} From 349d461d484791f818bf9cf3207686542ea6ccc5 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 54/73] =?UTF-8?q?application.yml=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 28 ----------------- src/main/resources/application-local.yml | 38 ------------------------ 2 files changed, 66 deletions(-) delete mode 100644 src/main/resources/application-dev.yml delete mode 100644 src/main/resources/application-local.yml diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index 4ad3353..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: ${DB_URL} - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: validate - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 0 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml deleted file mode 100644 index 8f7c990..0000000 --- a/src/main/resources/application-local.yml +++ /dev/null @@ -1,38 +0,0 @@ -spring: - application: - name: idol - - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/board - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - highlight_sql: true - generate_statistics: false - show-sql: true - open-in-view: false - -server: - port: 8080 - -eureka: - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - -cloud: - aws: - s3: - bucket: codit-project # 버킷 이름 - stack.auto: false - region.static: ap-northeast-2 # 버킷 리전 - credentials: - access-key: ${ACCESS_KEY} - secret-key: ${SECRET_KEY} From ca48857fd06a074218fcb8778ef0e43343075c54 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:07 +0900 Subject: [PATCH 55/73] =?UTF-8?q?SoftDelete=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/board/domain/entity/Article.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/idol/board/domain/entity/Article.java b/src/main/java/com/idol/board/domain/entity/Article.java index 08b92ed..bf8c9f8 100644 --- a/src/main/java/com/idol/board/domain/entity/Article.java +++ b/src/main/java/com/idol/board/domain/entity/Article.java @@ -21,8 +21,6 @@ @Table(name = "article") @Getter @ToString -@Builder -@AllArgsConstructor // 생성자마다 builder 사용 @NoArgsConstructor(access = AccessLevel.PROTECTED) @Where(clause = "is_deleted = false") From ccb363374130f2f658ddf81566bc16d3d6dab4df Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 56/73] =?UTF-8?q?Article=20Repository=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/article/ArticleJpaRepository.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java diff --git a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java b/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java deleted file mode 100644 index d720416..0000000 --- a/src/main/java/com/idol/board/repository/article/ArticleJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.idol.board.repository.article; - -import com.idol.board.domain.entity.Article; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.transaction.annotation.Transactional; - -public interface ArticleJpaRepository extends JpaRepository { - -} From 6c65db6f5392c457c735a7580cff003e88df17e5 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Fri, 6 Jun 2025 22:54:45 +0900 Subject: [PATCH 57/73] =?UTF-8?q?=EA=B0=9C=ED=96=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/idol/board/repository/mapper/CommentReadDao.java | 2 +- .../com/idol/global/exception/ArticleNotFoundException.java | 2 +- .../com/idol/global/exception/CommentNotFoundException.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java index f2f409a..05005a5 100644 --- a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java @@ -11,4 +11,4 @@ public record CommentReadDao ( Timestamp createdAt, boolean secret ){ -} \ No newline at end of file +} diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java index caae945..f236d78 100644 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -8,4 +8,4 @@ public ArticleNotFoundException(String message) { public ArticleNotFoundException(Long articleId) { super("게시물을 찾을 수 없습니다: " + articleId); } -} \ No newline at end of file +} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java index 868b874..6874d5a 100644 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -8,4 +8,4 @@ public CommentNotFoundException(String message) { public CommentNotFoundException(Long commentId) { super("해당 댓글을 찾을 수 없습니다: " + commentId); } -} \ No newline at end of file +} From 2a59c9e54e8734b459565f3364cfebdd12733643 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:07:50 +0900 Subject: [PATCH 58/73] =?UTF-8?q?ErrorException=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/ArticleNotFoundException.java | 22 +++++++++---------- .../exception/CommentNotFoundException.java | 22 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java index f236d78..867310d 100644 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java @@ -1,11 +1,11 @@ -package com.idol.global.exception; - -public class ArticleNotFoundException extends RuntimeException { - public ArticleNotFoundException(String message) { - super(message); - } - - public ArticleNotFoundException(Long articleId) { - super("게시물을 찾을 수 없습니다: " + articleId); - } -} +//package com.idol.global.exception; +// +//public class ArticleNotFoundException extends RuntimeException { +// public ArticleNotFoundException(String message) { +// super(message); +// } +// +// public ArticleNotFoundException(Long articleId) { +// super("게시물을 찾을 수 없습니다: " + articleId); +// } +//} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java index 6874d5a..2834ebb 100644 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ b/src/main/java/com/idol/global/exception/CommentNotFoundException.java @@ -1,11 +1,11 @@ -package com.idol.global.exception; - -public class CommentNotFoundException extends RuntimeException { - public CommentNotFoundException(String message) { - super(message); - } - - public CommentNotFoundException(Long commentId) { - super("해당 댓글을 찾을 수 없습니다: " + commentId); - } -} +//package com.idol.global.exception; +// +//public class CommentNotFoundException extends RuntimeException { +// public CommentNotFoundException(String message) { +// super(message); +// } +// +// public CommentNotFoundException(Long commentId) { +// super("해당 댓글을 찾을 수 없습니다: " + commentId); +// } +//} From 5808c31aa0def536a16b02e5ad7f85c327f13601 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:13:23 +0900 Subject: [PATCH 59/73] =?UTF-8?q?Dao=20->=20QueryResult=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/repository/mapper/CommentReadDao.java | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/main/java/com/idol/board/repository/mapper/CommentReadDao.java diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java b/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java deleted file mode 100644 index 05005a5..0000000 --- a/src/main/java/com/idol/board/repository/mapper/CommentReadDao.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.idol.board.repository.mapper; - -import java.sql.Timestamp; - -public record CommentReadDao ( - Long commentId, - String content, - Long parentCommentId, - Long writerId, - boolean isDeleted, - Timestamp createdAt, - boolean secret -){ -} From a0c3afaffbde445876539dc4e74942b17e7a94bc Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:16:52 +0900 Subject: [PATCH 60/73] =?UTF-8?q?S3=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imageUpload/service/command/ImageExpirationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java b/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java index f92c408..01c65ec 100644 --- a/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java +++ b/src/main/java/com/idol/imageUpload/service/command/ImageExpirationService.java @@ -12,4 +12,4 @@ public class ImageExpirationService implements ImageExpirationUseCase { public Duration getExpirationDuration() { return Duration.ofHours(1); } -} +} \ No newline at end of file From 0fe59f700cbd240e5d696cd2bf62877de79fed2d Mon Sep 17 00:00:00 2001 From: JIWON <82360230+qowl880@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:53:18 +0900 Subject: [PATCH 61/73] Update IdolApplication.java --- src/main/java/com/idol/IdolApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/idol/IdolApplication.java b/src/main/java/com/idol/IdolApplication.java index 062e146..4dfc5f5 100644 --- a/src/main/java/com/idol/IdolApplication.java +++ b/src/main/java/com/idol/IdolApplication.java @@ -6,7 +6,6 @@ @EnableJpaAuditing @SpringBootApplication -@EnableJpaAuditing public class IdolApplication { public static void main(String[] args) { From 2015768d1124426cfee82725cb11ca5165276bbc Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 14 Jun 2025 09:27:21 +0900 Subject: [PATCH 62/73] =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=20=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ArticleNotFoundException.java | 11 ----------- .../global/exception/CommentNotFoundException.java | 11 ----------- 2 files changed, 22 deletions(-) delete mode 100644 src/main/java/com/idol/global/exception/ArticleNotFoundException.java delete mode 100644 src/main/java/com/idol/global/exception/CommentNotFoundException.java diff --git a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java b/src/main/java/com/idol/global/exception/ArticleNotFoundException.java deleted file mode 100644 index 867310d..0000000 --- a/src/main/java/com/idol/global/exception/ArticleNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -//package com.idol.global.exception; -// -//public class ArticleNotFoundException extends RuntimeException { -// public ArticleNotFoundException(String message) { -// super(message); -// } -// -// public ArticleNotFoundException(Long articleId) { -// super("게시물을 찾을 수 없습니다: " + articleId); -// } -//} diff --git a/src/main/java/com/idol/global/exception/CommentNotFoundException.java b/src/main/java/com/idol/global/exception/CommentNotFoundException.java deleted file mode 100644 index 2834ebb..0000000 --- a/src/main/java/com/idol/global/exception/CommentNotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -//package com.idol.global.exception; -// -//public class CommentNotFoundException extends RuntimeException { -// public CommentNotFoundException(String message) { -// super(message); -// } -// -// public CommentNotFoundException(Long commentId) { -// super("해당 댓글을 찾을 수 없습니다: " + commentId); -// } -//} From 55d1da8610f85149501a30ec0af8bd9e780e57fd Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 17 Jun 2025 22:28:27 +0900 Subject: [PATCH 63/73] =?UTF-8?q?@Where=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/board/domain/entity/Article.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/idol/board/domain/entity/Article.java b/src/main/java/com/idol/board/domain/entity/Article.java index bf8c9f8..6ce03dd 100644 --- a/src/main/java/com/idol/board/domain/entity/Article.java +++ b/src/main/java/com/idol/board/domain/entity/Article.java @@ -23,7 +23,6 @@ @ToString // 생성자마다 builder 사용 @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Where(clause = "is_deleted = false") public class Article extends BaseEntity { From fb415669a0d21cf2ebf3f5a0f21f9de831df71fc Mon Sep 17 00:00:00 2001 From: baejiwon Date: Thu, 19 Jun 2025 08:53:03 +0900 Subject: [PATCH 64/73] =?UTF-8?q?=EC=98=A4=EB=A5=98=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/JwtServiceIntegrationTest.java | 218 +++++++++--------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java b/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java index e16b3cf..fcc94a3 100644 --- a/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java +++ b/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java @@ -1,109 +1,109 @@ -package com.idol.domains.auth.service; - -import com.idol.domains.auth.repository.RefreshTokenRepository; -import com.idol.global.config.TestcontainersRedisConfig; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.ActiveProfiles; - -import java.util.HashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -@ActiveProfiles("test") -@SpringBootTest -@Import(TestcontainersRedisConfig.class) -class JwtServiceIntegrationTest { - - @Autowired - private JwtService jwtService; - - @Autowired - private RefreshTokenService refreshTokenService; - - @Autowired - private RefreshTokenRepository refreshTokenRepository; - - @Autowired - private RedisTemplate redisTemplate; - - @BeforeEach - void setUp() { - refreshTokenRepository.deleteAll(); - } - - @AfterEach - void tearDown() { - refreshTokenRepository.deleteAll(); - } - - @Test - @DisplayName("토큰 생성과 검증의 전체 플로우가 정상 작동한다") - void tokenLifecycle_Success() { - // given - String memberId = "12345"; - Map claims = new HashMap<>(); - - // when - String accessToken = jwtService.generateAccessToken(memberId, claims); - String refreshToken = jwtService.generateRefreshToken(memberId); - - // then - assertThat(jwtService.isTokenValid(accessToken)).isTrue(); - assertThat(jwtService.isTokenValid(refreshToken)).isTrue(); - - assertThat(jwtService.extractMemberId(accessToken)).isEqualTo(memberId); - assertThat(jwtService.extractMemberId(refreshToken)).isEqualTo(memberId); - - assertThat(jwtService.validateRefreshToken(refreshToken)).isTrue(); - } - - @Test - @DisplayName("잘못된 멤버ID로 토큰 검증 시 실패한다") - void validateToken_WrongMemberId_Fail() { - // given - String memberId = "12345"; - String wrongMemberId = "67890"; - String token = jwtService.generateAccessToken(memberId); - - // when - boolean isValid = jwtService.validateToken(token, wrongMemberId); - - // then - assertThat(isValid).isFalse(); - } - - @Test - @DisplayName("빈 claims로 액세스 토큰을 생성할 수 있다") - void generateAccessToken_EmptyClaims_Success() { - // given - String memberId = "12345"; - - // when - String token = jwtService.generateAccessToken(memberId); - - // then - assertThat(jwtService.isTokenValid(token)).isTrue(); - assertThat(jwtService.extractMemberId(token)).isEqualTo(memberId); - } - - @Test - @DisplayName("존재하지 않는 리프레시 토큰 검증 시 실패한다") - void validateRefreshToken_NotExists_Fail() { - // given - String fakeToken = "fake.refresh.token"; - - // when - boolean isValid = jwtService.validateRefreshToken(fakeToken); - - // then - assertThat(isValid).isFalse(); - } -} +//package com.idol.domains.auth.service; +// +//import com.idol.domains.auth.repository.RefreshTokenRepository; +//import com.idol.global.config.TestcontainersRedisConfig; +//import org.junit.jupiter.api.AfterEach; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.DisplayName; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.context.annotation.Import; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.test.context.ActiveProfiles; +// +//import java.util.HashMap; +//import java.util.Map; +// +//import static org.assertj.core.api.Assertions.assertThat; +// +//@ActiveProfiles("test") +//@SpringBootTest +//@Import(TestcontainersRedisConfig.class) +//class JwtServiceIntegrationTest { +// +// @Autowired +// private JwtService jwtService; +// +// @Autowired +// private RefreshTokenService refreshTokenService; +// +// @Autowired +// private RefreshTokenRepository refreshTokenRepository; +// +// @Autowired +// private RedisTemplate redisTemplate; +// +// @BeforeEach +// void setUp() { +// refreshTokenRepository.deleteAll(); +// } +// +// @AfterEach +// void tearDown() { +// refreshTokenRepository.deleteAll(); +// } +// +// @Test +// @DisplayName("토큰 생성과 검증의 전체 플로우가 정상 작동한다") +// void tokenLifecycle_Success() { +// // given +// String memberId = "12345"; +// Map claims = new HashMap<>(); +// +// // when +// String accessToken = jwtService.generateAccessToken(memberId, claims); +// String refreshToken = jwtService.generateRefreshToken(memberId); +// +// // then +// assertThat(jwtService.isTokenValid(accessToken)).isTrue(); +// assertThat(jwtService.isTokenValid(refreshToken)).isTrue(); +// +// assertThat(jwtService.extractMemberId(accessToken)).isEqualTo(memberId); +// assertThat(jwtService.extractMemberId(refreshToken)).isEqualTo(memberId); +// +// assertThat(jwtService.validateRefreshToken(refreshToken)).isTrue(); +// } +// +// @Test +// @DisplayName("잘못된 멤버ID로 토큰 검증 시 실패한다") +// void validateToken_WrongMemberId_Fail() { +// // given +// String memberId = "12345"; +// String wrongMemberId = "67890"; +// String token = jwtService.generateAccessToken(memberId); +// +// // when +// boolean isValid = jwtService.validateToken(token, wrongMemberId); +// +// // then +// assertThat(isValid).isFalse(); +// } +// +// @Test +// @DisplayName("빈 claims로 액세스 토큰을 생성할 수 있다") +// void generateAccessToken_EmptyClaims_Success() { +// // given +// String memberId = "12345"; +// +// // when +// String token = jwtService.generateAccessToken(memberId); +// +// // then +// assertThat(jwtService.isTokenValid(token)).isTrue(); +// assertThat(jwtService.extractMemberId(token)).isEqualTo(memberId); +// } +// +// @Test +// @DisplayName("존재하지 않는 리프레시 토큰 검증 시 실패한다") +// void validateRefreshToken_NotExists_Fail() { +// // given +// String fakeToken = "fake.refresh.token"; +// +// // when +// boolean isValid = jwtService.validateRefreshToken(fakeToken); +// +// // then +// assertThat(isValid).isFalse(); +// } +//} From f52cf1f004c32bd15e6e44d86c3924929fb451ce Mon Sep 17 00:00:00 2001 From: baejiwon Date: Thu, 19 Jun 2025 09:01:27 +0900 Subject: [PATCH 65/73] =?UTF-8?q?aws=20=EA=B4=80=EB=A0=A8=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/JwtServiceIntegrationTest.java | 218 +++++++++--------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java b/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java index fcc94a3..e16b3cf 100644 --- a/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java +++ b/src/test/java/com/idol/domains/auth/service/JwtServiceIntegrationTest.java @@ -1,109 +1,109 @@ -//package com.idol.domains.auth.service; -// -//import com.idol.domains.auth.repository.RefreshTokenRepository; -//import com.idol.global.config.TestcontainersRedisConfig; -//import org.junit.jupiter.api.AfterEach; -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.context.annotation.Import; -//import org.springframework.data.redis.core.RedisTemplate; -//import org.springframework.test.context.ActiveProfiles; -// -//import java.util.HashMap; -//import java.util.Map; -// -//import static org.assertj.core.api.Assertions.assertThat; -// -//@ActiveProfiles("test") -//@SpringBootTest -//@Import(TestcontainersRedisConfig.class) -//class JwtServiceIntegrationTest { -// -// @Autowired -// private JwtService jwtService; -// -// @Autowired -// private RefreshTokenService refreshTokenService; -// -// @Autowired -// private RefreshTokenRepository refreshTokenRepository; -// -// @Autowired -// private RedisTemplate redisTemplate; -// -// @BeforeEach -// void setUp() { -// refreshTokenRepository.deleteAll(); -// } -// -// @AfterEach -// void tearDown() { -// refreshTokenRepository.deleteAll(); -// } -// -// @Test -// @DisplayName("토큰 생성과 검증의 전체 플로우가 정상 작동한다") -// void tokenLifecycle_Success() { -// // given -// String memberId = "12345"; -// Map claims = new HashMap<>(); -// -// // when -// String accessToken = jwtService.generateAccessToken(memberId, claims); -// String refreshToken = jwtService.generateRefreshToken(memberId); -// -// // then -// assertThat(jwtService.isTokenValid(accessToken)).isTrue(); -// assertThat(jwtService.isTokenValid(refreshToken)).isTrue(); -// -// assertThat(jwtService.extractMemberId(accessToken)).isEqualTo(memberId); -// assertThat(jwtService.extractMemberId(refreshToken)).isEqualTo(memberId); -// -// assertThat(jwtService.validateRefreshToken(refreshToken)).isTrue(); -// } -// -// @Test -// @DisplayName("잘못된 멤버ID로 토큰 검증 시 실패한다") -// void validateToken_WrongMemberId_Fail() { -// // given -// String memberId = "12345"; -// String wrongMemberId = "67890"; -// String token = jwtService.generateAccessToken(memberId); -// -// // when -// boolean isValid = jwtService.validateToken(token, wrongMemberId); -// -// // then -// assertThat(isValid).isFalse(); -// } -// -// @Test -// @DisplayName("빈 claims로 액세스 토큰을 생성할 수 있다") -// void generateAccessToken_EmptyClaims_Success() { -// // given -// String memberId = "12345"; -// -// // when -// String token = jwtService.generateAccessToken(memberId); -// -// // then -// assertThat(jwtService.isTokenValid(token)).isTrue(); -// assertThat(jwtService.extractMemberId(token)).isEqualTo(memberId); -// } -// -// @Test -// @DisplayName("존재하지 않는 리프레시 토큰 검증 시 실패한다") -// void validateRefreshToken_NotExists_Fail() { -// // given -// String fakeToken = "fake.refresh.token"; -// -// // when -// boolean isValid = jwtService.validateRefreshToken(fakeToken); -// -// // then -// assertThat(isValid).isFalse(); -// } -//} +package com.idol.domains.auth.service; + +import com.idol.domains.auth.repository.RefreshTokenRepository; +import com.idol.global.config.TestcontainersRedisConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +@ActiveProfiles("test") +@SpringBootTest +@Import(TestcontainersRedisConfig.class) +class JwtServiceIntegrationTest { + + @Autowired + private JwtService jwtService; + + @Autowired + private RefreshTokenService refreshTokenService; + + @Autowired + private RefreshTokenRepository refreshTokenRepository; + + @Autowired + private RedisTemplate redisTemplate; + + @BeforeEach + void setUp() { + refreshTokenRepository.deleteAll(); + } + + @AfterEach + void tearDown() { + refreshTokenRepository.deleteAll(); + } + + @Test + @DisplayName("토큰 생성과 검증의 전체 플로우가 정상 작동한다") + void tokenLifecycle_Success() { + // given + String memberId = "12345"; + Map claims = new HashMap<>(); + + // when + String accessToken = jwtService.generateAccessToken(memberId, claims); + String refreshToken = jwtService.generateRefreshToken(memberId); + + // then + assertThat(jwtService.isTokenValid(accessToken)).isTrue(); + assertThat(jwtService.isTokenValid(refreshToken)).isTrue(); + + assertThat(jwtService.extractMemberId(accessToken)).isEqualTo(memberId); + assertThat(jwtService.extractMemberId(refreshToken)).isEqualTo(memberId); + + assertThat(jwtService.validateRefreshToken(refreshToken)).isTrue(); + } + + @Test + @DisplayName("잘못된 멤버ID로 토큰 검증 시 실패한다") + void validateToken_WrongMemberId_Fail() { + // given + String memberId = "12345"; + String wrongMemberId = "67890"; + String token = jwtService.generateAccessToken(memberId); + + // when + boolean isValid = jwtService.validateToken(token, wrongMemberId); + + // then + assertThat(isValid).isFalse(); + } + + @Test + @DisplayName("빈 claims로 액세스 토큰을 생성할 수 있다") + void generateAccessToken_EmptyClaims_Success() { + // given + String memberId = "12345"; + + // when + String token = jwtService.generateAccessToken(memberId); + + // then + assertThat(jwtService.isTokenValid(token)).isTrue(); + assertThat(jwtService.extractMemberId(token)).isEqualTo(memberId); + } + + @Test + @DisplayName("존재하지 않는 리프레시 토큰 검증 시 실패한다") + void validateRefreshToken_NotExists_Fail() { + // given + String fakeToken = "fake.refresh.token"; + + // when + boolean isValid = jwtService.validateRefreshToken(fakeToken); + + // then + assertThat(isValid).isFalse(); + } +} From 2d7180a7785c26c61983583fc48980c6a043bc5d Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:16:50 +0900 Subject: [PATCH 66/73] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=AA=A8?= =?UTF-8?q?=EC=A7=91=20=EC=B7=A8=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/article/command/ArticleController.java | 8 ++++++++ src/main/java/com/idol/global/config/SecurityConfig.java | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/idol/board/controller/article/command/ArticleController.java b/src/main/java/com/idol/board/controller/article/command/ArticleController.java index f6bc1bc..e623c38 100644 --- a/src/main/java/com/idol/board/controller/article/command/ArticleController.java +++ b/src/main/java/com/idol/board/controller/article/command/ArticleController.java @@ -46,6 +46,13 @@ public ApiResponse updateArticle(@RequestBody ArticleUpdateRequestDto requ return ApiResponse.ok(updatedArticleId, "게시글 수정 성공"); } + @Operation(summary = "게시글 모집 취소", description = "게시글 모집 취소") + @PatchMapping("/{articleId}/statusClose") + public ApiResponse updateArticleClose(@PathVariable Long articleId, @MemberId Long writerId) { + Long updatedArticleId = updateArticleUserCase.updateOpenStatusClose(articleId, writerId); + return ApiResponse.ok(updatedArticleId, "게시글 모집 취소"); + } + @Operation(summary = "펜팔 참여", description = "펜팔 참여") @PostMapping("/{articleId}/fanFal") @@ -61,4 +68,5 @@ public ApiResponse cancelFanFal(@PathVariable Long articleId, @MemberId Lo return ApiResponse.ok(fanFalId, "펜팔 취소 성공"); } + } diff --git a/src/main/java/com/idol/global/config/SecurityConfig.java b/src/main/java/com/idol/global/config/SecurityConfig.java index 9142774..d38ad5a 100644 --- a/src/main/java/com/idol/global/config/SecurityConfig.java +++ b/src/main/java/com/idol/global/config/SecurityConfig.java @@ -49,7 +49,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { "/swagger-ui/**", "/v3/api-docs/**", "/fanfal/api-docs", - "/actuator/**" + "/actuator/**", + "/api/images/**", + "/api/images/" ).permitAll() .requestMatchers(HttpMethod.GET, "/api/board").permitAll() .requestMatchers(HttpMethod.GET, "/api/board/*/comment").permitAll() From de518d26bf4a833452e3ad881ea462d95a135059 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:19:14 +0900 Subject: [PATCH 67/73] =?UTF-8?q?mypage=20-=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=ED=95=9C=20=ED=8E=9C=ED=8C=94=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/ArticleRepositoryCustom.java | 3 ++ .../article/ArticleRepositoryImpl.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java b/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java index c405733..f0caf66 100644 --- a/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java @@ -20,4 +20,7 @@ List findArticleList( Timestamp date, String sort, boolean sortAsc, Long limit, Long offset); List findMyPageArticle(Long userId, Long limit, Long offset); + + List findJoinMyPageArticle(List articleIds, Long limit, Long offset); + } diff --git a/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java b/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java index 536b99c..6285a3c 100644 --- a/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java @@ -1,7 +1,9 @@ package com.idol.board.repository.article; import com.idol.board.domain.BigCategory; +import com.idol.board.domain.OpenStatus; import com.idol.board.domain.SmallCategory; +import com.idol.board.domain.UseStatus; import com.idol.board.domain.entity.Article; import com.idol.board.domain.entity.QArticle; import com.idol.board.dto.response.article.ArticleListResponseDto; @@ -17,6 +19,7 @@ import org.springframework.stereotype.Repository; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -95,6 +98,32 @@ public List findMyPageArticle(Long userId, Long limi .fetch(); } + @Override + public List findJoinMyPageArticle(List articleIds, Long limit, Long offset) { + return queryFactory + .select(Projections.constructor(ArticleListReadQueryResult.class, + article.articleId, + article.title, + article.locationId, + article.articleImageKey, + article.date, + article.deadline, + article.createdAt, + article.currentPerson, + article.maxPerson, + article.openStatus, + article.useStatus)) + + .from(article) + .where( + article.isDeleted.eq(false), + article.articleId.in(articleIds) + ) + .limit(limit) + .offset(offset) + .fetch(); + } + private BooleanExpression eqWriterId(Long userId) { return userId != null ? article.writerId.eq(userId) : null; } From 93b5f6d41480c5281fe346411f7958a3b24db4ca Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:23:14 +0900 Subject: [PATCH 68/73] =?UTF-8?q?mypage=20-=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/idol/board/domain/entity/Comment.java | 3 + .../comment/CommentQuestionResponseDto.java | 49 ++++++++++++ .../mypage/MyPageQuestionResponseDto.java | 12 +++ .../comment/CommentRepositoryCustom.java | 6 ++ .../comment/CommentRepositoryImpl.java | 75 +++++++++++-------- .../fanFal/ParticipantRepositoryCustom.java | 2 + .../fanFal/ParticipantRepositoryImpl.java | 10 +++ .../CommentReadQuestionQueryResult.java | 15 ++++ .../comment/command/CreateCommentService.java | 1 + 9 files changed, 142 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java create mode 100644 src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java create mode 100644 src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java diff --git a/src/main/java/com/idol/board/domain/entity/Comment.java b/src/main/java/com/idol/board/domain/entity/Comment.java index e88fee4..75aa8be 100644 --- a/src/main/java/com/idol/board/domain/entity/Comment.java +++ b/src/main/java/com/idol/board/domain/entity/Comment.java @@ -34,6 +34,9 @@ public class Comment extends BaseEntity { @Column(name = "secret", nullable = false) private boolean secret; +// @Column(name = "parent_check") +// private boolean parentCheck; + @Builder public Comment(Long commentId, Long articleId, Long writerId, String content, Long parentCommentId, boolean secret) { this.commentId = commentId; diff --git a/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java b/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java new file mode 100644 index 0000000..1f27273 --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java @@ -0,0 +1,49 @@ +package com.idol.board.dto.response.comment; + +import com.idol.board.domain.entity.Article; +import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; + +import java.sql.Timestamp; + +public record CommentQuestionResponseDto( + Long commentId, + String content, + Long parentCommentId, + Long writerId, + boolean deleted, + Long createdAt, + boolean secret, + String nickName, + String writerImageUrl, + Long articleId, + String title, + String locationAddress +) { + + public static Long changeToUnixTime(Timestamp ts) { + // 2. 밀리초 단위 UNIX timestamp 얻기 + long unixMillis = ts.getTime(); // 1750288750000 + + // 3. 초 단위 UNIX timestamp 얻기 + long unixSeconds = unixMillis / 1000; // 1750288750 + + return unixSeconds; + } + + public static CommentQuestionResponseDto from(CommentReadQuestionQueryResult result, String nickName, String writerImageUrl, Article article) { + return new CommentQuestionResponseDto( + result.commentId(), + result.content(), + result.parentCommentId(), + result.writerId(), + result.isDeleted(), + changeToUnixTime(Timestamp.valueOf(result.createdAt())), + result.secret(), + nickName, + writerImageUrl, + article.getArticleId(), + article.getTitle(), + article.getLocationAddress()); + } +} diff --git a/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java b/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java new file mode 100644 index 0000000..942d9d7 --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java @@ -0,0 +1,12 @@ +package com.idol.board.dto.response.mypage; + +import com.idol.board.dto.response.comment.CommentQuestionResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; + +import java.util.List; + +public record MyPageQuestionResponseDto( + List answerWait, + List answerComplete +) { +} diff --git a/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java b/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java index 3803bda..3ff2465 100644 --- a/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java @@ -2,6 +2,8 @@ import com.idol.board.domain.entity.Comment; import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; + import java.util.List; import java.util.Optional; @@ -16,4 +18,8 @@ public interface CommentRepositoryCustom { List findAllInfiniteScroll(Long articleId, Long lastParentCommentId, Long lastCommentId, Long limit); Optional findByParentCommentId(Long parentCommentId); + + +// List findQuestionAllInfiniteScroll(Long userId, Long limit); +// List findQuestionAllInfiniteScroll(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit); } diff --git a/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java b/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java index 16a5f71..3fdd844 100644 --- a/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java @@ -3,8 +3,10 @@ import com.idol.board.domain.entity.Comment; import com.idol.board.domain.entity.QComment; import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; @@ -40,19 +42,6 @@ public Optional findByCommentId(Long commentId) { } -// @Override -// public Optional findByParentCommentId(Long parentCommentId) { -// String sql = "select a from Comment a where a.isDeleted = false and a.parentCommentId = :parentCommentId"; -// Query query = entityManager.createQuery(sql) -// .setParameter("parentCommentId", parentCommentId); -// try { -// return Optional.ofNullable((Comment) query.getSingleResult()); -// } catch (NoResultException e) { -// return Optional.empty(); -// } -// } - - @Override public Optional findByParentCommentId(Long parentCommentId) { @@ -67,24 +56,6 @@ public Optional findByParentCommentId(Long parentCommentId) { ); } - // 연관된 댓글 개수 확인 -// @Override -// public Long relatedCommentCountBy(Long articleId, Long parentCommentId, Long limit) { -// String sql = "select count(*) from(" + -// " select comment_id from comment" + -// " where is_deleted = false and article_id = :articleId and parent_comment_id = :parentCommentId" + -// " limit :limit" + -// ") t"; -// -// Query query = entityManager.createNativeQuery(sql) -// .setParameter("articleId", articleId) -// .setParameter("parentCommentId", parentCommentId) -// .setParameter("limit", limit); -// -// -// log.info(String.valueOf(((Number) query.getSingleResult()).longValue())); -// return ((Number) query.getSingleResult()).longValue(); -// } @Override public Long relatedCommentCountBy(Long articleId, Long parentCommentId, Long limit) { @@ -163,4 +134,46 @@ public List findAllInfiniteScroll(Long articleId, Long l .limit(limit) .fetch(); } + + +// @Override +// public List findQuestionAllInfiniteScroll(Long userId, Long limit) { +// +// return queryFactory +// .select(Projections.constructor(CommentReadQuestionQueryResult.class, +// comment.commentId, +// comment.articleId, +// comment.content, +// comment.parentCommentId, +// comment.writerId, +// comment.isDeleted, +// comment.createdAt, +// comment.secret)) +// .from(comment) +// .where( +// comment.isDeleted.eq(false), +// comment.writerId.eq(userId).and(comment.parentCheck.eq(true)) // 부모 댓글 +// .or( +// comment.parentCommentId.in( +// JPAExpressions +// .select(comment.commentId) +// .from(comment) +// .where( +// comment.isDeleted.eq(false), +// comment.writerId.eq(userId), +// comment.parentCheck.eq(true) +// ) +// ) // 자식 댓글 +// ) +// ) +// .orderBy( +// comment.parentCommentId.asc().nullsFirst(), // 부모 댓글 먼저 +// comment.parentCheck.desc(), // 부모 댓글 먼저 +// comment.createdAt.asc() +// ) +//// .limit(limit * 10) +//// .offset(offset) +// .fetch(); +// } + } diff --git a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java index 8888a72..f99446e 100644 --- a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java @@ -9,4 +9,6 @@ public interface ParticipantRepositoryCustom { Optional findParticipant(Long articleId, Long writerId); List findParticipantFromArticle(Long articleId); + + List findParticipantFromWriterId(Long writerId); } diff --git a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java index cd39f29..94b3495 100644 --- a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java @@ -46,4 +46,14 @@ public List findParticipantFromArticle(Long articleId) { ).fetch(); } + @Override + public List findParticipantFromWriterId(Long writerId) { + return queryFactory + .selectFrom(participant) + .where( + participant.isDeleted.eq(false), + participant.writerId.eq(writerId) + ).fetch(); + } + } diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java b/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java new file mode 100644 index 0000000..6b8177a --- /dev/null +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java @@ -0,0 +1,15 @@ +package com.idol.board.repository.mapper; + +import java.time.LocalDateTime; + +public record CommentReadQuestionQueryResult( + Long commentId, + Long articleId, + String content, + Long parentCommentId, + Long writerId, + boolean isDeleted, + LocalDateTime createdAt, + boolean secret +){ +} diff --git a/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java b/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java index 5ae95aa..c2664ac 100644 --- a/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java +++ b/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java @@ -38,6 +38,7 @@ public Long createComment(CommentCreateRequestDto requestDto, Long writerId, Lon if(parent == null){ comment.addCommentParentId(); +// comment.updateParentCheck(); } return comment.getCommentId(); From d5b40179eba228c752f2fb4c6618ab950e0df1b0 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:24:46 +0900 Subject: [PATCH 69/73] =?UTF-8?q?=EC=8B=A0=EC=B2=AD=ED=95=9C=20=ED=8E=9C?= =?UTF-8?q?=ED=8C=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/command/MyPageController.java | 17 +++++++++-- .../myPage/command/DeleteMyPageService.java | 28 +++++++++++++++++++ .../mypage/command/DeleteMyPageUseCase.java | 5 ++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java create mode 100644 src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java diff --git a/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java b/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java index 71e0547..762d652 100644 --- a/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java +++ b/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java @@ -1,10 +1,16 @@ package com.idol.board.controller.mypage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; -import com.idol.board.usecase.mypage.UpdateMyPageUseCase; +import com.idol.board.usecase.mypage.command.DeleteMyPageUseCase; +import com.idol.board.usecase.mypage.command.UpdateMyPageUseCase; +import com.idol.board.dto.response.mypage.UserDataResponseDto; import com.idol.domains.auth.util.annotation.MemberId; +import com.idol.domains.member.dto.request.SignupMemberRequestDto; +import com.idol.domains.member.dto.response.SignupMemberResponseDto; import com.idol.global.common.response.ApiResponse; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -15,8 +21,9 @@ public class MyPageController { private final UpdateMyPageUseCase updateMyPageUseCase; + private final DeleteMyPageUseCase deleteMyPageUseCase; - + @Operation(summary = "프로필 수정", description = "이미지, 닉네임, 자기소개 수정") @PatchMapping() public ApiResponse updateProfile(@RequestBody MyPageUpdateRequestDto dto, @MemberId Long userId){ @@ -24,5 +31,11 @@ public ApiResponse updateProfile(@RequestBody MyPageUpdateRequestDto dto, return ApiResponse.ok(memberId,"개인 정보 수정 완료"); } + @Operation(summary = "내가 참여한 펜팔 삭제", description = "내가 참여하나 펜팔 삭제") + @DeleteMapping("/{articleId}") + public ApiResponse deleteMyFanFal(@PathVariable Long articleId, @MemberId Long userId){ + Long memberId = deleteMyPageUseCase.deleteMyFanFal(articleId, userId); + return ApiResponse.ok(memberId,"내가 참여한 펜팔 삭제"); + } } diff --git a/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java b/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java new file mode 100644 index 0000000..66aaf5d --- /dev/null +++ b/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java @@ -0,0 +1,28 @@ +package com.idol.board.service.myPage.command; + +import com.idol.board.domain.entity.Participant; +import com.idol.board.repository.fanFal.ParticipantRepository; +import com.idol.board.usecase.mypage.command.DeleteMyPageUseCase; +import com.idol.domains.member.repository.MemberJpaRepository; +import com.idol.global.exception.NotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DeleteMyPageService implements DeleteMyPageUseCase { + + private final MemberJpaRepository memberJpaRepository; + private final ParticipantRepository participantRepository; + + @Override + public Long deleteMyFanFal(Long articleId, Long userId) { + Participant participant = participantRepository.findParticipant(articleId,userId) + .orElseThrow(() -> new NotFoundException("Participant", "")); + + + participant.markAsDeleted(); + + return 0L; + } +} diff --git a/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java new file mode 100644 index 0000000..abe7d43 --- /dev/null +++ b/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java @@ -0,0 +1,5 @@ +package com.idol.board.usecase.mypage.command; + +public interface DeleteMyPageUseCase { + Long deleteMyFanFal(Long articleId, Long userId); +} From 3def15732dd048ffbb5cb8db6f53b97ef29ee963 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:26:11 +0900 Subject: [PATCH 70/73] =?UTF-8?q?mypage=20-=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A0,=20=EB=82=B4=EA=B0=80=20=EC=8B=A0=EC=B2=AD?= =?UTF-8?q?=ED=95=9C=20=ED=8E=9C=ED=8C=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8,?= =?UTF-8?q?=20=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=20Read?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/query/GetMyPageController.java | 56 ++++++-- .../response/mypage/UserDataResponseDto.java | 20 +++ .../article/query/ReadArticleService.java | 12 -- .../myPage/command/UpdateMyPageService.java | 3 +- .../myPage/query/ReadMyPageService.java | 124 ++++++++++++++++++ .../article/query/ReadArticleUseCase.java | 2 - .../{ => command}/UpdateMyPageUseCase.java | 4 +- .../mypage/query/ReadMyPageUseCase.java | 17 +++ 8 files changed, 211 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java create mode 100644 src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java rename src/main/java/com/idol/board/usecase/mypage/{ => command}/UpdateMyPageUseCase.java (78%) create mode 100644 src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java diff --git a/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java b/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java index 38555e3..7d0c92b 100644 --- a/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java +++ b/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java @@ -3,17 +3,18 @@ import com.idol.board.domain.BigCategory; import com.idol.board.domain.SmallCategory; import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; import com.idol.board.service.article.query.ReadArticleService; import com.idol.board.usecase.article.query.ReadArticleUseCase; +import com.idol.board.usecase.mypage.query.ReadMyPageUseCase; import com.idol.domains.auth.util.annotation.MemberId; import com.idol.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.sql.Timestamp; import java.util.List; @@ -23,22 +24,57 @@ @RequiredArgsConstructor @Tag(name = "마이페이지 Read API", description = "마이페이지 Read API") public class GetMyPageController { - private final ReadArticleUseCase readArticleUseCase; + private final ReadMyPageUseCase readMypageUseCase; - @Operation(summary = "나의 펜팔 리스트 출력", description = "나의 펜팔 리스트 출력") - @GetMapping() - public ApiResponse> readAllMyPage( + @Operation(summary = "나의 펜팔 출력", description = "나의 펜팔 출력") + @GetMapping() + public ApiResponse> readAllJoinMyPage( @RequestParam(value = "limit")Long limit, @RequestParam(value = "page")Long page, @MemberId Long userId ){ - List dto = readArticleUseCase.searchMypageList(limit,page,userId); + List dto = readMypageUseCase.readJoinMypageList(limit,page,userId); - return ApiResponse.ok(dto, "게시글 리스트 전체 조회 성공"); + return ApiResponse.ok(dto, "나의 펜팔 리스트 조회 성공"); } + @Operation(summary = "내가 만든 펜팔 출력", description = "내가 만든 펜팔 출력") + @GetMapping("/self") + public ApiResponse> readAllCreateMyPage( + @RequestParam(value = "limit")Long limit, + @RequestParam(value = "page")Long page, + @MemberId Long userId + ){ + + List dto = readMypageUseCase.readMypageList(limit,page,userId); + + return ApiResponse.ok(dto, "나가 만든 펜팔 리스트 조회 성공"); + } + + +// @Operation(summary = "나의 질문 출력", description = "나의 질문 출력") +// @GetMapping("/self") +// public ApiResponse readAllQuestionMyPage( +// @RequestParam(value = "lastParentCommentId", required = false) Long lastParentCommentId, +// @RequestParam(value = "lastCommentId", required = false) Long lastCommentId, +// @RequestParam(value = "pageSize") Long limit, +// @MemberId Long userId +// ){ +// MyPageQuestionResponseDto dto = readMypageUseCase.readMyQuestion(userId, lastParentCommentId,lastCommentId,limit); +// +// return ApiResponse.ok(dto, "나의 질문 조회 성공"); +// } + + @Operation(summary = "유저 정보 전달", description = "유저 정보 전달을 진행합니다.") + @GetMapping("/user") + public ApiResponse readUserInformation( + @MemberId Long userId + ) { + UserDataResponseDto response = readMypageUseCase.readUserInformation(userId); + return ApiResponse.ok(response, "유저 정보 전달 성공"); + } } diff --git a/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java b/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java new file mode 100644 index 0000000..e6af55e --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java @@ -0,0 +1,20 @@ +package com.idol.board.dto.response.mypage; + +import com.idol.domains.member.domain.Member; + +public record UserDataResponseDto( + String nickName, + String profileImg, + int wishLikeCount, + String description +) { + + public static UserDataResponseDto from(Member member, String profileImg, int wishLikeCount) { + return new UserDataResponseDto( + member.getNickname(), + profileImg, + wishLikeCount, + member.getInformation() + ); + } +} diff --git a/src/main/java/com/idol/board/service/article/query/ReadArticleService.java b/src/main/java/com/idol/board/service/article/query/ReadArticleService.java index b6e3f3f..25bdf66 100644 --- a/src/main/java/com/idol/board/service/article/query/ReadArticleService.java +++ b/src/main/java/com/idol/board/service/article/query/ReadArticleService.java @@ -112,19 +112,7 @@ public List searchArticleList( return searchArticles; } - @Override - public List searchMypageList(Long limit, Long page, Long userId) { - List searchMyPageList = articleRepository.findMyPageArticle(userId, limit, (page -1) * limit) - .stream().map(result -> - ArticleListResponseDto.from( - result, - validateLocation(result.locationId()).getRoadNameAddress(), - getS3Url(result.imageKey()).preSignedUrl() - )) - .collect(Collectors.toList()); - return searchMyPageList; - } private void validateCheckOpenStatus(Article article) { if(article.getCurrentPerson() >= article.getMinPerson()){ diff --git a/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java b/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java index bbd00e8..e1efaad 100644 --- a/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java +++ b/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java @@ -1,10 +1,9 @@ package com.idol.board.service.myPage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; -import com.idol.board.usecase.mypage.UpdateMyPageUseCase; +import com.idol.board.usecase.mypage.command.UpdateMyPageUseCase; import com.idol.domains.member.domain.Member; import com.idol.domains.member.repository.MemberJpaRepository; -import com.idol.domains.member.repository.MemberRepository; import com.idol.global.exception.NotFoundException; import com.idol.global.util.PasswordEncryptor; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java b/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java new file mode 100644 index 0000000..d80df09 --- /dev/null +++ b/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java @@ -0,0 +1,124 @@ +package com.idol.board.service.myPage.query; + +import com.idol.board.domain.entity.Article; +import com.idol.board.domain.entity.Location; +import com.idol.board.domain.entity.Participant; +import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.comment.CommentQuestionResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; +import com.idol.board.repository.article.ArticleRepository; +import com.idol.board.repository.comment.CommentRepository; +import com.idol.board.repository.fanFal.ParticipantRepository; +import com.idol.board.repository.location.LocationRepository; +import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; +import com.idol.board.usecase.mypage.query.ReadMyPageUseCase; +import com.idol.domains.member.domain.Member; +import com.idol.domains.member.repository.MemberJpaRepository; +import com.idol.global.exception.NotFoundException; +import com.idol.imageUpload.dto.GetS3UrlDto; +import com.idol.imageUpload.useCase.ImageGetUserCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ReadMyPageService implements ReadMyPageUseCase { + private final ArticleRepository articleRepository; + private final LocationRepository locationRepository; + private final ImageGetUserCase imageGetUserCase; + private final ParticipantRepository participantRepository; + private final CommentRepository commentJpaRepository; + private final MemberJpaRepository memberJpaRepository; + + @Override + public List readMypageList(Long limit, Long page, Long userId) { + List searchMyPageList = articleRepository.findMyPageArticle(userId, limit, (page -1) * limit) + .stream().map(result -> + ArticleListResponseDto.from( + result, + validateLocation(result.locationId()).getRoadNameAddress(), + getS3Url(result.imageKey()) + )) + .collect(Collectors.toList()); + + return searchMyPageList; + } + + + @Override + public List readJoinMypageList(Long limit, Long page, Long userId) { + List participants = participantRepository.findParticipantFromWriterId(userId); + + List articleIds = participants.stream().map(Participant::getArticleId).collect(Collectors.toList()); + + + List searchMyPageList = articleRepository.findJoinMyPageArticle(articleIds, limit, (page -1) * limit) + .stream().map(result -> + ArticleListResponseDto.from( + result, + validateLocation(result.locationId()).getRoadNameAddress(), + getS3Url(result.imageKey()) + )) + .collect(Collectors.toList()); + + return searchMyPageList; + } + + @Override + public UserDataResponseDto readUserInformation(Long userId) { + Member member = memberJpaRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Member", userId)); + + UserDataResponseDto responseDto = UserDataResponseDto.from(member,getS3Url(member.getProfileImgUrl()),0); + + return responseDto; + } + +// @Override +// public MyPageQuestionResponseDto readMyQuestion(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit) { +// +// // 답변 대기 +// List comments = commentJpaRepository.findQuestionAllInfiniteScroll(userId, limit); +// +// List answerWait = new ArrayList<>(); +// +// for(CommentReadQuestionQueryResult result : comments){ +// Article article = articleRepository.findByArticleId(result.articleId()).orElseThrow(() -> new NotFoundException("Article", result.articleId())); +// Member member = memberJpaRepository.findById(result.writerId()).orElseThrow(() -> new NotFoundException("Member", result.writerId())); +// String writerImageUrl = ""; +// if(!member.getProfileImgUrl().equals("")){ +// writerImageUrl = getS3Url(member.getProfileImgUrl()).preSignedUrl(); +// } +// +// CommentQuestionResponseDto dto = CommentQuestionResponseDto.from(result,member.getNickname(),writerImageUrl,article); +// answerWait.add(dto); +// } +// +// MyPageQuestionResponseDto responseDto = new MyPageQuestionResponseDto(answerWait, null); +// +// return responseDto; +// // 답변 완료 +// } + + + private Location validateLocation(Long locationId) { + return locationRepository.findByLocationId(locationId) + .orElseThrow(() -> new NotFoundException("Location", locationId)); + } + + private String getS3Url(String imageKey){ + String userImageUrl = ""; + if(!imageKey.equals("")){ + userImageUrl = imageGetUserCase.getGetS3Url(imageKey).preSignedUrl(); + } + + return userImageUrl; + } +} diff --git a/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java b/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java index be1cb2f..285b9be 100644 --- a/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java +++ b/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java @@ -15,6 +15,4 @@ public interface ReadArticleUseCase { ArticleReadResponseDto readArticle(Long articleId); List searchArticleList(BigCategory bigCategory, SmallCategory smallCategory, String location, Long date, String sort, boolean sortAsc, Long limit, Long page); - - List searchMypageList(Long limit, Long page, Long userId); } \ No newline at end of file diff --git a/src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java similarity index 78% rename from src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java rename to src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java index 17c9f67..fced83a 100644 --- a/src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java +++ b/src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java @@ -1,8 +1,10 @@ -package com.idol.board.usecase.mypage; +package com.idol.board.usecase.mypage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; public interface UpdateMyPageUseCase { Long updateProfile(MyPageUpdateRequestDto dto, Long userId); + + } diff --git a/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java new file mode 100644 index 0000000..43464a4 --- /dev/null +++ b/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java @@ -0,0 +1,17 @@ +package com.idol.board.usecase.mypage.query; + +import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; + +import java.util.List; + +public interface ReadMyPageUseCase { + List readMypageList(Long limit, Long page, Long userId); + + List readJoinMypageList(Long limit, Long page, Long userId); + + UserDataResponseDto readUserInformation(Long userId); + +// MyPageQuestionResponseDto readMyQuestion(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit); +} From b3a01afb36f296367adb6958d89a0e9863945b09 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:26:21 +0900 Subject: [PATCH 71/73] =?UTF-8?q?UserData=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/idol/imageUpload/controller/S3Controller.java | 4 ++-- .../idol/imageUpload/service/command/ImagePostService.java | 4 ++-- .../java/com/idol/imageUpload/useCase/ImageUploadUseCase.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/idol/imageUpload/controller/S3Controller.java b/src/main/java/com/idol/imageUpload/controller/S3Controller.java index 6794221..8bc788f 100644 --- a/src/main/java/com/idol/imageUpload/controller/S3Controller.java +++ b/src/main/java/com/idol/imageUpload/controller/S3Controller.java @@ -1,5 +1,6 @@ package com.idol.imageUpload.controller; +import com.idol.domains.auth.util.annotation.MemberId; import com.idol.global.common.response.ApiResponse; import com.idol.imageUpload.dto.GetS3UrlDto; import com.idol.imageUpload.dto.PostS3UrlDto; @@ -22,8 +23,7 @@ public class S3Controller { @GetMapping( "/postImage") // TODO :: User값 매개변수 추가 예정 public ApiResponse getPostS3Url(String fileName) { - Long userId = 1321414L; - GetS3UrlDto getS3UrlDto = imageUploadUseCase.getPostS3Url(userId, fileName); + GetS3UrlDto getS3UrlDto = imageUploadUseCase.getPostS3Url(fileName); return ApiResponse.ok(getS3UrlDto, "이미지 주소 저장 성공"); } diff --git a/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java b/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java index ee33d42..59ebef7 100644 --- a/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java +++ b/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java @@ -26,8 +26,8 @@ public class ImagePostService implements ImageUploadUseCase { // S3에 이미지 업로드 주소 URL 요청 @Override - public GetS3UrlDto getPostS3Url(Long userId, String fileName) { - String key = "profile/" + userId + "/" + UUID.randomUUID() + "/" + fileName; + public GetS3UrlDto getPostS3Url(String fileName) { + String key = "profile/" + UUID.randomUUID() + "/" + fileName; // PutObjectRequest: S3에 객체를 업로드하기 위한 요청 PutObjectRequest putObjectRequest = PutObjectRequest.builder() diff --git a/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java b/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java index 24caeac..53f0d10 100644 --- a/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java +++ b/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java @@ -5,5 +5,5 @@ import java.util.Date; public interface ImageUploadUseCase { - GetS3UrlDto getPostS3Url(Long memberId, String filename); + GetS3UrlDto getPostS3Url(String filename); } From a0b996753566042e9c41c01f7276b56d104ae58c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:27:00 +0900 Subject: [PATCH 72/73] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20close=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/command/UpdateArticleService.java | 14 +++++++++++++- .../article/command/UpdateArticleUseCase.java | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java b/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java index e881629..19a30af 100644 --- a/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java +++ b/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java @@ -1,5 +1,6 @@ package com.idol.board.service.article.command; +import com.idol.board.domain.OpenStatus; import com.idol.board.domain.entity.Article; import com.idol.board.domain.entity.Location; import com.idol.board.dto.request.article.ArticleUpdateRequestDto; @@ -27,7 +28,6 @@ public class UpdateArticleService implements UpdateArticleUseCase { @Override public Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId, Long articleId) { Article article = articleRepository.findByArticleId(articleId) - .filter(not(Article::getIsDeleted)) .orElseThrow(() -> new NotFoundException("Article", articleId)); validateUserHasPermission(article, writerId); @@ -43,6 +43,18 @@ public Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId, Lon return article.getArticleId(); } + @Override + public Long updateOpenStatusClose(Long writerId, Long articleId) { + Article article = articleRepository.findByArticleId(articleId) + .orElseThrow(() -> new NotFoundException("Article", articleId)); + + if(article.getWriterId() == writerId){ + article.updateOpenStatus(OpenStatus.CANCELED_STATUS); + } + + return 0L; + } + private void validateUserHasPermission(Article article, Long writerId) { if (article.getWriterId() != writerId) { log.info(String.valueOf(article.getWriterId() == writerId)); diff --git a/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java b/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java index 5d942d2..593dbf8 100644 --- a/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java +++ b/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java @@ -4,4 +4,6 @@ public interface UpdateArticleUseCase { Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId ,Long articleId); + + Long updateOpenStatusClose(Long articleId, Long writerId); } From e4b7f324ecc84ec5260f09f16cafa3fa93e1b85b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 21 Jun 2025 17:35:59 +0900 Subject: [PATCH 73/73] =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/idol/global/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/idol/global/config/SecurityConfig.java b/src/main/java/com/idol/global/config/SecurityConfig.java index d38ad5a..cca1736 100644 --- a/src/main/java/com/idol/global/config/SecurityConfig.java +++ b/src/main/java/com/idol/global/config/SecurityConfig.java @@ -54,6 +54,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { "/api/images/" ).permitAll() .requestMatchers(HttpMethod.GET, "/api/board").permitAll() + .requestMatchers(HttpMethod.GET, "/api/board/*").permitAll() .requestMatchers(HttpMethod.GET, "/api/board/*/comment").permitAll() .anyRequest().authenticated() )