From 990fd7893e0eb7de0e95b7177ce9a05bc20f7adf Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 01/66] =?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 276613bf3a8d8f8d36937989adde5e254808b2a7 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:45 +0900 Subject: [PATCH 02/66] =?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 5035b8f803fe3e67004debd2c2ac7480b1f169ea Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:45:42 +0900 Subject: [PATCH 03/66] =?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 c0a4c06b5000f12694a9db56a65b89c002108c5c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 04/66] =?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 6440b7c24657c22953498f1d6f76da0cd47afd06 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 05/66] =?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 078e7924fe5588a25db0063168e6186b4abe47a1 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 06/66] =?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 e604d2a3cc0a8d5dc7960c24a907d300198dccc6 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:07 +0900 Subject: [PATCH 07/66] =?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 b174084ebeaca985ef28a9c3aa442d7783c0f23d Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:35 +0900 Subject: [PATCH 08/66] =?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 bba671d50d32702188839c14a37227ba57ec4ce2 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 09/66] =?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 6d5ae7061ee5165b339d893a7ede3cdc0d808b8b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 10/66] =?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 6689db3b4cd305f01379dccdd1838a121e139507 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 11/66] =?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 908b0f6fa122e7d229e0feb1136d36ba20631290 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 12/66] =?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 c96e18ae7b26141091b3f010f339a8d9ee6fb83a Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 13/66] =?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 8cdbabe660acd19a9866e0aa2fe6803f7ffeb50c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 14/66] =?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 4434bb45040ed2b3f4736413736114e8145120b8 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:22 +0900 Subject: [PATCH 15/66] =?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 47f6496122b90eacf2d5927aee394a084ae20324 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:33 +0900 Subject: [PATCH 16/66] =?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 37b875824c25cd5138eb2e2ef7bb72ef3a22d651 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:53 +0900 Subject: [PATCH 17/66] =?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 1d4b0c856ca8d8a5aa85ecc86f64a01538529bc2 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 18/66] =?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 73940149347cb939f6d1350c013e9eeac61fdd51 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 19/66] =?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 888c0a80fbf955d578e6fe7e4b15c179e5a69f16 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 20/66] =?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 b26ab8569d37e64203a0b07af7d7732f0b4e0202 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 21/66] =?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 426ab91f49bbd4ec2b1182681a815ce9887dcaca Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 22/66] =?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 3230b4922ca0283534db1d68b3b99839f591ea19 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 23/66] =?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 83a0f7c599301e1e76daa17eb4708e38b8f0700f Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 24/66] =?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 7cb63120147f8d17d490d3182a642e42b7a3d5e7 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Fri, 6 Jun 2025 22:54:45 +0900 Subject: [PATCH 25/66] =?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 c0436b6825563c70432d437c4eedc9bb3801351f Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:07:50 +0900 Subject: [PATCH 26/66] =?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 b91f9e49f03be90447fdf3795c467526c4bf3c12 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:13:23 +0900 Subject: [PATCH 27/66] =?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 57df086fe2082efb9f0aa28947ce272fe6b325e1 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/66] 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 52f93c38fb3038f23588ce09103398efb7273a2f Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 14 Jun 2025 09:27:21 +0900 Subject: [PATCH 29/66] =?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 5b8650996b7c0f8bf36b3c798875449f09b1ab6a Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:36 +0900 Subject: [PATCH 30/66] =?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 5ec089f7977afd522559d33936251a6c552ef031 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 31/66] =?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 43e7618611f345a07d4fd310af36b177a3625aec Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:45 +0900 Subject: [PATCH 32/66] =?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 89da2e051acb0e334ecd5f5ab7cee5f1515b4e05 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:45:42 +0900 Subject: [PATCH 33/66] =?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 759a78e0769de7ba6b1fc73cce8d4ecd3b1b39d9 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 34/66] =?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 ef0d4f3366948fc266cfa4774ceeca87af9d66c1 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 35/66] =?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 045ad48b7d3a385d0bc90b36ba80cd300839e79e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 36/66] =?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 30c9782e567d88dd832eca4ab3612b5742bc303e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:52:47 +0900 Subject: [PATCH 37/66] =?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 b180b02c4587704086d26169247968b2f8ffae0b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:07 +0900 Subject: [PATCH 38/66] =?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 56c3dce2a14e20f79924e977e597a4beb8feae48 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:03:35 +0900 Subject: [PATCH 39/66] =?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 342642280c67aa81e3f3aa19d28255e44b48111b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 40/66] =?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 9dfd016cf01778e88408e96ce37e5ed0dcbc3722 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 41/66] =?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 fb0fef4cb6d0d89f9d834f53e79e2627b679b564 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 42/66] =?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 4c70b4802a061be70abe4e5284a70b349e97598a Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 43/66] =?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 165e8163b9b7b9a3d9abc171e68d962131afda24 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 44/66] =?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 6846f948d40a951be24817f4adeb3e56ec3c98e7 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 45/66] =?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 efadaf102bdefbcd0f3df4835d838b985d0c9cd5 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:22 +0900 Subject: [PATCH 46/66] =?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 b802357646c30440d46354b24278bd9411695c47 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:33 +0900 Subject: [PATCH 47/66] =?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 e1639a7132ac2d682fca1f696eff582387a9fceb Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 4 Jun 2025 14:57:53 +0900 Subject: [PATCH 48/66] =?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 131c16f273ff15a132d6bf5e2e6596352cc5d7ce Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:41:22 +0900 Subject: [PATCH 49/66] =?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 5a0974f8696bd25afdbb272d32a196d945bf7f4e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:42:24 +0900 Subject: [PATCH 50/66] =?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 bd1f654a7f278818f8ac31f874a139598fdcd4c8 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:14 +0900 Subject: [PATCH 51/66] =?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 135985d2921e0763aa247fa311a3dddc43bfba6e Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:48:22 +0900 Subject: [PATCH 52/66] =?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 b17a0927108945b1cb91280225c641091833ce68 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 11:50:58 +0900 Subject: [PATCH 53/66] =?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 4b9847a566e4e79dafaf10cd488202667decaa9b Mon Sep 17 00:00:00 2001 From: baejiwon Date: Wed, 28 May 2025 12:13:32 +0900 Subject: [PATCH 54/66] =?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 a2c658a043337978deb6b8bd6aa3bee0e3c3948c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:07 +0900 Subject: [PATCH 55/66] =?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 c982e950e29445764d91454dad6d75f410558971 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 3 Jun 2025 21:38:45 +0900 Subject: [PATCH 56/66] =?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 5fd1d143b8a5208013eaf6b5dbc4d4ea77a33d0c Mon Sep 17 00:00:00 2001 From: baejiwon Date: Fri, 6 Jun 2025 22:54:45 +0900 Subject: [PATCH 57/66] =?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 53b35d40acdf110b287acd24c0888b681b7768eb Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:07:50 +0900 Subject: [PATCH 58/66] =?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 602fc88ffb88601c78007e559d77d2752c2f0111 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:13:23 +0900 Subject: [PATCH 59/66] =?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 b6d8a0876c3463541f137393517e6189a9577254 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sun, 8 Jun 2025 23:16:52 +0900 Subject: [PATCH 60/66] =?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 02307795494ce29860c5e6f9dbf66ca3e5fc665a 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/66] 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 b50c490fdef61439a34a9fd18fafd1b7cce07cd6 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Sat, 14 Jun 2025 09:27:21 +0900 Subject: [PATCH 62/66] =?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 d2ab968bea9889d7329a6d7e65579231a38e24c8 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Tue, 17 Jun 2025 22:28:27 +0900 Subject: [PATCH 63/66] =?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 c9b6d6cf249cfabbdd305e4ec59e75d5cc4f48a2 Mon Sep 17 00:00:00 2001 From: baejiwon Date: Thu, 19 Jun 2025 08:53:03 +0900 Subject: [PATCH 64/66] =?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 1b8eaf8e93ea0df310e8abcb944daedb6b7e9aed Mon Sep 17 00:00:00 2001 From: baejiwon Date: Thu, 19 Jun 2025 09:01:27 +0900 Subject: [PATCH 65/66] =?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 6300370886cad4d7f5b8bd07e574f7a3061d76ad Mon Sep 17 00:00:00 2001 From: baejiwon Date: Mon, 23 Jun 2025 23:58:17 +0900 Subject: [PATCH 66/66] =?UTF-8?q?Transactional=20Read,=20Write=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/query/ArticleStatusService.java | 49 +++++++++++++++++++ .../article/query/ReadArticleService.java | 35 +++---------- 2 files changed, 55 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/idol/board/service/article/query/ArticleStatusService.java diff --git a/src/main/java/com/idol/board/service/article/query/ArticleStatusService.java b/src/main/java/com/idol/board/service/article/query/ArticleStatusService.java new file mode 100644 index 0000000..53b8166 --- /dev/null +++ b/src/main/java/com/idol/board/service/article/query/ArticleStatusService.java @@ -0,0 +1,49 @@ +package com.idol.board.service.article.query; + +import com.idol.board.domain.OpenStatus; +import com.idol.board.domain.entity.Article; +import com.idol.board.repository.article.ArticleRepository; +import com.idol.global.exception.NotFoundException; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.sql.Timestamp; +import java.util.Date; + +@Service +@RequiredArgsConstructor +public class ArticleStatusService { + private final ArticleRepository articleRepository; + private final EntityManager entityManager; + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void validateCheckOpenStatus(Article article) { + if(article.getCurrentPerson() >= article.getMinPerson()){ + if(article.getOpenStatus().equals(OpenStatus.PENDING_STATUS)) { + article.updateOpenStatus(OpenStatus.CONFIRMED_STATUS); + } + } + } + + + @Transactional(propagation = Propagation.REQUIRES_NEW) + public OpenStatus validateCheckDeadlineStatus(Long articleId, OpenStatus status, Date deadline) { + Article article = articleRepository.findByArticleId(articleId) + .orElseThrow(() -> new NotFoundException("Article", articleId)); + + Timestamp deadlineTime = new Timestamp(deadline.getTime()); + if(deadlineTime.before(new Timestamp(System.currentTimeMillis()))){ + if(status.equals(OpenStatus.CONFIRMED_STATUS)) { + article.updateOpenStatus(OpenStatus.DEADLINE_STATUS); + return OpenStatus.DEADLINE_STATUS; + }else if(status.equals(OpenStatus.PENDING_STATUS)){ + article.updateOpenStatus(OpenStatus.CANCELED_STATUS); + return OpenStatus.CANCELED_STATUS; + } + } + return status; + } +} 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 12a559e..869044c 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 @@ -42,9 +42,10 @@ public class ReadArticleService implements ReadArticleUseCase { private final MemberJpaRepository memberJpaRepository; private final ParticipantRepository participantRepository; private final WishRepository wishRepository; + private final ArticleStatusService articleStatusService; @Override - @Transactional() + @Transactional(readOnly = true) public ArticleReadResponseDto readArticle(Long articleId, Long userId) { Article article = articleRepository.findByArticleId(articleId) .orElseThrow(() -> new NotFoundException("Article", articleId)); @@ -83,7 +84,7 @@ public ArticleReadResponseDto readArticle(Long articleId, Long userId) { Location location = validateLocation(article.getLocationId()); - validateCheckOpenStatus(article); + articleStatusService.validateCheckOpenStatus(article); boolean wish = wishCheck(articleId,userId); @@ -94,7 +95,7 @@ public ArticleReadResponseDto readArticle(Long articleId, Long userId) { @Override - @Transactional() + @Transactional(readOnly = true) public List searchArticleList( BigCategory bigCategory, SmallCategory smallCategory, String location, Long date, String sort, boolean sortAsc, Long limit, Long page, Long memberId) { @@ -110,7 +111,7 @@ public List searchArticleList( ArticleListImgResponseDto.from( result, validateLocation(result.locationId()).getRoadNameAddress(), - validateCheckDeadlineStatus(result.articleId(), result.openStatus(), result.deadLine()), + articleStatusService.validateCheckDeadlineStatus(result.articleId(), result.openStatus(), result.deadLine()), wishCheck(result.articleId(), memberId), result.imageKey().equals("")? "" : getS3Url(result.imageKey()).preSignedUrl(), validateUser(result.writerId()).getNickname(), @@ -125,34 +126,10 @@ public List searchArticleList( - private void validateCheckOpenStatus(Article article) { - if(article.getCurrentPerson() >= article.getMinPerson()){ - if(article.getOpenStatus().equals(OpenStatus.PENDING_STATUS)) { - article.updateOpenStatus(OpenStatus.CONFIRMED_STATUS); - articleRepository.save(article); - } - } - } - private OpenStatus validateCheckDeadlineStatus(Long articleId, OpenStatus status, Date deadline) { - Article article = articleRepository.findByArticleId(articleId) - .orElseThrow(() -> new NotFoundException("Article", articleId)); - Timestamp deadlineTime = new Timestamp(deadline.getTime()); - if(deadlineTime.before(new Timestamp(System.currentTimeMillis()))){ - if(status.equals(OpenStatus.CONFIRMED_STATUS)) { - article.updateOpenStatus(OpenStatus.DEADLINE_STATUS); - articleRepository.save(article); - return OpenStatus.DEADLINE_STATUS; - }else if(status.equals(OpenStatus.PENDING_STATUS)){ - article.updateOpenStatus(OpenStatus.CANCELED_STATUS); - articleRepository.save(article); - return OpenStatus.CANCELED_STATUS; - } - } - return status; - } + private Location validateLocation(Long locationId) { return locationRepository.findByLocationId(locationId)