From 8e22a22c9ef555d6237ba1027dd0eb5e6565bf8b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 30 Apr 2025 13:30:30 +0900 Subject: [PATCH 001/143] =?UTF-8?q?chore.=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/{ => controller}/HelloController.java | 2 +- .../java/com/example/bcsd/controller/IntroduceController.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) rename src/main/java/com/example/bcsd/{ => controller}/HelloController.java (91%) create mode 100644 src/main/java/com/example/bcsd/controller/IntroduceController.java diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/controller/HelloController.java similarity index 91% rename from src/main/java/com/example/bcsd/HelloController.java rename to src/main/java/com/example/bcsd/controller/HelloController.java index 9559e2f1..383675ba 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/controller/HelloController.java @@ -1,4 +1,4 @@ -package com.example.bcsd; +package com.example.bcsd.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/com/example/bcsd/controller/IntroduceController.java b/src/main/java/com/example/bcsd/controller/IntroduceController.java new file mode 100644 index 00000000..5ef3f363 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/IntroduceController.java @@ -0,0 +1,4 @@ +package com.example.bcsd.controller; + +public class IntroduceController { +} From 1b912fbcfcdbd491846a9d8652d912aeb07e4363 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 30 Apr 2025 13:31:11 +0900 Subject: [PATCH 002/143] =?UTF-8?q?feat.=20/introduce=20GET=20API=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 --- .../example/bcsd/controller/IntroduceController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/example/bcsd/controller/IntroduceController.java b/src/main/java/com/example/bcsd/controller/IntroduceController.java index 5ef3f363..030279e1 100644 --- a/src/main/java/com/example/bcsd/controller/IntroduceController.java +++ b/src/main/java/com/example/bcsd/controller/IntroduceController.java @@ -1,4 +1,14 @@ package com.example.bcsd.controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/introduce") public class IntroduceController { + @GetMapping + public String getIntroduce() { + return "안녕하세요 제 이름은 이동훈입니다!"; + } } From d704ab89eb068b367560e14c92ce61454ae9c88b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 30 Apr 2025 13:41:23 +0900 Subject: [PATCH 003/143] =?UTF-8?q?feat.=20name=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/IntroduceController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/IntroduceController.java b/src/main/java/com/example/bcsd/controller/IntroduceController.java index 030279e1..31c0ca0c 100644 --- a/src/main/java/com/example/bcsd/controller/IntroduceController.java +++ b/src/main/java/com/example/bcsd/controller/IntroduceController.java @@ -2,13 +2,16 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/introduce") public class IntroduceController { @GetMapping - public String getIntroduce() { - return "안녕하세요 제 이름은 이동훈입니다!"; + public String getIntroduce( + @RequestParam(name = "name", defaultValue="이동훈", required = false) String name + ) { + return "안녕하세요 제 이름은 " + name + "입니다!"; } } From 6e88df3319e3029e8461eaf259617a8393def8a2 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 30 Apr 2025 13:50:12 +0900 Subject: [PATCH 004/143] =?UTF-8?q?feat.=20/json=20GET=20API=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 --- .../bcsd/controller/JsonController.java | 18 ++++++++++++++++++ .../bcsd/controller/dto/JsonResponse.java | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/java/com/example/bcsd/controller/JsonController.java create mode 100644 src/main/java/com/example/bcsd/controller/dto/JsonResponse.java diff --git a/src/main/java/com/example/bcsd/controller/JsonController.java b/src/main/java/com/example/bcsd/controller/JsonController.java new file mode 100644 index 00000000..b8a9e202 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/JsonController.java @@ -0,0 +1,18 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.controller.dto.JsonResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/json") +public class JsonController { + @GetMapping + public ResponseEntity getJson() { + JsonResponse response = new JsonResponse(24, "이동훈"); + + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/example/bcsd/controller/dto/JsonResponse.java b/src/main/java/com/example/bcsd/controller/dto/JsonResponse.java new file mode 100644 index 00000000..b9ad0c5f --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/JsonResponse.java @@ -0,0 +1,19 @@ +package com.example.bcsd.controller.dto; + +public class JsonResponse { + private int age; + private String name; + + public JsonResponse(int age, String name) { + this.age = age; + this.name = name; + } + + public int getAge() { + return age; + } + + public String getName() { + return name; + } +} From 332295fe13750b06ed9d8739899cee0dcffde72d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:12:19 +0900 Subject: [PATCH 005/143] =?UTF-8?q?feat.=20/articles/{id}=20GET=20API=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 --- .../bcsd/controller/ArticleController.java | 24 ++++++++++++ .../java/com/example/bcsd/model/Article.java | 37 +++++++++++++++++++ .../bcsd/repository/ArticleRepository.java | 16 ++++++++ .../example/bcsd/service/ArticleService.java | 18 +++++++++ 4 files changed, 95 insertions(+) create mode 100644 src/main/java/com/example/bcsd/controller/ArticleController.java create mode 100644 src/main/java/com/example/bcsd/model/Article.java create mode 100644 src/main/java/com/example/bcsd/repository/ArticleRepository.java create mode 100644 src/main/java/com/example/bcsd/service/ArticleService.java diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java new file mode 100644 index 00000000..f6cc18bc --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -0,0 +1,24 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.model.Article; +import com.example.bcsd.service.ArticleService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/articles") +public class ArticleController { + private final ArticleService articleService; + + public ArticleController(ArticleService articleService) { + this.articleService = articleService; + } + + @GetMapping("/{id}") + public ResponseEntity
getArticleById(@PathVariable Long id) { + Article response = articleService.getArticleById(id); + + return ResponseEntity.ok(response); + } + +} diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java new file mode 100644 index 00000000..c4957b07 --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -0,0 +1,37 @@ +package com.example.bcsd.model; + +import java.time.LocalDateTime; + +public class Article { + private String title; + private String content; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public Article(String title, String content) { + this.title = title; + this.content = content; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } +} diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java new file mode 100644 index 00000000..8d5961e2 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -0,0 +1,16 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Article; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; + +@Repository +public class ArticleRepository { + private final Map articles = new HashMap<>(); + + public Article findById(Long id) { + return articles.get(id); + } +} diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java new file mode 100644 index 00000000..2e3ae244 --- /dev/null +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -0,0 +1,18 @@ +package com.example.bcsd.service; + +import com.example.bcsd.model.Article; +import com.example.bcsd.repository.ArticleRepository; +import org.springframework.stereotype.Service; + +@Service +public class ArticleService { + private final ArticleRepository articleRepository; + + public ArticleService(ArticleRepository articleRepository) { + this.articleRepository = articleRepository; + } + + public Article getArticleById(Long id) { + return articleRepository.findById(id); + } +} From 4307c732d88eeb85f64649fcb4298169fb819c85 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:36:34 +0900 Subject: [PATCH 006/143] =?UTF-8?q?feat.=20/articles=20POST=20API=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 --- .../bcsd/controller/ArticleController.java | 9 +++++++++ .../bcsd/controller/dto/ArticleRequest.java | 17 +++++++++++++++++ .../bcsd/repository/ArticleRepository.java | 7 +++++++ .../example/bcsd/service/ArticleService.java | 5 +++++ 4 files changed, 38 insertions(+) create mode 100644 src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index f6cc18bc..77f31833 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,7 +1,9 @@ package com.example.bcsd.controller; +import com.example.bcsd.controller.dto.ArticleRequest; import com.example.bcsd.model.Article; import com.example.bcsd.service.ArticleService; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,4 +23,11 @@ public ResponseEntity
getArticleById(@PathVariable Long id) { return ResponseEntity.ok(response); } + @PostMapping + public ResponseEntity
postArticle(@RequestBody ArticleRequest request) { + return ResponseEntity + .status(HttpStatus.CREATED) + .body(articleService.createArticle(request)); + } + } diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java b/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java new file mode 100644 index 00000000..81d5411a --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java @@ -0,0 +1,17 @@ +package com.example.bcsd.controller.dto; + +import com.example.bcsd.model.Article; + +public class ArticleRequest { + private String title; + private String content; + + public ArticleRequest(String title, String content) { + this.title = title; + this.content = content; + } + + public Article toEntity() { + return new Article(title, content); + } +} diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 8d5961e2..baba3c45 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -8,9 +8,16 @@ @Repository public class ArticleRepository { + private Long key = 1L; private final Map articles = new HashMap<>(); public Article findById(Long id) { return articles.get(id); } + + public Article save(Article article) { + articles.put(key++, article); + + return article; + } } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 2e3ae244..b71c7da9 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,5 +1,6 @@ package com.example.bcsd.service; +import com.example.bcsd.controller.dto.ArticleRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import org.springframework.stereotype.Service; @@ -15,4 +16,8 @@ public ArticleService(ArticleRepository articleRepository) { public Article getArticleById(Long id) { return articleRepository.findById(id); } + + public Article createArticle(ArticleRequest request) { + return articleRepository.save(request.toEntity()); + } } From 74b762f082112b9077bcc70285d2e81159c44f91 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:38:37 +0900 Subject: [PATCH 007/143] =?UTF-8?q?refactory.=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/controller/ArticleController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 77f31833..bbb62967 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -18,9 +18,8 @@ public ArticleController(ArticleService articleService) { @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { - Article response = articleService.getArticleById(id); - - return ResponseEntity.ok(response); + return ResponseEntity + .ok(articleService.getArticleById(id)); } @PostMapping From 5f0624be3afd04922b4597d69a814ae781e38a98 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:53:36 +0900 Subject: [PATCH 008/143] =?UTF-8?q?feat.=20/articles/{id}=20PUT=20API=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 --- .../example/bcsd/controller/ArticleController.java | 7 +++++++ .../example/bcsd/controller/dto/ArticleRequest.java | 8 ++++++++ src/main/java/com/example/bcsd/model/Article.java | 10 ++++++++-- .../example/bcsd/repository/ArticleRepository.java | 12 ++++++++++++ .../com/example/bcsd/service/ArticleService.java | 8 ++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index bbb62967..910218be 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -29,4 +29,11 @@ public ResponseEntity
postArticle(@RequestBody ArticleRequest request) .body(articleService.createArticle(request)); } + @PutMapping("/{id}") + public ResponseEntity
updateArticleById( + @PathVariable Long id, @RequestBody ArticleRequest request + ) { + return ResponseEntity + .ok(articleService.updateArticleById(id, request)); + } } diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java b/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java index 81d5411a..a4b46258 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java @@ -14,4 +14,12 @@ public ArticleRequest(String title, String content) { public Article toEntity() { return new Article(title, content); } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index c4957b07..06aa3d77 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,5 +1,7 @@ package com.example.bcsd.model; +import com.example.bcsd.controller.dto.ArticleRequest; + import java.time.LocalDateTime; public class Article { @@ -31,7 +33,11 @@ public LocalDateTime getUpdatedAt() { return updatedAt; } - public void setUpdatedAt(LocalDateTime updatedAt) { - this.updatedAt = updatedAt; + public Article update(ArticleRequest request) { + title = request.getTitle(); + content = request.getContent(); + updatedAt = LocalDateTime.now(); + + return this; } } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index baba3c45..975faec2 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -12,6 +12,12 @@ public class ArticleRepository { private final Map articles = new HashMap<>(); public Article findById(Long id) { + Article article = articles.get(id); + + if (article == null) { + throw new RuntimeException("Not Found"); + } + return articles.get(id); } @@ -20,4 +26,10 @@ public Article save(Article article) { return article; } + + public Article save(Long id, Article article) { + articles.put(id, article); + + return article; + } } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index b71c7da9..0eb72526 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -20,4 +20,12 @@ public Article getArticleById(Long id) { public Article createArticle(ArticleRequest request) { return articleRepository.save(request.toEntity()); } + + public Article updateArticleById(Long id, ArticleRequest request) { + Article article = articleRepository + .findById(id) + .update(request); + + return articleRepository.save(id, article); + } } From 18f3873db3e2264cf87cd2b36ae4127b5e6590a3 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:56:36 +0900 Subject: [PATCH 009/143] =?UTF-8?q?feat.=20/articles/{id}=20DELETE=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/ArticleController.java | 7 +++++++ .../com/example/bcsd/repository/ArticleRepository.java | 4 ++++ src/main/java/com/example/bcsd/service/ArticleService.java | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 910218be..2c08153c 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -36,4 +36,11 @@ public ResponseEntity
updateArticleById( return ResponseEntity .ok(articleService.updateArticleById(id, request)); } + + @DeleteMapping("/{id}") + public ResponseEntity deleteArticleById(@PathVariable Long id) { + articleService.deleteArticleById(id); + + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 975faec2..501e38e5 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -32,4 +32,8 @@ public Article save(Long id, Article article) { return article; } + + public void delete(Long id) { + articles.remove(id); + } } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 0eb72526..6a065342 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -28,4 +28,8 @@ public Article updateArticleById(Long id, ArticleRequest request) { return articleRepository.save(id, article); } + + public void deleteArticleById(Long id) { + articleRepository.delete(id); + } } From 3df0a52d1f580dacfa2e63f1f92abad5d3633641 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 15:57:34 +0900 Subject: [PATCH 010/143] =?UTF-8?q?refactory.=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/ArticleController.java | 8 ++++---- .../java/com/example/bcsd/service/ArticleService.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 2c08153c..96704833 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -19,14 +19,14 @@ public ArticleController(ArticleService articleService) { @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { return ResponseEntity - .ok(articleService.getArticleById(id)); + .ok(articleService.getById(id)); } @PostMapping public ResponseEntity
postArticle(@RequestBody ArticleRequest request) { return ResponseEntity .status(HttpStatus.CREATED) - .body(articleService.createArticle(request)); + .body(articleService.create(request)); } @PutMapping("/{id}") @@ -34,12 +34,12 @@ public ResponseEntity
updateArticleById( @PathVariable Long id, @RequestBody ArticleRequest request ) { return ResponseEntity - .ok(articleService.updateArticleById(id, request)); + .ok(articleService.updateById(id, request)); } @DeleteMapping("/{id}") public ResponseEntity deleteArticleById(@PathVariable Long id) { - articleService.deleteArticleById(id); + articleService.deleteById(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 6a065342..bcea9a68 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -13,15 +13,15 @@ public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } - public Article getArticleById(Long id) { + public Article getById(Long id) { return articleRepository.findById(id); } - public Article createArticle(ArticleRequest request) { + public Article create(ArticleRequest request) { return articleRepository.save(request.toEntity()); } - public Article updateArticleById(Long id, ArticleRequest request) { + public Article updateById(Long id, ArticleRequest request) { Article article = articleRepository .findById(id) .update(request); @@ -29,7 +29,7 @@ public Article updateArticleById(Long id, ArticleRequest request) { return articleRepository.save(id, article); } - public void deleteArticleById(Long id) { + public void deleteById(Long id) { articleRepository.delete(id); } } From 5f14d54c8adb59900702e64ac7428542370b3630 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 5 May 2025 16:07:53 +0900 Subject: [PATCH 011/143] =?UTF-8?q?refactory.=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20404=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 19 +++++++++++++++---- .../bcsd/repository/ArticleRepository.java | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 96704833..b1709474 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -7,6 +7,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.NoSuchElementException; + @RestController @RequestMapping("/articles") public class ArticleController { @@ -18,8 +20,13 @@ public ArticleController(ArticleService articleService) { @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { - return ResponseEntity - .ok(articleService.getById(id)); + try { + return ResponseEntity + .ok(articleService.getById(id)); + } catch(NoSuchElementException ex) { + return ResponseEntity.notFound().build(); + } + } @PostMapping @@ -33,8 +40,12 @@ public ResponseEntity
postArticle(@RequestBody ArticleRequest request) public ResponseEntity
updateArticleById( @PathVariable Long id, @RequestBody ArticleRequest request ) { - return ResponseEntity - .ok(articleService.updateById(id, request)); + try { + return ResponseEntity + .ok(articleService.updateById(id, request)); + } catch (NoSuchElementException ex) { + return ResponseEntity.notFound().build(); + } } @DeleteMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 501e38e5..d2409620 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.NoSuchElementException; @Repository public class ArticleRepository { @@ -15,7 +16,7 @@ public Article findById(Long id) { Article article = articles.get(id); if (article == null) { - throw new RuntimeException("Not Found"); + throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); } return articles.get(id); From f8f98c8508abeb37f38186a9f338ab37364a0bd7 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 7 May 2025 17:12:48 +0900 Subject: [PATCH 012/143] =?UTF-8?q?fix.=20/introduce=20=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/controller/IntroduceController.java | 11 ++++++++--- src/main/resources/templates/hello.html | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/IntroduceController.java b/src/main/java/com/example/bcsd/controller/IntroduceController.java index 31c0ca0c..217cdd48 100644 --- a/src/main/java/com/example/bcsd/controller/IntroduceController.java +++ b/src/main/java/com/example/bcsd/controller/IntroduceController.java @@ -1,17 +1,22 @@ package com.example.bcsd.controller; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -@RestController +@Controller @RequestMapping("/introduce") public class IntroduceController { @GetMapping public String getIntroduce( - @RequestParam(name = "name", defaultValue="이동훈", required = false) String name + @RequestParam(name = "name", defaultValue="이동훈", required = false) String name, + Model model ) { - return "안녕하세요 제 이름은 " + name + "입니다!"; + model.addAttribute("name" , name); + + return "hello"; } } diff --git a/src/main/resources/templates/hello.html b/src/main/resources/templates/hello.html index 09349e2d..dde4aaa9 100644 --- a/src/main/resources/templates/hello.html +++ b/src/main/resources/templates/hello.html @@ -4,6 +4,6 @@ 안녕하세요 -

안녕!!!

+

안녕하세요 제 이름은 입니다!

\ No newline at end of file From 12c0b108283c527fec0f458933389fb9b0c4a730 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 7 May 2025 17:16:13 +0900 Subject: [PATCH 013/143] =?UTF-8?q?refactory.=20update=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B0=9D=EC=B2=B4=20=EC=9D=98=EC=A1=B4=20?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 6 +++--- src/main/java/com/example/bcsd/service/ArticleService.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 06aa3d77..e4bef903 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -33,9 +33,9 @@ public LocalDateTime getUpdatedAt() { return updatedAt; } - public Article update(ArticleRequest request) { - title = request.getTitle(); - content = request.getContent(); + public Article update(String title, String content) { + this.title = title; + this.content = content; updatedAt = LocalDateTime.now(); return this; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index bcea9a68..db73cd58 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -24,7 +24,7 @@ public Article create(ArticleRequest request) { public Article updateById(Long id, ArticleRequest request) { Article article = articleRepository .findById(id) - .update(request); + .update(request.getTitle(), request.getContent()); return articleRepository.save(id, article); } From 0669227a9ca74d77719ea98fd0bc0a669ca8c5bc Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 09:00:49 +0900 Subject: [PATCH 014/143] =?UTF-8?q?refactory.=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/ArticleController.java | 10 +++++----- .../java/com/example/bcsd/service/ArticleService.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index b1709474..16ea7352 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -22,7 +22,7 @@ public ArticleController(ArticleService articleService) { public ResponseEntity
getArticleById(@PathVariable Long id) { try { return ResponseEntity - .ok(articleService.getById(id)); + .ok(articleService.getArticleById(id)); } catch(NoSuchElementException ex) { return ResponseEntity.notFound().build(); } @@ -30,10 +30,10 @@ public ResponseEntity
getArticleById(@PathVariable Long id) { } @PostMapping - public ResponseEntity
postArticle(@RequestBody ArticleRequest request) { + public ResponseEntity
createArticle(@RequestBody ArticleRequest request) { return ResponseEntity .status(HttpStatus.CREATED) - .body(articleService.create(request)); + .body(articleService.createArticle(request)); } @PutMapping("/{id}") @@ -42,7 +42,7 @@ public ResponseEntity
updateArticleById( ) { try { return ResponseEntity - .ok(articleService.updateById(id, request)); + .ok(articleService.updateArticleById(id, request)); } catch (NoSuchElementException ex) { return ResponseEntity.notFound().build(); } @@ -50,7 +50,7 @@ public ResponseEntity
updateArticleById( @DeleteMapping("/{id}") public ResponseEntity deleteArticleById(@PathVariable Long id) { - articleService.deleteById(id); + articleService.deleteArticleById(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index db73cd58..16694be1 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -13,15 +13,15 @@ public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } - public Article getById(Long id) { + public Article getArticleById(Long id) { return articleRepository.findById(id); } - public Article create(ArticleRequest request) { + public Article createArticle(ArticleRequest request) { return articleRepository.save(request.toEntity()); } - public Article updateById(Long id, ArticleRequest request) { + public Article updateArticleById(Long id, ArticleRequest request) { Article article = articleRepository .findById(id) .update(request.getTitle(), request.getContent()); @@ -29,7 +29,7 @@ public Article updateById(Long id, ArticleRequest request) { return articleRepository.save(id, article); } - public void deleteById(Long id) { + public void deleteArticleById(Long id) { articleRepository.delete(id); } } From e34cd162cbe04319e671a503a12a25f0bf074962 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 09:09:12 +0900 Subject: [PATCH 015/143] =?UTF-8?q?feat.=20=EC=A0=84=EC=B2=B4=20article=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=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 --- .../bcsd/controller/ArticleController.java | 12 +++++++++++- .../bcsd/repository/ArticleRepository.java | 17 ++++++++++++++--- .../example/bcsd/service/ArticleService.java | 6 ++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 16ea7352..6469769b 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.NoSuchElementException; @RestController @@ -18,6 +19,16 @@ public ArticleController(ArticleService articleService) { this.articleService = articleService; } + @GetMapping + public ResponseEntity> getAllArticles() { + try { + return ResponseEntity + .ok(articleService.getAllArticles()); + } catch (NoSuchElementException ex) { + return ResponseEntity.notFound().build(); + } + } + @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { try { @@ -26,7 +37,6 @@ public ResponseEntity
getArticleById(@PathVariable Long id) { } catch(NoSuchElementException ex) { return ResponseEntity.notFound().build(); } - } @PostMapping diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index d2409620..ffdb9260 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -3,15 +3,26 @@ import com.example.bcsd.model.Article; import org.springframework.stereotype.Repository; -import java.util.HashMap; -import java.util.Map; -import java.util.NoSuchElementException; +import java.util.*; @Repository public class ArticleRepository { private Long key = 1L; private final Map articles = new HashMap<>(); + public List
findAll() { + List
result = new ArrayList<>(); + + articles.forEach((id, article) -> + result.add(article)); + + if (result.isEmpty()) { + throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); + } + + return result; + } + public Article findById(Long id) { Article article = articles.get(id); diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 16694be1..500191ef 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -5,6 +5,8 @@ import com.example.bcsd.repository.ArticleRepository; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class ArticleService { private final ArticleRepository articleRepository; @@ -13,6 +15,10 @@ public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } + public List
getAllArticles() { + return articleRepository.findAll(); + } + public Article getArticleById(Long id) { return articleRepository.findById(id); } From 041cffc4192c1dc6db3d8690424b9f44d6084684 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 09:16:13 +0900 Subject: [PATCH 016/143] =?UTF-8?q?refactory.=20article=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 6469769b..c3605934 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -21,22 +21,14 @@ public ArticleController(ArticleService articleService) { @GetMapping public ResponseEntity> getAllArticles() { - try { - return ResponseEntity - .ok(articleService.getAllArticles()); - } catch (NoSuchElementException ex) { - return ResponseEntity.notFound().build(); - } + return ResponseEntity + .ok(articleService.getAllArticles()); } @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { - try { - return ResponseEntity - .ok(articleService.getArticleById(id)); - } catch(NoSuchElementException ex) { - return ResponseEntity.notFound().build(); - } + return ResponseEntity + .ok(articleService.getArticleById(id)); } @PostMapping @@ -50,12 +42,8 @@ public ResponseEntity
createArticle(@RequestBody ArticleRequest request public ResponseEntity
updateArticleById( @PathVariable Long id, @RequestBody ArticleRequest request ) { - try { - return ResponseEntity - .ok(articleService.updateArticleById(id, request)); - } catch (NoSuchElementException ex) { - return ResponseEntity.notFound().build(); - } + return ResponseEntity + .ok(articleService.updateArticleById(id, request)); } @DeleteMapping("/{id}") @@ -64,4 +52,10 @@ public ResponseEntity deleteArticleById(@PathVariable Long id) { return ResponseEntity.noContent().build(); } + + @ExceptionHandler(NoSuchElementException.class) + public ResponseEntity notFoundExceptionHandle() { + return ResponseEntity.notFound().build(); + } + } From 1a65ff947f6b0d9a9558acbb6439187f462607a5 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 09:24:19 +0900 Subject: [PATCH 017/143] =?UTF-8?q?refactory.=20Article=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20DTO=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 7 +++-- .../controller/dto/ArticleCreateRequest.java | 31 +++++++++++++++++++ ...Request.java => ArticleUpdateRequest.java} | 8 ++--- .../java/com/example/bcsd/model/Article.java | 10 ++++-- .../example/bcsd/service/ArticleService.java | 7 +++-- 5 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java rename src/main/java/com/example/bcsd/controller/dto/{ArticleRequest.java => ArticleUpdateRequest.java} (65%) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index c3605934..6917a9c7 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,6 +1,7 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.ArticleRequest; +import com.example.bcsd.controller.dto.ArticleCreateRequest; +import com.example.bcsd.controller.dto.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.service.ArticleService; import org.springframework.http.HttpStatus; @@ -32,7 +33,7 @@ public ResponseEntity
getArticleById(@PathVariable Long id) { } @PostMapping - public ResponseEntity
createArticle(@RequestBody ArticleRequest request) { + public ResponseEntity
createArticle(@RequestBody ArticleCreateRequest request) { return ResponseEntity .status(HttpStatus.CREATED) .body(articleService.createArticle(request)); @@ -40,7 +41,7 @@ public ResponseEntity
createArticle(@RequestBody ArticleRequest request @PutMapping("/{id}") public ResponseEntity
updateArticleById( - @PathVariable Long id, @RequestBody ArticleRequest request + @PathVariable Long id, @RequestBody ArticleUpdateRequest request ) { return ResponseEntity .ok(articleService.updateArticleById(id, request)); diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java new file mode 100644 index 00000000..9c53fb09 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java @@ -0,0 +1,31 @@ +package com.example.bcsd.controller.dto; + +import com.example.bcsd.model.Article; + +public class ArticleCreateRequest { + private String title; + private String author; + private String content; + + public ArticleCreateRequest(String title, String author, String content) { + this.title = title; + this.author = author; + this.content = content; + } + + public Article toEntity() { + return new Article(title, author, content); + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + public String getAuthor() { + return author; + } +} diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java b/src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java similarity index 65% rename from src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java rename to src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java index a4b46258..fa068df0 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java @@ -2,19 +2,15 @@ import com.example.bcsd.model.Article; -public class ArticleRequest { +public class ArticleUpdateRequest { private String title; private String content; - public ArticleRequest(String title, String content) { + public ArticleUpdateRequest(String title, String content) { this.title = title; this.content = content; } - public Article toEntity() { - return new Article(title, content); - } - public String getTitle() { return title; } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index e4bef903..7188f7b6 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,17 +1,17 @@ package com.example.bcsd.model; -import com.example.bcsd.controller.dto.ArticleRequest; - import java.time.LocalDateTime; public class Article { private String title; + private String author; private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; - public Article(String title, String content) { + public Article(String title, String author, String content) { this.title = title; + this.author = author; this.content = content; this.createdAt = LocalDateTime.now(); this.updatedAt = LocalDateTime.now(); @@ -21,6 +21,10 @@ public String getTitle() { return title; } + public String getAuthor() { + return author; + } + public String getContent() { return content; } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 500191ef..91a681cf 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,6 +1,7 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.ArticleRequest; +import com.example.bcsd.controller.dto.ArticleCreateRequest; +import com.example.bcsd.controller.dto.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import org.springframework.stereotype.Service; @@ -23,11 +24,11 @@ public Article getArticleById(Long id) { return articleRepository.findById(id); } - public Article createArticle(ArticleRequest request) { + public Article createArticle(ArticleCreateRequest request) { return articleRepository.save(request.toEntity()); } - public Article updateArticleById(Long id, ArticleRequest request) { + public Article updateArticleById(Long id, ArticleUpdateRequest request) { Article article = articleRepository .findById(id) .update(request.getTitle(), request.getContent()); From d9d6d2c9885126346883782fe0071fe4feea3f5b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 09:29:41 +0900 Subject: [PATCH 018/143] =?UTF-8?q?fix.=20=EB=AA=A8=EB=93=A0=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EB=AC=BC=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/controller/PostViewController.java | 4 ++++ .../java/com/example/bcsd/repository/ArticleRepository.java | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/example/bcsd/controller/PostViewController.java diff --git a/src/main/java/com/example/bcsd/controller/PostViewController.java b/src/main/java/com/example/bcsd/controller/PostViewController.java new file mode 100644 index 00000000..f6ffcf70 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/PostViewController.java @@ -0,0 +1,4 @@ +package com.example.bcsd.controller; + +public class PostViewController { +} diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index ffdb9260..f3a93f7b 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -16,10 +16,6 @@ public List
findAll() { articles.forEach((id, article) -> result.add(article)); - if (result.isEmpty()) { - throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); - } - return result; } From 4a86d9f0bf3ff32e6a38b409a6c80c8396173763 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 14:25:45 +0900 Subject: [PATCH 019/143] =?UTF-8?q?feat.=20=EB=AA=A8=EB=93=A0=20article?= =?UTF-8?q?=EC=9D=84=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20=EB=B7=B0=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 --- .../bcsd/controller/PostViewController.java | 25 ++++++++++++++++ src/main/resources/static/style.css | 29 +++++++++++++++++++ src/main/resources/templates/post.html | 19 ++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/main/resources/static/style.css create mode 100644 src/main/resources/templates/post.html diff --git a/src/main/java/com/example/bcsd/controller/PostViewController.java b/src/main/java/com/example/bcsd/controller/PostViewController.java index f6ffcf70..0b39fa32 100644 --- a/src/main/java/com/example/bcsd/controller/PostViewController.java +++ b/src/main/java/com/example/bcsd/controller/PostViewController.java @@ -1,4 +1,29 @@ package com.example.bcsd.controller; +import com.example.bcsd.model.Article; +import com.example.bcsd.service.ArticleService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("/posts") public class PostViewController { + private final ArticleService articleService; + + public PostViewController(ArticleService articleService) { + this.articleService = articleService; + } + + @GetMapping + public String getAllArticlesView(Model model) { + List
articles = articleService.getAllArticles(); + + model.addAttribute("articleList", articles); + + return "post"; + } } diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css new file mode 100644 index 00000000..91e02376 --- /dev/null +++ b/src/main/resources/static/style.css @@ -0,0 +1,29 @@ +.article-box { + width: 300px; + border: 1px solid black; + margin: 20px; +} + +.article-header { + display: flex; + flex-direction: column; +} + +.article-header h1 { + align-self: center; +} + +.article-header p { + align-self: flex-end; + margin-right: 10px; +} + +hr { + width: 90%; + margin: 0 auto; +} + +.article-content { + width: 90%; + margin: 10px auto 30px auto; +} diff --git a/src/main/resources/templates/post.html b/src/main/resources/templates/post.html new file mode 100644 index 00000000..0107b2b9 --- /dev/null +++ b/src/main/resources/templates/post.html @@ -0,0 +1,19 @@ + + + + + 게시판 + + + +

자유 게시판

+
+
+

+

+
+
+

+
+ + From 82f387716c72b3ee523edf9771188603c3132dba Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 14:36:25 +0900 Subject: [PATCH 020/143] =?UTF-8?q?feat.=20Board=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Board.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/com/example/bcsd/model/Board.java diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java new file mode 100644 index 00000000..9739de7d --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -0,0 +1,6 @@ +package com.example.bcsd.model; + +public class Board { + private Long id; + private String name; +} From 77d5cd114bd06bca4067396198f2de23ef58ad0b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 8 May 2025 14:36:58 +0900 Subject: [PATCH 021/143] =?UTF-8?q?feat.=20Member=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Member.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/example/bcsd/model/Member.java diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java new file mode 100644 index 00000000..e0933295 --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -0,0 +1,8 @@ +package com.example.bcsd.model; + +public class Member { + private Long id; + private String name; + private String email; + private String pw; +} From cace9ac0b9f5d1139cf662d825434ad969883c30 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 10:08:29 +0900 Subject: [PATCH 022/143] =?UTF-8?q?refactory.=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=86=8D=EC=84=B1=EC=97=90=20id,=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20id,=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20id=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/ArticleCreateRequest.java | 14 +++++++------ .../bcsd/controller/dto/ArticleResponse.java | 4 ++++ .../java/com/example/bcsd/model/Article.java | 21 ++++++++++++++----- .../bcsd/repository/ArticleRepository.java | 2 ++ 4 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java index 9c53fb09..6530c0e3 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java @@ -4,17 +4,19 @@ public class ArticleCreateRequest { private String title; - private String author; + private Long authorId; + private Long boardId; private String content; - public ArticleCreateRequest(String title, String author, String content) { + public ArticleCreateRequest(String title, Long authorId, Long boardId, String content) { this.title = title; - this.author = author; + this.authorId = authorId; + this.boardId = boardId; this.content = content; } public Article toEntity() { - return new Article(title, author, content); + return new Article(title, authorId, boardId, content); } public String getTitle() { @@ -25,7 +27,7 @@ public String getContent() { return content; } - public String getAuthor() { - return author; + public Long getAuthorId() { + return authorId; } } diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java b/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java new file mode 100644 index 00000000..b9e95300 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java @@ -0,0 +1,4 @@ +package com.example.bcsd.controller.dto; + +public class ArticleResponse { +} diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 7188f7b6..bcc5dedd 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -3,15 +3,18 @@ import java.time.LocalDateTime; public class Article { + private Long id; private String title; - private String author; + private Long authorId; + private Long boardId; private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; - public Article(String title, String author, String content) { + public Article(String title, Long authorId, Long boardId, String content) { this.title = title; - this.author = author; + this.authorId = authorId; + this.boardId = boardId; this.content = content; this.createdAt = LocalDateTime.now(); this.updatedAt = LocalDateTime.now(); @@ -21,8 +24,12 @@ public String getTitle() { return title; } - public String getAuthor() { - return author; + public Long getAuthorId() { + return authorId; + } + + public Long getBoardId() { + return boardId; } public String getContent() { @@ -44,4 +51,8 @@ public Article update(String title, String content) { return this; } + + public void setId(Long id) { + this.id = id; + } } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index f3a93f7b..73199166 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -30,8 +30,10 @@ public Article findById(Long id) { } public Article save(Article article) { + article.setId(key); articles.put(key++, article); + return article; } From 5dee92515877540bc3a296a1f18353345b5bb9c1 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 12:02:07 +0900 Subject: [PATCH 023/143] =?UTF-8?q?refactory.=20=EC=9D=91=EB=8B=B5=20DTO?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 9 ++-- .../bcsd/controller/PostViewController.java | 4 +- .../bcsd/controller/dto/ArticleResponse.java | 42 +++++++++++++++++++ .../java/com/example/bcsd/model/Article.java | 6 +++ .../bcsd/repository/ArticleRepository.java | 3 +- .../example/bcsd/service/ArticleService.java | 23 ++++++---- 6 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 6917a9c7..32014402 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,6 +1,7 @@ package com.example.bcsd.controller; import com.example.bcsd.controller.dto.ArticleCreateRequest; +import com.example.bcsd.controller.dto.ArticleResponse; import com.example.bcsd.controller.dto.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.service.ArticleService; @@ -21,26 +22,26 @@ public ArticleController(ArticleService articleService) { } @GetMapping - public ResponseEntity> getAllArticles() { + public ResponseEntity> getAllArticles() { return ResponseEntity .ok(articleService.getAllArticles()); } @GetMapping("/{id}") - public ResponseEntity
getArticleById(@PathVariable Long id) { + public ResponseEntity getArticleById(@PathVariable Long id) { return ResponseEntity .ok(articleService.getArticleById(id)); } @PostMapping - public ResponseEntity
createArticle(@RequestBody ArticleCreateRequest request) { + public ResponseEntity createArticle(@RequestBody ArticleCreateRequest request) { return ResponseEntity .status(HttpStatus.CREATED) .body(articleService.createArticle(request)); } @PutMapping("/{id}") - public ResponseEntity
updateArticleById( + public ResponseEntity updateArticleById( @PathVariable Long id, @RequestBody ArticleUpdateRequest request ) { return ResponseEntity diff --git a/src/main/java/com/example/bcsd/controller/PostViewController.java b/src/main/java/com/example/bcsd/controller/PostViewController.java index 0b39fa32..7aab47d7 100644 --- a/src/main/java/com/example/bcsd/controller/PostViewController.java +++ b/src/main/java/com/example/bcsd/controller/PostViewController.java @@ -1,6 +1,6 @@ package com.example.bcsd.controller; -import com.example.bcsd.model.Article; +import com.example.bcsd.controller.dto.ArticleResponse; import com.example.bcsd.service.ArticleService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -20,7 +20,7 @@ public PostViewController(ArticleService articleService) { @GetMapping public String getAllArticlesView(Model model) { - List
articles = articleService.getAllArticles(); + List articles = articleService.getAllArticles(); model.addAttribute("articleList", articles); diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java b/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java index b9e95300..cd5bd3fd 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java @@ -1,4 +1,46 @@ package com.example.bcsd.controller.dto; +import java.time.LocalDateTime; + public class ArticleResponse { + private String title; + private Long authorId; + private Long boardId; + private String content; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public ArticleResponse(String title, Long authorId, Long boardId, String content, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.title = title; + this.authorId = authorId; + this.boardId = boardId; + this.content = content; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public String getTitle() { + return title; + } + + public Long getAuthorId() { + return authorId; + } + + public Long getBoardId() { + return boardId; + } + + public String getContent() { + return content; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } } + diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index bcc5dedd..7169caf9 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,5 +1,7 @@ package com.example.bcsd.model; +import com.example.bcsd.controller.dto.ArticleResponse; + import java.time.LocalDateTime; public class Article { @@ -55,4 +57,8 @@ public Article update(String title, String content) { public void setId(Long id) { this.id = id; } + + public ArticleResponse toResponse() { + return new ArticleResponse(title, authorId, boardId, content, createdAt, updatedAt); + } } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 73199166..c641e581 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -1,5 +1,6 @@ package com.example.bcsd.repository; +import com.example.bcsd.controller.dto.ArticleResponse; import com.example.bcsd.model.Article; import org.springframework.stereotype.Repository; @@ -26,7 +27,7 @@ public Article findById(Long id) { throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); } - return articles.get(id); + return article; } public Article save(Article article) { diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 91a681cf..0afddcf7 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,6 +1,7 @@ package com.example.bcsd.service; import com.example.bcsd.controller.dto.ArticleCreateRequest; +import com.example.bcsd.controller.dto.ArticleResponse; import com.example.bcsd.controller.dto.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; @@ -16,24 +17,30 @@ public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } - public List
getAllArticles() { - return articleRepository.findAll(); + public List getAllArticles() { + return articleRepository.findAll() + .stream() + .map(Article::toResponse) + .toList(); } - public Article getArticleById(Long id) { - return articleRepository.findById(id); + public ArticleResponse getArticleById(Long id) { + return articleRepository.findById(id) + .toResponse(); } - public Article createArticle(ArticleCreateRequest request) { - return articleRepository.save(request.toEntity()); + public ArticleResponse createArticle(ArticleCreateRequest request) { + return articleRepository.save(request.toEntity()) + .toResponse(); } - public Article updateArticleById(Long id, ArticleUpdateRequest request) { + public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { Article article = articleRepository .findById(id) .update(request.getTitle(), request.getContent()); - return articleRepository.save(id, article); + return articleRepository.save(id, article) + .toResponse(); } public void deleteArticleById(Long id) { From 2f8f4004e11b7989b75355d72801c3d0ca908a0b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 13:48:44 +0900 Subject: [PATCH 024/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20CRUD=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 --- .../bcsd/controller/MemberController.java | 57 +++++++++++++++++++ .../bcsd/controller/dto/MemberRequest.java | 25 ++++++++ .../bcsd/controller/dto/MemberResponse.java | 25 ++++++++ .../java/com/example/bcsd/model/Member.java | 40 +++++++++++++ .../bcsd/repository/ArticleRepository.java | 1 - .../bcsd/repository/MemberRepository.java | 48 ++++++++++++++++ .../example/bcsd/service/MemberService.java | 47 +++++++++++++++ 7 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/bcsd/controller/MemberController.java create mode 100644 src/main/java/com/example/bcsd/controller/dto/MemberRequest.java create mode 100644 src/main/java/com/example/bcsd/controller/dto/MemberResponse.java create mode 100644 src/main/java/com/example/bcsd/repository/MemberRepository.java create mode 100644 src/main/java/com/example/bcsd/service/MemberService.java diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java new file mode 100644 index 00000000..d909fd3f --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -0,0 +1,57 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.controller.dto.MemberRequest; +import com.example.bcsd.controller.dto.MemberResponse; +import com.example.bcsd.service.MemberService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.NoSuchElementException; + +@RestController +@RequestMapping("/members") +public class MemberController { + private final MemberService memberService; + + public MemberController(MemberService memberService) { + this.memberService = memberService; + } + + @GetMapping + public ResponseEntity> getAllMembers() { + return ResponseEntity.ok(memberService.getAllMembers()); + } + + @GetMapping("/{id}") + public ResponseEntity getMemberById(@PathVariable Long id) { + return ResponseEntity + .ok(memberService.getMemberById(id)); + } + + @PostMapping() + public ResponseEntity createMember(@RequestBody MemberRequest request) { + return ResponseEntity + .status(HttpStatus.CREATED) + .body(memberService.createMember(request)); + } + + @PutMapping("/{id}") + public ResponseEntity updateMember(@PathVariable Long id, @RequestBody MemberRequest request) { + return ResponseEntity + .ok(memberService.updateMember(id, request)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteMember(@PathVariable Long id) { + memberService.deleteMember(id); + + return ResponseEntity.noContent().build(); + } + + @ExceptionHandler(NoSuchElementException.class) + public ResponseEntity notFoundExceptionHandle() { + return ResponseEntity.notFound().build(); + } +} diff --git a/src/main/java/com/example/bcsd/controller/dto/MemberRequest.java b/src/main/java/com/example/bcsd/controller/dto/MemberRequest.java new file mode 100644 index 00000000..876e7604 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/MemberRequest.java @@ -0,0 +1,25 @@ +package com.example.bcsd.controller.dto; + +import com.example.bcsd.model.Member; + +public class MemberRequest { + private String name; + private String email; + private String pw; + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getPw() { + return pw; + } + + public Member toEntity() { + return new Member(name, email, pw); + } +} diff --git a/src/main/java/com/example/bcsd/controller/dto/MemberResponse.java b/src/main/java/com/example/bcsd/controller/dto/MemberResponse.java new file mode 100644 index 00000000..5fe8a0ed --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/MemberResponse.java @@ -0,0 +1,25 @@ +package com.example.bcsd.controller.dto; + +public class MemberResponse { + private Long id; + private String name; + private String email; + + public MemberResponse(Long id, String name, String email) { + this.id = id; + this.name = name; + this.email = email; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } +} diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index e0933295..a8de5ea9 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,8 +1,48 @@ package com.example.bcsd.model; +import com.example.bcsd.controller.dto.MemberResponse; + public class Member { private Long id; private String name; private String email; private String pw; + + public Member(String name, String email, String pw) { + this.name = name; + this.email = email; + this.pw = pw; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getPw() { + return pw; + } + + public void setId(Long id) { + this.id = id; + } + + public Member update(String name, String email, String pw) { + this.name = name; + this.email = email; + this.pw = pw; + + return this; + } + + public MemberResponse toResponse() { + return new MemberResponse(id, name, email); + } } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index c641e581..992290e6 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -34,7 +34,6 @@ public Article save(Article article) { article.setId(key); articles.put(key++, article); - return article; } diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java new file mode 100644 index 00000000..d7e5cc22 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -0,0 +1,48 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Member; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class MemberRepository { + private Long key = 1L; + private final Map members = new HashMap<>(); + + public List findAll() { + List result = new ArrayList<>(); + + members.forEach((id, member) -> + result.add(member)); + + return result; + } + + public Member findById(Long id) { + Member member = members.get(id); + + if (member == null) { + throw new NoSuchElementException("해당 멤버를 찾을 수 없습니다."); + } + + return member; + } + + public Member save(Member member) { + member.setId(key); + members.put(key++, member); + + return member; + } + + public Member save(Long id, Member member) { + members.put(id, member); + + return member; + } + + public void delete(Long id) { + members.remove(id); + } +} diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java new file mode 100644 index 00000000..fa333a29 --- /dev/null +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -0,0 +1,47 @@ +package com.example.bcsd.service; + +import com.example.bcsd.controller.dto.MemberRequest; +import com.example.bcsd.controller.dto.MemberResponse; +import com.example.bcsd.model.Member; +import com.example.bcsd.repository.MemberRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MemberService { + private final MemberRepository memberRepository; + + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public List getAllMembers() { + return memberRepository.findAll() + .stream() + .map(Member::toResponse) + .toList(); + } + + public MemberResponse getMemberById(Long id) { + return memberRepository.findById(id) + .toResponse(); + } + + public MemberResponse createMember(MemberRequest request) { + return memberRepository.save(request.toEntity()) + .toResponse(); + } + + public MemberResponse updateMember(Long id, MemberRequest request) { + Member member = memberRepository.findById(id) + .update(request.getName(), request.getEmail(), request.getPw()); + + return memberRepository.save(id, member) + .toResponse(); + } + + public void deleteMember(Long id) { + memberRepository.delete(id); + } +} From 8b4193595b89e492252255632b70099f01a2a907 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 15:27:03 +0900 Subject: [PATCH 025/143] =?UTF-8?q?feat.=20article=EC=9D=98=20authorId?= =?UTF-8?q?=EC=99=80=20Member=EC=9D=98=20id=20=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=ED=95=B4=EC=84=9C=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EB=B0=98=ED=99=98=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ArticleViewController.java | 29 ++++++++++++++ .../bcsd/controller/PostViewController.java | 29 -------------- .../controller/dto/ArticleViewResponse.java | 40 +++++++++++++++++++ .../bcsd/service/ArticleViewService.java | 33 +++++++++++++++ 4 files changed, 102 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/example/bcsd/controller/ArticleViewController.java delete mode 100644 src/main/java/com/example/bcsd/controller/PostViewController.java create mode 100644 src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java create mode 100644 src/main/java/com/example/bcsd/service/ArticleViewService.java diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java new file mode 100644 index 00000000..4f785b1c --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -0,0 +1,29 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.controller.dto.ArticleViewResponse; +import com.example.bcsd.service.ArticleViewService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("/posts") +public class ArticleViewController { + private final ArticleViewService articleViewService; + + public ArticleViewController(ArticleViewService articleViewService) { + this.articleViewService = articleViewService; + } + + @GetMapping + public String getAllArticlesView(Model model) { + List articleList = articleViewService.getAllPostViews(); + + model.addAttribute("articleList", articleList); + + return "post"; + } +} diff --git a/src/main/java/com/example/bcsd/controller/PostViewController.java b/src/main/java/com/example/bcsd/controller/PostViewController.java deleted file mode 100644 index 7aab47d7..00000000 --- a/src/main/java/com/example/bcsd/controller/PostViewController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.bcsd.controller; - -import com.example.bcsd.controller.dto.ArticleResponse; -import com.example.bcsd.service.ArticleService; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -import java.util.List; - -@Controller -@RequestMapping("/posts") -public class PostViewController { - private final ArticleService articleService; - - public PostViewController(ArticleService articleService) { - this.articleService = articleService; - } - - @GetMapping - public String getAllArticlesView(Model model) { - List articles = articleService.getAllArticles(); - - model.addAttribute("articleList", articles); - - return "post"; - } -} diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java b/src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java new file mode 100644 index 00000000..0fc98049 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java @@ -0,0 +1,40 @@ +package com.example.bcsd.controller.dto; + +import java.time.LocalDateTime; + +public class ArticleViewResponse { + private String title; + private String author; + private String content; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public ArticleViewResponse(String title, String author, String content, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.title = title; + this.author = author; + this.content = content; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public String getTitle() { + return title; + } + + public String getAuthor() { + return author; + } + + public String getContent() { + return content; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } +} + diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java new file mode 100644 index 00000000..6c40a2a5 --- /dev/null +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -0,0 +1,33 @@ +package com.example.bcsd.service; + +import com.example.bcsd.controller.dto.ArticleViewResponse; +import com.example.bcsd.model.Article; +import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.MemberRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ArticleViewService { + private final ArticleRepository articleRepository; + private final MemberRepository memberRepository; + + public ArticleViewService(ArticleRepository articleRepository, MemberRepository memberRepository) { + this.articleRepository = articleRepository; + this.memberRepository = memberRepository; + } + + public List getAllPostViews() { + List
articles = articleRepository.findAll(); + + return articles.stream() + .map(article -> new ArticleViewResponse( + article.getTitle(), + memberRepository.findById(article.getAuthorId()).getName(), + article.getContent(), + article.getCreatedAt(), + article.getUpdatedAt()) + ).toList(); + } +} From d56dc92349fbc637cc360d785b44a838a647371f Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 15:28:07 +0900 Subject: [PATCH 026/143] =?UTF-8?q?chore.=20DTO=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20request,=20response=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/ArticleController.java | 7 +++---- .../com/example/bcsd/controller/ArticleViewController.java | 2 +- .../java/com/example/bcsd/controller/JsonController.java | 2 +- .../java/com/example/bcsd/controller/MemberController.java | 4 ++-- .../controller/dto/{ => request}/ArticleCreateRequest.java | 2 +- .../controller/dto/{ => request}/ArticleUpdateRequest.java | 4 +--- .../bcsd/controller/dto/{ => request}/MemberRequest.java | 2 +- .../controller/dto/{ => resopnse}/ArticleResponse.java | 2 +- .../controller/dto/{ => resopnse}/ArticleViewResponse.java | 2 +- .../bcsd/controller/dto/{ => resopnse}/JsonResponse.java | 2 +- .../bcsd/controller/dto/{ => resopnse}/MemberResponse.java | 2 +- src/main/java/com/example/bcsd/model/Article.java | 2 +- src/main/java/com/example/bcsd/model/Member.java | 2 +- .../com/example/bcsd/repository/ArticleRepository.java | 1 - src/main/java/com/example/bcsd/service/ArticleService.java | 6 +++--- .../java/com/example/bcsd/service/ArticleViewService.java | 2 +- src/main/java/com/example/bcsd/service/MemberService.java | 4 ++-- 17 files changed, 22 insertions(+), 26 deletions(-) rename src/main/java/com/example/bcsd/controller/dto/{ => request}/ArticleCreateRequest.java (93%) rename src/main/java/com/example/bcsd/controller/dto/{ => request}/ArticleUpdateRequest.java (81%) rename src/main/java/com/example/bcsd/controller/dto/{ => request}/MemberRequest.java (89%) rename src/main/java/com/example/bcsd/controller/dto/{ => resopnse}/ArticleResponse.java (95%) rename src/main/java/com/example/bcsd/controller/dto/{ => resopnse}/ArticleViewResponse.java (94%) rename src/main/java/com/example/bcsd/controller/dto/{ => resopnse}/JsonResponse.java (85%) rename src/main/java/com/example/bcsd/controller/dto/{ => resopnse}/MemberResponse.java (89%) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 32014402..2fd30ee7 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,9 +1,8 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.ArticleCreateRequest; -import com.example.bcsd.controller.dto.ArticleResponse; -import com.example.bcsd.controller.dto.ArticleUpdateRequest; -import com.example.bcsd.model.Article; +import com.example.bcsd.controller.dto.request.ArticleCreateRequest; +import com.example.bcsd.controller.dto.resopnse.ArticleResponse; +import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; import com.example.bcsd.service.ArticleService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index 4f785b1c..ff814e58 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -1,6 +1,6 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.ArticleViewResponse; +import com.example.bcsd.controller.dto.resopnse.ArticleViewResponse; import com.example.bcsd.service.ArticleViewService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/src/main/java/com/example/bcsd/controller/JsonController.java b/src/main/java/com/example/bcsd/controller/JsonController.java index b8a9e202..865daef1 100644 --- a/src/main/java/com/example/bcsd/controller/JsonController.java +++ b/src/main/java/com/example/bcsd/controller/JsonController.java @@ -1,6 +1,6 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.JsonResponse; +import com.example.bcsd.controller.dto.resopnse.JsonResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index d909fd3f..97b55c69 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -1,7 +1,7 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.MemberRequest; -import com.example.bcsd.controller.dto.MemberResponse; +import com.example.bcsd.controller.dto.request.MemberRequest; +import com.example.bcsd.controller.dto.resopnse.MemberResponse; import com.example.bcsd.service.MemberService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java similarity index 93% rename from src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java rename to src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java index 6530c0e3..8b16edbc 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.request; import com.example.bcsd.model.Article; diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java similarity index 81% rename from src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java rename to src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java index fa068df0..589f010b 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java @@ -1,6 +1,4 @@ -package com.example.bcsd.controller.dto; - -import com.example.bcsd.model.Article; +package com.example.bcsd.controller.dto.request; public class ArticleUpdateRequest { private String title; diff --git a/src/main/java/com/example/bcsd/controller/dto/MemberRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java similarity index 89% rename from src/main/java/com/example/bcsd/controller/dto/MemberRequest.java rename to src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java index 876e7604..9b891936 100644 --- a/src/main/java/com/example/bcsd/controller/dto/MemberRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.request; import com.example.bcsd.model.Member; diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java similarity index 95% rename from src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java rename to src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java index cd5bd3fd..2a25e5ec 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.resopnse; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java similarity index 94% rename from src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java rename to src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java index 0fc98049..ce7be9ed 100644 --- a/src/main/java/com/example/bcsd/controller/dto/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.resopnse; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/bcsd/controller/dto/JsonResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java similarity index 85% rename from src/main/java/com/example/bcsd/controller/dto/JsonResponse.java rename to src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java index b9ad0c5f..717f3df8 100644 --- a/src/main/java/com/example/bcsd/controller/dto/JsonResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.resopnse; public class JsonResponse { private int age; diff --git a/src/main/java/com/example/bcsd/controller/dto/MemberResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java similarity index 89% rename from src/main/java/com/example/bcsd/controller/dto/MemberResponse.java rename to src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java index 5fe8a0ed..529e9ac1 100644 --- a/src/main/java/com/example/bcsd/controller/dto/MemberResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto; +package com.example.bcsd.controller.dto.resopnse; public class MemberResponse { private Long id; diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 7169caf9..93303440 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,6 +1,6 @@ package com.example.bcsd.model; -import com.example.bcsd.controller.dto.ArticleResponse; +import com.example.bcsd.controller.dto.resopnse.ArticleResponse; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index a8de5ea9..f7aa2241 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,6 +1,6 @@ package com.example.bcsd.model; -import com.example.bcsd.controller.dto.MemberResponse; +import com.example.bcsd.controller.dto.resopnse.MemberResponse; public class Member { private Long id; diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 992290e6..a2d82a00 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -1,6 +1,5 @@ package com.example.bcsd.repository; -import com.example.bcsd.controller.dto.ArticleResponse; import com.example.bcsd.model.Article; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 0afddcf7..7ae89562 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,8 +1,8 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.ArticleCreateRequest; -import com.example.bcsd.controller.dto.ArticleResponse; -import com.example.bcsd.controller.dto.ArticleUpdateRequest; +import com.example.bcsd.controller.dto.request.ArticleCreateRequest; +import com.example.bcsd.controller.dto.resopnse.ArticleResponse; +import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 6c40a2a5..51eb6506 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -1,6 +1,6 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.ArticleViewResponse; +import com.example.bcsd.controller.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index fa333a29..c3c345e8 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -1,7 +1,7 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.MemberRequest; -import com.example.bcsd.controller.dto.MemberResponse; +import com.example.bcsd.controller.dto.request.MemberRequest; +import com.example.bcsd.controller.dto.resopnse.MemberResponse; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; import org.springframework.stereotype.Service; From f0271978973a09efbee4dd2cd2c3de2469e2c7e9 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 15:59:11 +0900 Subject: [PATCH 027/143] =?UTF-8?q?build.=20=EB=A1=AC=EB=B3=B5=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index db3ebcf1..d2ee1843 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + compileOnly("org.projectlombok:lombok:1.18.38") } tasks.named('test') { From 82aaf7f2f2b9cf68788580e4ba598808d7adce4f Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 10 May 2025 16:06:46 +0900 Subject: [PATCH 028/143] =?UTF-8?q?refactory.=20=EB=A1=AC=EB=B3=B5=20?= =?UTF-8?q?=EA=B2=8C=ED=84=B0,=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 6 +-- .../controller/ArticleViewController.java | 6 +-- .../bcsd/controller/MemberController.java | 6 +-- .../dto/request/ArticleCreateRequest.java | 23 ++--------- .../dto/request/ArticleUpdateRequest.java | 18 +++------ .../controller/dto/request/MemberRequest.java | 16 ++------ .../dto/resopnse/ArticleResponse.java | 38 +++--------------- .../dto/resopnse/ArticleViewResponse.java | 33 +++------------- .../controller/dto/resopnse/JsonResponse.java | 18 +++------ .../dto/resopnse/MemberResponse.java | 23 +++-------- .../java/com/example/bcsd/model/Article.java | 39 ++++--------------- .../java/com/example/bcsd/model/Member.java | 25 +++--------- .../example/bcsd/service/ArticleService.java | 6 +-- .../bcsd/service/ArticleViewService.java | 7 +--- .../example/bcsd/service/MemberService.java | 6 +-- 15 files changed, 58 insertions(+), 212 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 2fd30ee7..6b86b204 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -4,6 +4,7 @@ import com.example.bcsd.controller.dto.resopnse.ArticleResponse; import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; import com.example.bcsd.service.ArticleService; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,13 +14,10 @@ @RestController @RequestMapping("/articles") +@RequiredArgsConstructor public class ArticleController { private final ArticleService articleService; - public ArticleController(ArticleService articleService) { - this.articleService = articleService; - } - @GetMapping public ResponseEntity> getAllArticles() { return ResponseEntity diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index ff814e58..46492870 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -2,6 +2,7 @@ import com.example.bcsd.controller.dto.resopnse.ArticleViewResponse; import com.example.bcsd.service.ArticleViewService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -11,13 +12,10 @@ @Controller @RequestMapping("/posts") +@RequiredArgsConstructor public class ArticleViewController { private final ArticleViewService articleViewService; - public ArticleViewController(ArticleViewService articleViewService) { - this.articleViewService = articleViewService; - } - @GetMapping public String getAllArticlesView(Model model) { List articleList = articleViewService.getAllPostViews(); diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index 97b55c69..24c8b5a8 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -3,6 +3,7 @@ import com.example.bcsd.controller.dto.request.MemberRequest; import com.example.bcsd.controller.dto.resopnse.MemberResponse; import com.example.bcsd.service.MemberService; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -12,13 +13,10 @@ @RestController @RequestMapping("/members") +@RequiredArgsConstructor public class MemberController { private final MemberService memberService; - public MemberController(MemberService memberService) { - this.memberService = memberService; - } - @GetMapping public ResponseEntity> getAllMembers() { return ResponseEntity.ok(memberService.getAllMembers()); diff --git a/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java index 8b16edbc..7373b832 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java @@ -1,33 +1,18 @@ package com.example.bcsd.controller.dto.request; import com.example.bcsd.model.Article; +import lombok.AllArgsConstructor; +import lombok.Getter; +@Getter +@AllArgsConstructor public class ArticleCreateRequest { private String title; private Long authorId; private Long boardId; private String content; - public ArticleCreateRequest(String title, Long authorId, Long boardId, String content) { - this.title = title; - this.authorId = authorId; - this.boardId = boardId; - this.content = content; - } - public Article toEntity() { return new Article(title, authorId, boardId, content); } - - public String getTitle() { - return title; - } - - public String getContent() { - return content; - } - - public Long getAuthorId() { - return authorId; - } } diff --git a/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java index 589f010b..6f12bb83 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java @@ -1,19 +1,11 @@ package com.example.bcsd.controller.dto.request; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public class ArticleUpdateRequest { private String title; private String content; - - public ArticleUpdateRequest(String title, String content) { - this.title = title; - this.content = content; - } - - public String getTitle() { - return title; - } - - public String getContent() { - return content; - } } diff --git a/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java index 9b891936..520ec52c 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java @@ -1,24 +1,16 @@ package com.example.bcsd.controller.dto.request; import com.example.bcsd.model.Member; +import lombok.AllArgsConstructor; +import lombok.Getter; +@Getter +@AllArgsConstructor public class MemberRequest { private String name; private String email; private String pw; - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public String getPw() { - return pw; - } - public Member toEntity() { return new Member(name, email, pw); } diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java index 2a25e5ec..14daa7ce 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java @@ -1,7 +1,12 @@ package com.example.bcsd.controller.dto.resopnse; +import lombok.AllArgsConstructor; +import lombok.Getter; + import java.time.LocalDateTime; +@Getter +@AllArgsConstructor public class ArticleResponse { private String title; private Long authorId; @@ -9,38 +14,5 @@ public class ArticleResponse { private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; - - public ArticleResponse(String title, Long authorId, Long boardId, String content, LocalDateTime createdAt, LocalDateTime updatedAt) { - this.title = title; - this.authorId = authorId; - this.boardId = boardId; - this.content = content; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - } - - public String getTitle() { - return title; - } - - public Long getAuthorId() { - return authorId; - } - - public Long getBoardId() { - return boardId; - } - - public String getContent() { - return content; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public LocalDateTime getUpdatedAt() { - return updatedAt; - } } diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java index ce7be9ed..9747d2d8 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java @@ -1,40 +1,17 @@ package com.example.bcsd.controller.dto.resopnse; +import lombok.AllArgsConstructor; +import lombok.Getter; + import java.time.LocalDateTime; +@Getter +@AllArgsConstructor public class ArticleViewResponse { private String title; private String author; private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; - - public ArticleViewResponse(String title, String author, String content, LocalDateTime createdAt, LocalDateTime updatedAt) { - this.title = title; - this.author = author; - this.content = content; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - } - - public String getTitle() { - return title; - } - - public String getAuthor() { - return author; - } - - public String getContent() { - return content; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public LocalDateTime getUpdatedAt() { - return updatedAt; - } } diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java index 717f3df8..097226b8 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java @@ -1,19 +1,11 @@ package com.example.bcsd.controller.dto.resopnse; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public class JsonResponse { private int age; private String name; - - public JsonResponse(int age, String name) { - this.age = age; - this.name = name; - } - - public int getAge() { - return age; - } - - public String getName() { - return name; - } } diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java index 529e9ac1..5393f866 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java @@ -1,25 +1,12 @@ package com.example.bcsd.controller.dto.resopnse; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public class MemberResponse { private Long id; private String name; private String email; - - public MemberResponse(Long id, String name, String email) { - this.id = id; - this.name = name; - this.email = email; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 93303440..4301a08a 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,16 +1,21 @@ package com.example.bcsd.model; import com.example.bcsd.controller.dto.resopnse.ArticleResponse; +import lombok.Getter; +import lombok.Setter; import java.time.LocalDateTime; +@Getter public class Article { + @Setter private Long id; + private String title; - private Long authorId; - private Long boardId; + private final Long authorId; + private final Long boardId; private String content; - private LocalDateTime createdAt; + private final LocalDateTime createdAt; private LocalDateTime updatedAt; public Article(String title, Long authorId, Long boardId, String content) { @@ -22,30 +27,6 @@ public Article(String title, Long authorId, Long boardId, String content) { this.updatedAt = LocalDateTime.now(); } - public String getTitle() { - return title; - } - - public Long getAuthorId() { - return authorId; - } - - public Long getBoardId() { - return boardId; - } - - public String getContent() { - return content; - } - - public LocalDateTime getCreatedAt() { - return createdAt; - } - - public LocalDateTime getUpdatedAt() { - return updatedAt; - } - public Article update(String title, String content) { this.title = title; this.content = content; @@ -54,10 +35,6 @@ public Article update(String title, String content) { return this; } - public void setId(Long id) { - this.id = id; - } - public ArticleResponse toResponse() { return new ArticleResponse(title, authorId, boardId, content, createdAt, updatedAt); } diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index f7aa2241..e381dd43 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,9 +1,14 @@ package com.example.bcsd.model; import com.example.bcsd.controller.dto.resopnse.MemberResponse; +import lombok.Getter; +import lombok.Setter; +@Getter public class Member { + @Setter private Long id; + private String name; private String email; private String pw; @@ -14,26 +19,6 @@ public Member(String name, String email, String pw) { this.pw = pw; } - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public String getPw() { - return pw; - } - - public void setId(Long id) { - this.id = id; - } - public Member update(String name, String email, String pw) { this.name = name; this.email = email; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 7ae89562..5fe76542 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -5,18 +5,16 @@ import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; @Service +@RequiredArgsConstructor public class ArticleService { private final ArticleRepository articleRepository; - public ArticleService(ArticleRepository articleRepository) { - this.articleRepository = articleRepository; - } - public List getAllArticles() { return articleRepository.findAll() .stream() diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 51eb6506..8238f7fd 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -4,20 +4,17 @@ import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; @Service +@RequiredArgsConstructor public class ArticleViewService { private final ArticleRepository articleRepository; private final MemberRepository memberRepository; - public ArticleViewService(ArticleRepository articleRepository, MemberRepository memberRepository) { - this.articleRepository = articleRepository; - this.memberRepository = memberRepository; - } - public List getAllPostViews() { List
articles = articleRepository.findAll(); diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index c3c345e8..03e7cd3f 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -4,18 +4,16 @@ import com.example.bcsd.controller.dto.resopnse.MemberResponse; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; @Service +@RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; - public MemberService(MemberRepository memberRepository) { - this.memberRepository = memberRepository; - } - public List getAllMembers() { return memberRepository.findAll() .stream() From 65c163a8cab607df0c518e746193b5a36a0548a7 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 17:41:55 +0900 Subject: [PATCH 029/143] =?UTF-8?q?build.=20=EB=A1=AC=EB=B3=B5=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index d2ee1843..3892d066 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' compileOnly("org.projectlombok:lombok:1.18.38") + annotationProcessor 'org.projectlombok:lombok:1.18.38' } tasks.named('test') { From 442fcd6edd9e85dd383ae6be54fc81e4cd173781 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 17:43:21 +0900 Subject: [PATCH 030/143] =?UTF-8?q?refactory.=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20->=20=EC=9D=91=EB=8B=B5=20DTO=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20DTO?= =?UTF-8?q?=20=EB=82=B4=EB=B6=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99,=20?= =?UTF-8?q?=EB=B9=8C=EB=8D=94=20=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/resopnse/ArticleResponse.java | 14 ++++++++++++++ .../dto/resopnse/MemberResponse.java | 11 +++++++++++ .../java/com/example/bcsd/model/Article.java | 4 ---- .../java/com/example/bcsd/model/Member.java | 4 ---- .../example/bcsd/service/ArticleService.java | 19 ++++++++++++------- .../example/bcsd/service/MemberService.java | 19 ++++++++++++------- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java index 14daa7ce..52e3c4db 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java @@ -1,12 +1,15 @@ package com.example.bcsd.controller.dto.resopnse; +import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import java.time.LocalDateTime; @Getter @AllArgsConstructor +@Builder public class ArticleResponse { private String title; private Long authorId; @@ -14,5 +17,16 @@ public class ArticleResponse { private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; + + public static ArticleResponse fromEntity(Article article) { + return ArticleResponse.builder() + .title(article.getTitle()) + .authorId(article.getAuthorId()) + .boardId(article.getBoardId()) + .content(article.getContent()) + .createdAt(article.getCreatedAt()) + .updatedAt(article.getUpdatedAt()) + .build(); + } } diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java index 5393f866..bfc6b499 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java @@ -1,12 +1,23 @@ package com.example.bcsd.controller.dto.resopnse; +import com.example.bcsd.model.Member; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter @AllArgsConstructor +@Builder public class MemberResponse { private Long id; private String name; private String email; + + public static MemberResponse fromEntity(Member member) { + return MemberResponse.builder() + .id(member.getId()) + .name(member.getName()) + .email(member.getEmail()) + .build(); + } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 4301a08a..810832b5 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -34,8 +34,4 @@ public Article update(String title, String content) { return this; } - - public ArticleResponse toResponse() { - return new ArticleResponse(title, authorId, boardId, content, createdAt, updatedAt); - } } diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index e381dd43..e39b8495 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -26,8 +26,4 @@ public Member update(String name, String email, String pw) { return this; } - - public MemberResponse toResponse() { - return new MemberResponse(id, name, email); - } } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 5fe76542..9cc4c49b 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -18,18 +18,22 @@ public class ArticleService { public List getAllArticles() { return articleRepository.findAll() .stream() - .map(Article::toResponse) + .map(ArticleResponse::fromEntity) .toList(); } public ArticleResponse getArticleById(Long id) { - return articleRepository.findById(id) - .toResponse(); + return ArticleResponse.fromEntity( + articleRepository.findById(id) + ); } public ArticleResponse createArticle(ArticleCreateRequest request) { - return articleRepository.save(request.toEntity()) - .toResponse(); + return ArticleResponse.fromEntity( + articleRepository.save( + request.toEntity() + ) + ); } public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { @@ -37,8 +41,9 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) .findById(id) .update(request.getTitle(), request.getContent()); - return articleRepository.save(id, article) - .toResponse(); + return ArticleResponse.fromEntity( + articleRepository.save(id, article) + ); } public void deleteArticleById(Long id) { diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 03e7cd3f..a31b2c09 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -17,26 +17,31 @@ public class MemberService { public List getAllMembers() { return memberRepository.findAll() .stream() - .map(Member::toResponse) + .map(MemberResponse::fromEntity) .toList(); } public MemberResponse getMemberById(Long id) { - return memberRepository.findById(id) - .toResponse(); + return MemberResponse.fromEntity( + memberRepository.findById(id) + ); } public MemberResponse createMember(MemberRequest request) { - return memberRepository.save(request.toEntity()) - .toResponse(); + return MemberResponse.fromEntity( + memberRepository.save( + request.toEntity() + ) + ); } public MemberResponse updateMember(Long id, MemberRequest request) { Member member = memberRepository.findById(id) .update(request.getName(), request.getEmail(), request.getPw()); - return memberRepository.save(id, member) - .toResponse(); + return MemberResponse.fromEntity( + memberRepository.save(id, member) + ); } public void deleteMember(Long id) { From ecf34685593711463698b1882726703760580d87 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 17:48:03 +0900 Subject: [PATCH 031/143] =?UTF-8?q?refactory.=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/resopnse/ArticleViewResponse.java | 2 ++ .../example/bcsd/service/ArticleViewService.java | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java index 9747d2d8..b10a6857 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java @@ -1,12 +1,14 @@ package com.example.bcsd.controller.dto.resopnse; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import java.time.LocalDateTime; @Getter @AllArgsConstructor +@Builder public class ArticleViewResponse { private String title; private String author; diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 8238f7fd..199aed5d 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -19,12 +19,13 @@ public List getAllPostViews() { List
articles = articleRepository.findAll(); return articles.stream() - .map(article -> new ArticleViewResponse( - article.getTitle(), - memberRepository.findById(article.getAuthorId()).getName(), - article.getContent(), - article.getCreatedAt(), - article.getUpdatedAt()) + .map(article -> ArticleViewResponse.builder() + .title(article.getTitle()) + .author(memberRepository.findById(article.getAuthorId()).getName()) + .content(article.getContent()) + .createdAt(article.getCreatedAt()) + .updatedAt(article.getUpdatedAt()) + .build() ).toList(); } } From 730fb7067c3da42c85d390b3697a59479f693318 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 17:54:56 +0900 Subject: [PATCH 032/143] =?UTF-8?q?refactory.=20=EC=9D=91=EB=8B=B5=20DTO?= =?UTF-8?q?=20->=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20DTO=EC=97=90=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/resopnse/ArticleViewResponse.java | 11 +++++++++++ .../com/example/bcsd/service/ArticleViewService.java | 11 ++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java index b10a6857..f1abcda4 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java @@ -1,5 +1,6 @@ package com.example.bcsd.controller.dto.resopnse; +import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,5 +16,15 @@ public class ArticleViewResponse { private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; + + public static ArticleViewResponse formEntity(Article article, String authorName) { + return ArticleViewResponse.builder() + .title(article.getTitle()) + .author(authorName) + .content(article.getContent()) + .createdAt(article.getCreatedAt()) + .updatedAt(article.getUpdatedAt()) + .build(); + } } diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 199aed5d..aa8af5c2 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -19,13 +19,10 @@ public List getAllPostViews() { List
articles = articleRepository.findAll(); return articles.stream() - .map(article -> ArticleViewResponse.builder() - .title(article.getTitle()) - .author(memberRepository.findById(article.getAuthorId()).getName()) - .content(article.getContent()) - .createdAt(article.getCreatedAt()) - .updatedAt(article.getUpdatedAt()) - .build() + .map(article -> + ArticleViewResponse.formEntity( + article, memberRepository.findById(article.getId()).getName() + ) ).toList(); } } From 9d75c87a722c1bff0f11c3724642f8f07281c011 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 17:55:25 +0900 Subject: [PATCH 033/143] =?UTF-8?q?chore.=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/controller/ArticleController.java | 6 +++--- .../com/example/bcsd/controller/ArticleViewController.java | 2 +- .../java/com/example/bcsd/controller/JsonController.java | 2 +- .../java/com/example/bcsd/controller/MemberController.java | 4 ++-- .../{controller => }/dto/request/ArticleCreateRequest.java | 2 +- .../{controller => }/dto/request/ArticleUpdateRequest.java | 2 +- .../bcsd/{controller => }/dto/request/MemberRequest.java | 2 +- .../bcsd/{controller => }/dto/resopnse/ArticleResponse.java | 2 +- .../{controller => }/dto/resopnse/ArticleViewResponse.java | 2 +- .../bcsd/{controller => }/dto/resopnse/JsonResponse.java | 2 +- .../bcsd/{controller => }/dto/resopnse/MemberResponse.java | 2 +- src/main/java/com/example/bcsd/model/Article.java | 1 - src/main/java/com/example/bcsd/model/Member.java | 1 - src/main/java/com/example/bcsd/service/ArticleService.java | 6 +++--- .../java/com/example/bcsd/service/ArticleViewService.java | 2 +- src/main/java/com/example/bcsd/service/MemberService.java | 4 ++-- 16 files changed, 20 insertions(+), 22 deletions(-) rename src/main/java/com/example/bcsd/{controller => }/dto/request/ArticleCreateRequest.java (88%) rename src/main/java/com/example/bcsd/{controller => }/dto/request/ArticleUpdateRequest.java (78%) rename src/main/java/com/example/bcsd/{controller => }/dto/request/MemberRequest.java (86%) rename src/main/java/com/example/bcsd/{controller => }/dto/resopnse/ArticleResponse.java (94%) rename src/main/java/com/example/bcsd/{controller => }/dto/resopnse/ArticleViewResponse.java (93%) rename src/main/java/com/example/bcsd/{controller => }/dto/resopnse/JsonResponse.java (76%) rename src/main/java/com/example/bcsd/{controller => }/dto/resopnse/MemberResponse.java (91%) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 6b86b204..1207b398 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,8 +1,8 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.request.ArticleCreateRequest; -import com.example.bcsd.controller.dto.resopnse.ArticleResponse; -import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; +import com.example.bcsd.dto.request.ArticleCreateRequest; +import com.example.bcsd.dto.resopnse.ArticleResponse; +import com.example.bcsd.dto.request.ArticleUpdateRequest; import com.example.bcsd.service.ArticleService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index 46492870..96f2f254 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -1,6 +1,6 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.resopnse.ArticleViewResponse; +import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.service.ArticleViewService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; diff --git a/src/main/java/com/example/bcsd/controller/JsonController.java b/src/main/java/com/example/bcsd/controller/JsonController.java index 865daef1..15266aaa 100644 --- a/src/main/java/com/example/bcsd/controller/JsonController.java +++ b/src/main/java/com/example/bcsd/controller/JsonController.java @@ -1,6 +1,6 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.resopnse.JsonResponse; +import com.example.bcsd.dto.resopnse.JsonResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index 24c8b5a8..04e16c81 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -1,7 +1,7 @@ package com.example.bcsd.controller; -import com.example.bcsd.controller.dto.request.MemberRequest; -import com.example.bcsd.controller.dto.resopnse.MemberResponse; +import com.example.bcsd.dto.request.MemberRequest; +import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java similarity index 88% rename from src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java rename to src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index 7373b832..cb8530b5 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.request; +package com.example.bcsd.dto.request; import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java similarity index 78% rename from src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java rename to src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index 6f12bb83..d3aabb38 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.request; +package com.example.bcsd.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java similarity index 86% rename from src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java rename to src/main/java/com/example/bcsd/dto/request/MemberRequest.java index 520ec52c..38654cba 100644 --- a/src/main/java/com/example/bcsd/controller/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.request; +package com.example.bcsd.dto.request; import com.example.bcsd.model.Member; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java similarity index 94% rename from src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java rename to src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index 52e3c4db..64288af1 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.resopnse; +package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java similarity index 93% rename from src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java rename to src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java index f1abcda4..32d4225f 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.resopnse; +package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java similarity index 76% rename from src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java rename to src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java index 097226b8..4b37cdad 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/JsonResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.resopnse; +package com.example.bcsd.dto.resopnse; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java similarity index 91% rename from src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java rename to src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java index bfc6b499..0bf2f354 100644 --- a/src/main/java/com/example/bcsd/controller/dto/resopnse/MemberResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java @@ -1,4 +1,4 @@ -package com.example.bcsd.controller.dto.resopnse; +package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Member; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 810832b5..576504ba 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,6 +1,5 @@ package com.example.bcsd.model; -import com.example.bcsd.controller.dto.resopnse.ArticleResponse; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index e39b8495..de08064c 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,6 +1,5 @@ package com.example.bcsd.model; -import com.example.bcsd.controller.dto.resopnse.MemberResponse; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 9cc4c49b..6f7e60aa 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,8 +1,8 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.request.ArticleCreateRequest; -import com.example.bcsd.controller.dto.resopnse.ArticleResponse; -import com.example.bcsd.controller.dto.request.ArticleUpdateRequest; +import com.example.bcsd.dto.request.ArticleCreateRequest; +import com.example.bcsd.dto.resopnse.ArticleResponse; +import com.example.bcsd.dto.request.ArticleUpdateRequest; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index aa8af5c2..9a34fcd7 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -1,6 +1,6 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.resopnse.ArticleViewResponse; +import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index a31b2c09..2c571dbe 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -1,7 +1,7 @@ package com.example.bcsd.service; -import com.example.bcsd.controller.dto.request.MemberRequest; -import com.example.bcsd.controller.dto.resopnse.MemberResponse; +import com.example.bcsd.dto.request.MemberRequest; +import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; From 5d99bd4b9cdceff1e98e4ee2b377db5956d45569 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:00:48 +0900 Subject: [PATCH 034/143] =?UTF-8?q?refactory.=20=EC=A0=84=EC=97=AD?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 6 ------ .../bcsd/controller/MemberController.java | 5 ----- .../bcsd/exception/GlobalExceptionHandler.java | 16 ++++++++++++++++ 3 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 1207b398..d79b8abf 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -51,10 +51,4 @@ public ResponseEntity deleteArticleById(@PathVariable Long id) { return ResponseEntity.noContent().build(); } - - @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity notFoundExceptionHandle() { - return ResponseEntity.notFound().build(); - } - } diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index 04e16c81..3db9704b 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -47,9 +47,4 @@ public ResponseEntity deleteMember(@PathVariable Long id) { return ResponseEntity.noContent().build(); } - - @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity notFoundExceptionHandle() { - return ResponseEntity.notFound().build(); - } } diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..389468c0 --- /dev/null +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -0,0 +1,16 @@ +package com.example.bcsd.exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.NoSuchElementException; + +@RestControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler(NoSuchElementException.class) + public ResponseEntity notFoundExceptionHandle() { + return ResponseEntity.notFound().build(); + } + +} From ec281134be3e9b8c65a2e16a8d23c402e45df774 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:05:25 +0900 Subject: [PATCH 035/143] =?UTF-8?q?refactory.=20Repository=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/repository/ArticleRepository.java | 49 +++---------------- .../repository/ArticleRepositoryImpl.java | 48 ++++++++++++++++++ .../bcsd/repository/MemberRepository.java | 49 +++---------------- .../bcsd/repository/MemberRepositoryImpl.java | 48 ++++++++++++++++++ .../example/bcsd/service/ArticleService.java | 4 +- .../bcsd/service/ArticleViewService.java | 8 +-- .../example/bcsd/service/MemberService.java | 4 +- 7 files changed, 118 insertions(+), 92 deletions(-) create mode 100644 src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java create mode 100644 src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index a2d82a00..dfc0a316 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -1,48 +1,13 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Article; -import org.springframework.stereotype.Repository; -import java.util.*; +import java.util.List; -@Repository -public class ArticleRepository { - private Long key = 1L; - private final Map articles = new HashMap<>(); - - public List
findAll() { - List
result = new ArrayList<>(); - - articles.forEach((id, article) -> - result.add(article)); - - return result; - } - - public Article findById(Long id) { - Article article = articles.get(id); - - if (article == null) { - throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); - } - - return article; - } - - public Article save(Article article) { - article.setId(key); - articles.put(key++, article); - - return article; - } - - public Article save(Long id, Article article) { - articles.put(id, article); - - return article; - } - - public void delete(Long id) { - articles.remove(id); - } +public interface ArticleRepository { + List
findAll(); + Article findById(Long id); + Article save(Article article); + Article save(Long id, Article article); + void delete(Long id); } diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java new file mode 100644 index 00000000..7aae88a1 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java @@ -0,0 +1,48 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Article; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class ArticleRepositoryImpl implements ArticleRepository { + private Long key = 1L; + private final Map articles = new HashMap<>(); + + public List
findAll() { + List
result = new ArrayList<>(); + + articles.forEach((id, article) -> + result.add(article)); + + return result; + } + + public Article findById(Long id) { + Article article = articles.get(id); + + if (article == null) { + throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); + } + + return article; + } + + public Article save(Article article) { + article.setId(key); + articles.put(key++, article); + + return article; + } + + public Article save(Long id, Article article) { + articles.put(id, article); + + return article; + } + + public void delete(Long id) { + articles.remove(id); + } +} diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index d7e5cc22..f7a9acc0 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -1,48 +1,13 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Member; -import org.springframework.stereotype.Repository; -import java.util.*; +import java.util.List; -@Repository -public class MemberRepository { - private Long key = 1L; - private final Map members = new HashMap<>(); - - public List findAll() { - List result = new ArrayList<>(); - - members.forEach((id, member) -> - result.add(member)); - - return result; - } - - public Member findById(Long id) { - Member member = members.get(id); - - if (member == null) { - throw new NoSuchElementException("해당 멤버를 찾을 수 없습니다."); - } - - return member; - } - - public Member save(Member member) { - member.setId(key); - members.put(key++, member); - - return member; - } - - public Member save(Long id, Member member) { - members.put(id, member); - - return member; - } - - public void delete(Long id) { - members.remove(id); - } +public interface MemberRepository { + List findAll(); + Member findById(Long id); + Member save(Member member); + Member save(Long id, Member member); + void delete(Long id); } diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java new file mode 100644 index 00000000..ad71613b --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java @@ -0,0 +1,48 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Member; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class MemberRepositoryImpl { + private Long key = 1L; + private final Map members = new HashMap<>(); + + public List findAll() { + List result = new ArrayList<>(); + + members.forEach((id, member) -> + result.add(member)); + + return result; + } + + public Member findById(Long id) { + Member member = members.get(id); + + if (member == null) { + throw new NoSuchElementException("해당 멤버를 찾을 수 없습니다."); + } + + return member; + } + + public Member save(Member member) { + member.setId(key); + members.put(key++, member); + + return member; + } + + public Member save(Long id, Member member) { + members.put(id, member); + + return member; + } + + public void delete(Long id) { + members.remove(id); + } +} diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 6f7e60aa..747ee3db 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -4,7 +4,7 @@ import com.example.bcsd.dto.resopnse.ArticleResponse; import com.example.bcsd.dto.request.ArticleUpdateRequest; import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.ArticleRepositoryImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,7 +13,7 @@ @Service @RequiredArgsConstructor public class ArticleService { - private final ArticleRepository articleRepository; + private final ArticleRepositoryImpl articleRepository; public List getAllArticles() { return articleRepository.findAll() diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 9a34fcd7..e345f46a 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -2,8 +2,8 @@ import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepository; -import com.example.bcsd.repository.MemberRepository; +import com.example.bcsd.repository.ArticleRepositoryImpl; +import com.example.bcsd.repository.MemberRepositoryImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,8 +12,8 @@ @Service @RequiredArgsConstructor public class ArticleViewService { - private final ArticleRepository articleRepository; - private final MemberRepository memberRepository; + private final ArticleRepositoryImpl articleRepository; + private final MemberRepositoryImpl memberRepository; public List getAllPostViews() { List
articles = articleRepository.findAll(); diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 2c571dbe..a8024ea0 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -3,7 +3,7 @@ import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.model.Member; -import com.example.bcsd.repository.MemberRepository; +import com.example.bcsd.repository.MemberRepositoryImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ @Service @RequiredArgsConstructor public class MemberService { - private final MemberRepository memberRepository; + private final MemberRepositoryImpl memberRepository; public List getAllMembers() { return memberRepository.findAll() From 2fa05c174482cc73b95a5d30e867bad27bfae0ba Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:25:12 +0900 Subject: [PATCH 036/143] =?UTF-8?q?refacotry.=20Repository=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=8B=A8=EC=9D=BC=20=EA=B0=9C=EC=B2=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20Optional=20=ED=83=80=EC=9E=85=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/repository/ArticleRepository.java | 3 ++- .../example/bcsd/repository/ArticleRepositoryImpl.java | 8 ++------ .../com/example/bcsd/repository/MemberRepository.java | 3 ++- .../com/example/bcsd/repository/MemberRepositoryImpl.java | 8 ++------ .../java/com/example/bcsd/service/ArticleService.java | 7 +++++++ .../java/com/example/bcsd/service/ArticleViewService.java | 5 ++++- src/main/java/com/example/bcsd/service/MemberService.java | 7 +++++++ 7 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index dfc0a316..6c0af88c 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -3,10 +3,11 @@ import com.example.bcsd.model.Article; import java.util.List; +import java.util.Optional; public interface ArticleRepository { List
findAll(); - Article findById(Long id); + Optional
findById(Long id); Article save(Article article); Article save(Long id, Article article); void delete(Long id); diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java index 7aae88a1..674befe2 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java @@ -19,14 +19,10 @@ public List
findAll() { return result; } - public Article findById(Long id) { + public Optional
findById(Long id) { Article article = articles.get(id); - if (article == null) { - throw new NoSuchElementException("해당 게시글을 찾을 수 없습니다."); - } - - return article; + return Optional.ofNullable(article); } public Article save(Article article) { diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index f7a9acc0..b011d77e 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -3,10 +3,11 @@ import com.example.bcsd.model.Member; import java.util.List; +import java.util.Optional; public interface MemberRepository { List findAll(); - Member findById(Long id); + Optional findById(Long id); Member save(Member member); Member save(Long id, Member member); void delete(Long id); diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java index ad71613b..8c36e0aa 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java @@ -19,14 +19,10 @@ public List findAll() { return result; } - public Member findById(Long id) { + public Optional findById(Long id) { Member member = members.get(id); - if (member == null) { - throw new NoSuchElementException("해당 멤버를 찾을 수 없습니다."); - } - - return member; + return Optional.ofNullable(member); } public Member save(Member member) { diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 747ee3db..b16f82d8 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; @Service @RequiredArgsConstructor @@ -25,6 +26,9 @@ public List getAllArticles() { public ArticleResponse getArticleById(Long id) { return ArticleResponse.fromEntity( articleRepository.findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + ) ); } @@ -39,6 +43,9 @@ public ArticleResponse createArticle(ArticleCreateRequest request) { public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { Article article = articleRepository .findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + ) .update(request.getTitle(), request.getContent()); return ArticleResponse.fromEntity( diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index e345f46a..85261292 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -2,6 +2,7 @@ import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; +import com.example.bcsd.model.Member; import com.example.bcsd.repository.ArticleRepositoryImpl; import com.example.bcsd.repository.MemberRepositoryImpl; import lombok.RequiredArgsConstructor; @@ -21,7 +22,9 @@ public List getAllPostViews() { return articles.stream() .map(article -> ArticleViewResponse.formEntity( - article, memberRepository.findById(article.getId()).getName() + article, memberRepository.findById(article.getId()) + .map(Member::getName) + .orElse("알 수 없음") ) ).toList(); } diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index a8024ea0..2b3a2b6e 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; @Service @RequiredArgsConstructor @@ -24,6 +25,9 @@ public List getAllMembers() { public MemberResponse getMemberById(Long id) { return MemberResponse.fromEntity( memberRepository.findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + ) ); } @@ -37,6 +41,9 @@ public MemberResponse createMember(MemberRequest request) { public MemberResponse updateMember(Long id, MemberRequest request) { Member member = memberRepository.findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + ) .update(request.getName(), request.getEmail(), request.getPw()); return MemberResponse.fromEntity( From 7a8b1e33e08130b375339273f753691758a8baa8 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:30:38 +0900 Subject: [PATCH 037/143] =?UTF-8?q?fix.=20=EA=B8=80=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EB=A5=BC=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20id=EB=A1=9C?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/ArticleViewService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 85261292..cbc4d6cf 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -22,7 +22,7 @@ public List getAllPostViews() { return articles.stream() .map(article -> ArticleViewResponse.formEntity( - article, memberRepository.findById(article.getId()) + article, memberRepository.findById(article.getAuthorId()) .map(Member::getName) .orElse("알 수 없음") ) From 06a7c7ff780bd6b9bf47f02dd6084432ea77c401 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:31:05 +0900 Subject: [PATCH 038/143] =?UTF-8?q?refactory.=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=9D=91=EB=8B=B5=20DTO=EC=97=90=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20id=20=EC=86=8D=EC=84=B1=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 --- .../java/com/example/bcsd/dto/resopnse/ArticleResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index 64288af1..91f73879 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -11,6 +11,7 @@ @AllArgsConstructor @Builder public class ArticleResponse { + private Long id; private String title; private Long authorId; private Long boardId; @@ -20,6 +21,7 @@ public class ArticleResponse { public static ArticleResponse fromEntity(Article article) { return ArticleResponse.builder() + .id(article.getId()) .title(article.getTitle()) .authorId(article.getAuthorId()) .boardId(article.getBoardId()) From 417bfe13f8787e4e2ae252c4e380b23a55291c26 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:35:11 +0900 Subject: [PATCH 039/143] =?UTF-8?q?refactory.=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EB=A1=9C=EA=B9=85=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/exception/GlobalExceptionHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index 389468c0..663f93a3 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package com.example.bcsd.exception; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -7,9 +8,11 @@ import java.util.NoSuchElementException; @RestControllerAdvice +@Slf4j public class GlobalExceptionHandler { @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity notFoundExceptionHandle() { + public ResponseEntity notFoundExceptionHandle(NoSuchElementException ex) { + log.error(ex.getMessage()); return ResponseEntity.notFound().build(); } From 2cfc2a7fd6036473745a53dcd4746c9c2b32bb14 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:38:49 +0900 Subject: [PATCH 040/143] =?UTF-8?q?chore.=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/controller/ArticleController.java | 1 - .../java/com/example/bcsd/controller/IntroduceController.java | 1 - src/main/java/com/example/bcsd/controller/MemberController.java | 1 - 3 files changed, 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index d79b8abf..853a8549 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.NoSuchElementException; @RestController @RequestMapping("/articles") diff --git a/src/main/java/com/example/bcsd/controller/IntroduceController.java b/src/main/java/com/example/bcsd/controller/IntroduceController.java index 217cdd48..5fdee4cb 100644 --- a/src/main/java/com/example/bcsd/controller/IntroduceController.java +++ b/src/main/java/com/example/bcsd/controller/IntroduceController.java @@ -5,7 +5,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; @Controller @RequestMapping("/introduce") diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index 3db9704b..0461a7a9 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.NoSuchElementException; @RestController @RequestMapping("/members") From 16fd87f872f6b831d6f6ae51a1f4050509020f3f Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:43:48 +0900 Subject: [PATCH 041/143] =?UTF-8?q?refactory.=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9E=90=EC=9B=90?= =?UTF-8?q?=EC=9D=98=20=EC=82=AD=EC=A0=9C=20=EC=9A=94=EC=B2=AD=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/ArticleService.java | 5 +++++ src/main/java/com/example/bcsd/service/MemberService.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index b16f82d8..12365671 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -54,6 +54,11 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) } public void deleteArticleById(Long id) { + articleRepository.findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + ); + articleRepository.delete(id); } } diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 2b3a2b6e..0b70a247 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -52,6 +52,11 @@ public MemberResponse updateMember(Long id, MemberRequest request) { } public void deleteMember(Long id) { + memberRepository.findById(id) + .orElseThrow(() -> + new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + ); + memberRepository.delete(id); } } From dd7100ce02ac9df026d22e6114ee74106cc24ae9 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 18:58:50 +0900 Subject: [PATCH 042/143] =?UTF-8?q?feat.=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4,=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20Enum=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/exception/CustomException.java | 4 ++++ .../java/com/example/bcsd/exception/ExceptionMessage.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/main/java/com/example/bcsd/exception/CustomException.java create mode 100644 src/main/java/com/example/bcsd/exception/ExceptionMessage.java diff --git a/src/main/java/com/example/bcsd/exception/CustomException.java b/src/main/java/com/example/bcsd/exception/CustomException.java new file mode 100644 index 00000000..0258cf35 --- /dev/null +++ b/src/main/java/com/example/bcsd/exception/CustomException.java @@ -0,0 +1,4 @@ +package com.example.bcsd.exception; + +public class CustomException { +} diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java new file mode 100644 index 00000000..d2954e56 --- /dev/null +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -0,0 +1,4 @@ +package com.example.bcsd.exception; + +public enum ExceptionMessage { +} From 0d7dfc8da51081abac4c86e0fe7ca31c1e278f58 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 11 May 2025 19:08:04 +0900 Subject: [PATCH 043/143] =?UTF-8?q?feat.=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EC=98=88=EC=99=B8,=20=EB=A9=94=EC=84=B8=EC=A7=80=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 --- .../com/example/bcsd/exception/CustomException.java | 11 ++++++++++- .../com/example/bcsd/exception/ExceptionMessage.java | 11 +++++++++++ .../bcsd/exception/GlobalExceptionHandler.java | 6 ++---- .../java/com/example/bcsd/service/ArticleService.java | 11 ++++++----- .../java/com/example/bcsd/service/MemberService.java | 9 +++++---- 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/bcsd/exception/CustomException.java b/src/main/java/com/example/bcsd/exception/CustomException.java index 0258cf35..ef6decd2 100644 --- a/src/main/java/com/example/bcsd/exception/CustomException.java +++ b/src/main/java/com/example/bcsd/exception/CustomException.java @@ -1,4 +1,13 @@ package com.example.bcsd.exception; -public class CustomException { +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + private final ExceptionMessage exceptionMessage; + + public CustomException(ExceptionMessage exceptionMessage) { + super(exceptionMessage.getMessage()); + this.exceptionMessage = exceptionMessage; + } } diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index d2954e56..545b0076 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -1,4 +1,15 @@ package com.example.bcsd.exception; +import lombok.Getter; + +@Getter public enum ExceptionMessage { + ARTICLE_NOT_FOUND("해당 게시글을 찾을 수 없습니다."), + MEMBER_NOT_FOUND("해당 멤버를 찾을 수 없습니다."); + + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } } diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index 663f93a3..a645ebda 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -5,13 +5,11 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import java.util.NoSuchElementException; - @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { - @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity notFoundExceptionHandle(NoSuchElementException ex) { + @ExceptionHandler(CustomException.class) + public ResponseEntity notFoundExceptionHandle(CustomException ex) { log.error(ex.getMessage()); return ResponseEntity.notFound().build(); } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 12365671..96e97110 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -1,15 +1,16 @@ package com.example.bcsd.service; import com.example.bcsd.dto.request.ArticleCreateRequest; -import com.example.bcsd.dto.resopnse.ArticleResponse; import com.example.bcsd.dto.request.ArticleUpdateRequest; +import com.example.bcsd.dto.resopnse.ArticleResponse; +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepositoryImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; -import java.util.NoSuchElementException; @Service @RequiredArgsConstructor @@ -27,7 +28,7 @@ public ArticleResponse getArticleById(Long id) { return ArticleResponse.fromEntity( articleRepository.findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ) ); } @@ -44,7 +45,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) Article article = articleRepository .findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ) .update(request.getTitle(), request.getContent()); @@ -56,7 +57,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) public void deleteArticleById(Long id) { articleRepository.findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 게시글을 찾을 수 없습니다.") + new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ); articleRepository.delete(id); diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 0b70a247..eda1a4b4 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -2,13 +2,14 @@ import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepositoryImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; -import java.util.NoSuchElementException; @Service @RequiredArgsConstructor @@ -26,7 +27,7 @@ public MemberResponse getMemberById(Long id) { return MemberResponse.fromEntity( memberRepository.findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ) ); } @@ -42,7 +43,7 @@ public MemberResponse createMember(MemberRequest request) { public MemberResponse updateMember(Long id, MemberRequest request) { Member member = memberRepository.findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ) .update(request.getName(), request.getEmail(), request.getPw()); @@ -54,7 +55,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { public void deleteMember(Long id) { memberRepository.findById(id) .orElseThrow(() -> - new NoSuchElementException("해당 멤버를 찾을 수 없습니다.") + new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ); memberRepository.delete(id); From 5ef82850fd89f950ca40d47ee03dfefbba2f6f99 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 15:35:30 +0900 Subject: [PATCH 044/143] =?UTF-8?q?fix.=20MemberRepository=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=B2=B4=EB=A1=9C=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/repository/MemberRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java index 8c36e0aa..9d9ea0af 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java @@ -6,7 +6,7 @@ import java.util.*; @Repository -public class MemberRepositoryImpl { +public class MemberRepositoryImpl implements MemberRepository { private Long key = 1L; private final Map members = new HashMap<>(); From aa2731c27e36538c813eeddb25a516a8b196aa76 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 15:36:23 +0900 Subject: [PATCH 045/143] =?UTF-8?q?refactory.=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/service/ArticleService.java | 4 ++-- .../java/com/example/bcsd/service/ArticleViewService.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 96e97110..fa0f292e 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -6,7 +6,7 @@ import com.example.bcsd.exception.CustomException; import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepositoryImpl; +import com.example.bcsd.repository.ArticleRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ @Service @RequiredArgsConstructor public class ArticleService { - private final ArticleRepositoryImpl articleRepository; + private final ArticleRepository articleRepository; public List getAllArticles() { return articleRepository.findAll() diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index cbc4d6cf..f0b83b88 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -3,8 +3,8 @@ import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; import com.example.bcsd.model.Member; -import com.example.bcsd.repository.ArticleRepositoryImpl; -import com.example.bcsd.repository.MemberRepositoryImpl; +import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,8 +13,8 @@ @Service @RequiredArgsConstructor public class ArticleViewService { - private final ArticleRepositoryImpl articleRepository; - private final MemberRepositoryImpl memberRepository; + private final ArticleRepository articleRepository; + private final MemberRepository memberRepository; public List getAllPostViews() { List
articles = articleRepository.findAll(); From 37ad92e4a547393d5ea2d81df8d0c2360ec14703 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 19:56:04 +0900 Subject: [PATCH 046/143] =?UTF-8?q?refactory.=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/dto/request/ArticleCreateRequest.java | 8 +++++++- .../java/com/example/bcsd/dto/request/MemberRequest.java | 6 +++++- src/main/java/com/example/bcsd/model/Article.java | 2 ++ src/main/java/com/example/bcsd/model/Member.java | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index cb8530b5..4417a10b 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -2,6 +2,7 @@ import com.example.bcsd.model.Article; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter @@ -13,6 +14,11 @@ public class ArticleCreateRequest { private String content; public Article toEntity() { - return new Article(title, authorId, boardId, content); + return Article.builder() + .title(title) + .authorId(authorId) + .boardId(boardId) + .content(content) + .build(); } } diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index 38654cba..a851ca21 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -12,6 +12,10 @@ public class MemberRequest { private String pw; public Member toEntity() { - return new Member(name, email, pw); + return Member.builder() + .name(name) + .email(email) + .pw(pw) + .build(); } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 576504ba..85515056 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,11 +1,13 @@ package com.example.bcsd.model; +import lombok.Builder; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; @Getter +@Builder public class Article { @Setter private Long id; diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index de08064c..589edd30 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,9 +1,11 @@ package com.example.bcsd.model; +import lombok.Builder; import lombok.Getter; import lombok.Setter; @Getter +@Builder public class Member { @Setter private Long id; From 73fb67fdb3baeca3a41ed7e7fb934870b6306207 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 20:56:10 +0900 Subject: [PATCH 047/143] =?UTF-8?q?refactory.=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 10 ++-------- src/main/java/com/example/bcsd/model/Member.java | 8 ++------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 85515056..21d880c5 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,5 +1,6 @@ package com.example.bcsd.model; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -8,6 +9,7 @@ @Getter @Builder +@AllArgsConstructor public class Article { @Setter private Long id; @@ -19,14 +21,6 @@ public class Article { private final LocalDateTime createdAt; private LocalDateTime updatedAt; - public Article(String title, Long authorId, Long boardId, String content) { - this.title = title; - this.authorId = authorId; - this.boardId = boardId; - this.content = content; - this.createdAt = LocalDateTime.now(); - this.updatedAt = LocalDateTime.now(); - } public Article update(String title, String content) { this.title = title; diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 589edd30..08f27f6e 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,11 +1,13 @@ package com.example.bcsd.model; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.Setter; @Getter @Builder +@AllArgsConstructor public class Member { @Setter private Long id; @@ -14,12 +16,6 @@ public class Member { private String email; private String pw; - public Member(String name, String email, String pw) { - this.name = name; - this.email = email; - this.pw = pw; - } - public Member update(String name, String email, String pw) { this.name = name; this.email = email; From a8aedbed8888842cf485057324a7e1c2d5b39dd3 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 20:56:51 +0900 Subject: [PATCH 048/143] =?UTF-8?q?refactory.=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20id=20=EB=8F=99?= =?UTF-8?q?=EC=8B=9C=EC=84=B1=20=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20AtomicLong?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/repository/ArticleRepositoryImpl.java | 7 ++++--- .../com/example/bcsd/repository/MemberRepositoryImpl.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java index 674befe2..21e64bc3 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java @@ -4,10 +4,11 @@ import org.springframework.stereotype.Repository; import java.util.*; +import java.util.concurrent.atomic.AtomicLong; @Repository public class ArticleRepositoryImpl implements ArticleRepository { - private Long key = 1L; + private final AtomicLong key = new AtomicLong(1); private final Map articles = new HashMap<>(); public List
findAll() { @@ -26,8 +27,8 @@ public Optional
findById(Long id) { } public Article save(Article article) { - article.setId(key); - articles.put(key++, article); + article.setId(key.get()); + articles.put(key.getAndIncrement(), article); return article; } diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java index 9d9ea0af..f8015ece 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java @@ -4,10 +4,11 @@ import org.springframework.stereotype.Repository; import java.util.*; +import java.util.concurrent.atomic.AtomicLong; @Repository public class MemberRepositoryImpl implements MemberRepository { - private Long key = 1L; + private final AtomicLong key = new AtomicLong(1); private final Map members = new HashMap<>(); public List findAll() { @@ -26,8 +27,8 @@ public Optional findById(Long id) { } public Member save(Member member) { - member.setId(key); - members.put(key++, member); + member.setId(key.get()); + members.put(key.getAndIncrement(), member); return member; } From a6c80a4544c3f4363dd9c5a398f3f67e5688a8f1 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 12 May 2025 22:30:56 +0900 Subject: [PATCH 049/143] =?UTF-8?q?chore.=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java | 1 - .../java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java | 1 - .../java/com/example/bcsd/exception/GlobalExceptionHandler.java | 1 - 3 files changed, 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index 91f73879..9fc8d28d 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -31,4 +31,3 @@ public static ArticleResponse fromEntity(Article article) { .build(); } } - diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java index 32d4225f..bde7d305 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java @@ -27,4 +27,3 @@ public static ArticleViewResponse formEntity(Article article, String authorName) .build(); } } - diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index a645ebda..5cda3b57 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -13,5 +13,4 @@ public ResponseEntity notFoundExceptionHandle(CustomException ex) { log.error(ex.getMessage()); return ResponseEntity.notFound().build(); } - } From 54aa469e0bae744b85958a8e73c33bff0d317262 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 10:08:47 +0900 Subject: [PATCH 050/143] =?UTF-8?q?refactory.=20=EB=AA=A8=EB=93=A0=20DTO?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20->=20=EB=A0=88=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ArticleCreateRequest.java | 17 +++++--------- .../dto/request/ArticleUpdateRequest.java | 13 ++++------- .../bcsd/dto/request/MemberRequest.java | 14 +++++------- .../bcsd/dto/resopnse/ArticleResponse.java | 22 ++++++++----------- .../dto/resopnse/ArticleViewResponse.java | 18 ++++++--------- .../bcsd/dto/resopnse/JsonResponse.java | 13 ++++------- .../bcsd/dto/resopnse/MemberResponse.java | 14 +++++------- .../example/bcsd/service/ArticleService.java | 2 +- .../example/bcsd/service/MemberService.java | 2 +- 9 files changed, 42 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index 4417a10b..d14af847 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -1,18 +1,13 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Article; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class ArticleCreateRequest { - private String title; - private Long authorId; - private Long boardId; - private String content; +public record ArticleCreateRequest ( + String title, + Long authorId, + Long boardId, + String content +) { public Article toEntity() { return Article.builder() .title(title) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index d3aabb38..a4f8ee2b 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -1,11 +1,6 @@ package com.example.bcsd.dto.request; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class ArticleUpdateRequest { - private String title; - private String content; -} +public record ArticleUpdateRequest ( + String title, + String content +) { } diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index a851ca21..cee13863 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -1,16 +1,12 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Member; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class MemberRequest { - private String name; - private String email; - private String pw; +public record MemberRequest( + String name, + String email, + String pw +) { public Member toEntity() { return Member.builder() .name(name) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index 9fc8d28d..da7c9be8 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -1,24 +1,20 @@ package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Article; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; import java.time.LocalDateTime; -@Getter -@AllArgsConstructor @Builder -public class ArticleResponse { - private Long id; - private String title; - private Long authorId; - private Long boardId; - private String content; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; - +public record ArticleResponse ( + Long id, + String title, + Long authorId, + Long boardId, + String content, + LocalDateTime createdAt, + LocalDateTime updatedAt +) { public static ArticleResponse fromEntity(Article article) { return ArticleResponse.builder() .id(article.getId()) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java index bde7d305..117a3386 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java @@ -1,22 +1,18 @@ package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Article; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; import java.time.LocalDateTime; -@Getter -@AllArgsConstructor @Builder -public class ArticleViewResponse { - private String title; - private String author; - private String content; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; - +public record ArticleViewResponse( + String title, + String author, + String content, + LocalDateTime createdAt, + LocalDateTime updatedAt +) { public static ArticleViewResponse formEntity(Article article, String authorName) { return ArticleViewResponse.builder() .title(article.getTitle()) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java index 4b37cdad..fe71c9e4 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java @@ -1,11 +1,6 @@ package com.example.bcsd.dto.resopnse; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class JsonResponse { - private int age; - private String name; -} +public record JsonResponse( + int age, + String name +) { } diff --git a/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java index 0bf2f354..a1138d02 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java @@ -1,18 +1,14 @@ package com.example.bcsd.dto.resopnse; import com.example.bcsd.model.Member; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; -@Getter -@AllArgsConstructor @Builder -public class MemberResponse { - private Long id; - private String name; - private String email; - +public record MemberResponse( + Long id, + String name, + String email +) { public static MemberResponse fromEntity(Member member) { return MemberResponse.builder() .id(member.getId()) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index fa0f292e..a9b5af58 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -47,7 +47,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) .orElseThrow(() -> new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ) - .update(request.getTitle(), request.getContent()); + .update(request.title(), request.content()); return ArticleResponse.fromEntity( articleRepository.save(id, article) diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index eda1a4b4..ab9b4046 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -45,7 +45,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { .orElseThrow(() -> new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ) - .update(request.getName(), request.getEmail(), request.getPw()); + .update(request.name(), request.email(), request.pw()); return MemberResponse.fromEntity( memberRepository.save(id, member) From 906d1311ec6818dcc6c74d8f2435e7edf293e53c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 10:09:48 +0900 Subject: [PATCH 051/143] =?UTF-8?q?fix.=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java | 2 +- src/main/java/com/example/bcsd/service/ArticleViewService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java index 117a3386..0d00d375 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java @@ -13,7 +13,7 @@ public record ArticleViewResponse( LocalDateTime createdAt, LocalDateTime updatedAt ) { - public static ArticleViewResponse formEntity(Article article, String authorName) { + public static ArticleViewResponse fromEntity(Article article, String authorName) { return ArticleViewResponse.builder() .title(article.getTitle()) .author(authorName) diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index f0b83b88..8527f6f1 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -21,7 +21,7 @@ public List getAllPostViews() { return articles.stream() .map(article -> - ArticleViewResponse.formEntity( + ArticleViewResponse.fromEntity( article, memberRepository.findById(article.getAuthorId()) .map(Member::getName) .orElse("알 수 없음") From 0a8fc6fcfbae2105df16d2b117050b7d9f1b1d92 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 10:24:36 +0900 Subject: [PATCH 052/143] =?UTF-8?q?refactory.=20ExceptionMessage=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=95=84=EB=93=9C=EC=97=90=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/exception/ExceptionMessage.java | 8 +++++--- .../example/bcsd/exception/GlobalExceptionHandler.java | 9 +++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index 545b0076..acc17eb4 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -4,12 +4,14 @@ @Getter public enum ExceptionMessage { - ARTICLE_NOT_FOUND("해당 게시글을 찾을 수 없습니다."), - MEMBER_NOT_FOUND("해당 멤버를 찾을 수 없습니다."); + ARTICLE_NOT_FOUND(404, "해당 게시글을 찾을 수 없습니다."), + MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."); + private final int status; private final String message; - ExceptionMessage(String message) { + ExceptionMessage(int status, String message) { + this.status = status; this.message = message; } } diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index 5cda3b57..60ad0b41 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -9,8 +9,13 @@ @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) - public ResponseEntity notFoundExceptionHandle(CustomException ex) { + public ResponseEntity notFoundExceptionHandle(CustomException ex) { log.error(ex.getMessage()); - return ResponseEntity.notFound().build(); + + return ResponseEntity.status( + ex.getExceptionMessage() + .getStatus() + ) + .body(ex.getMessage()); } } From 21f907ef439ac56146b6031c753ac4fb6a52176e Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 10:27:35 +0900 Subject: [PATCH 053/143] =?UTF-8?q?fix.=20=EC=88=98=EC=A0=95=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EB=AA=85=20=EB=8D=94=20=EB=AA=85=ED=99=95?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 2 +- src/main/java/com/example/bcsd/model/Member.java | 2 +- src/main/java/com/example/bcsd/service/ArticleService.java | 2 +- src/main/java/com/example/bcsd/service/MemberService.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 21d880c5..ebecda3d 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -22,7 +22,7 @@ public class Article { private LocalDateTime updatedAt; - public Article update(String title, String content) { + public Article updateDetails(String title, String content) { this.title = title; this.content = content; updatedAt = LocalDateTime.now(); diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 08f27f6e..150296be 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -16,7 +16,7 @@ public class Member { private String email; private String pw; - public Member update(String name, String email, String pw) { + public Member updatePersonalInformation(String name, String email, String pw) { this.name = name; this.email = email; this.pw = pw; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index a9b5af58..e798a091 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -47,7 +47,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) .orElseThrow(() -> new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ) - .update(request.title(), request.content()); + .updateDetails(request.title(), request.content()); return ArticleResponse.fromEntity( articleRepository.save(id, article) diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index ab9b4046..2d2ac9b4 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -45,7 +45,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { .orElseThrow(() -> new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ) - .update(request.name(), request.email(), request.pw()); + .updatePersonalInformation(request.name(), request.email(), request.pw()); return MemberResponse.fromEntity( memberRepository.save(id, member) From 2269ada4da10a345c16d93495b1ca5ba447482f6 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 17:58:15 +0900 Subject: [PATCH 054/143] =?UTF-8?q?build.=20JDBC=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ .../com/example/bcsd/repository/ArticleJDBCRepository.java | 4 ++++ .../com/example/bcsd/repository/MemberJDBCRepository.java | 4 ++++ 3 files changed, 10 insertions(+) create mode 100644 src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java create mode 100644 src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java diff --git a/build.gradle b/build.gradle index 3892d066..8109f511 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,8 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' compileOnly("org.projectlombok:lombok:1.18.38") annotationProcessor 'org.projectlombok:lombok:1.18.38' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.mysql:mysql-connector-j:8.2.0' } tasks.named('test') { diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java new file mode 100644 index 00000000..f08e493b --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java @@ -0,0 +1,4 @@ +package com.example.bcsd.repository; + +public class ArticleJDBCRepository { +} diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java new file mode 100644 index 00000000..28aae22e --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java @@ -0,0 +1,4 @@ +package com.example.bcsd.repository; + +public class MemberJDBCRepository { +} From 317142da0a1a2260eb3a4d2951b385eb22ed346e Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 19:58:12 +0900 Subject: [PATCH 055/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20R?= =?UTF-8?q?epository=20JDBC=EB=A1=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ArticleJDBCRepositoryImpl.java | 86 +++++++++++++++++++ .../bcsd/repository/MemberJDBCRepository.java | 4 - ...ory.java => MemberJDBCRepositoryImpl.java} | 2 +- 3 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java delete mode 100644 src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java rename src/main/java/com/example/bcsd/repository/{ArticleJDBCRepository.java => MemberJDBCRepositoryImpl.java} (50%) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java new file mode 100644 index 00000000..c2c2f1ab --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -0,0 +1,86 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Article; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@RequiredArgsConstructor +@Repository +public class ArticleJDBCRepositoryImpl implements ArticleRepository { + private final JdbcTemplate jdbcTemplate; + + @Override + public List
findAll() { + String sql = "SELECT * FROM Article"; + + return jdbcTemplate.query(sql, articleRowMapper()); + } + + @Override + public Optional
findById(Long id) { + String sql = "SELECT * FROM Article WHERE id = ?"; + + return Optional.ofNullable( + jdbcTemplate.queryForObject( + sql, + articleRowMapper(), + id + ) + ); + } + + @Override + public Article save(Article article) { + String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; + + jdbcTemplate.update( + sql, + article.getAuthorId(), + article.getBoardId(), + article.getTitle(), + article.getContent() + ); + + return article; + } + + @Override + public Article save(Long id, Article article) { + String sql = "UPDATE Article SET title = ?, content = ? WHERE id = ?"; + + jdbcTemplate.update( + sql, + article.getTitle(), + article.getContent(), + id + ); + + return article; + } + + @Override + public void delete(Long id) { + String sql = "DELETE from Article WHERE id = ?"; + + jdbcTemplate.update(sql, id); + } + + private RowMapper
articleRowMapper() { + return ((rs, rowNum) -> { + return Article.builder() + .id(rs.getLong("id")) + .authorId(rs.getLong("author_id")) + .boardId(rs.getLong("board_id")) + .title(rs.getString("title")) + .content(rs.getString("content")) + .createdAt(rs.getTimestamp("created_at").toLocalDateTime()) + .updatedAt(rs.getTimestamp("updated_at").toLocalDateTime()) + .build(); + }); + } +} diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java deleted file mode 100644 index 28aae22e..00000000 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepository.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.bcsd.repository; - -public class MemberJDBCRepository { -} diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java similarity index 50% rename from src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java rename to src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index f08e493b..0bcdf2f7 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -1,4 +1,4 @@ package com.example.bcsd.repository; -public class ArticleJDBCRepository { +public class MemberJDBCRepositoryImpl { } From 692f5f4cfa3f37038e27d8b65b4d3efaf374c950 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:07:05 +0900 Subject: [PATCH 056/143] =?UTF-8?q?chore.=20@Repository=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/repository/ArticleRepositoryImpl.java | 2 -- .../java/com/example/bcsd/repository/MemberRepositoryImpl.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java index 21e64bc3..0cd6f729 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java @@ -1,12 +1,10 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Article; -import org.springframework.stereotype.Repository; import java.util.*; import java.util.concurrent.atomic.AtomicLong; -@Repository public class ArticleRepositoryImpl implements ArticleRepository { private final AtomicLong key = new AtomicLong(1); private final Map articles = new HashMap<>(); diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java index f8015ece..0cace3a3 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java @@ -1,12 +1,10 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Member; -import org.springframework.stereotype.Repository; import java.util.*; import java.util.concurrent.atomic.AtomicLong; -@Repository public class MemberRepositoryImpl implements MemberRepository { private final AtomicLong key = new AtomicLong(1); private final Map members = new HashMap<>(); From 873ebc57270b49b1e079b31b3141ad84109a0c9c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:13:34 +0900 Subject: [PATCH 057/143] =?UTF-8?q?fix.=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EC=97=90=20=EC=9D=98=EC=A1=B4=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/MemberService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 2d2ac9b4..b23dbfec 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -5,7 +5,7 @@ import com.example.bcsd.exception.CustomException; import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Member; -import com.example.bcsd.repository.MemberRepositoryImpl; +import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -14,7 +14,7 @@ @Service @RequiredArgsConstructor public class MemberService { - private final MemberRepositoryImpl memberRepository; + private final MemberRepository memberRepository; public List getAllMembers() { return memberRepository.findAll() From e4f7aca559367ca6d31358f44ca15dbe0c37cf1d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:16:16 +0900 Subject: [PATCH 058/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20Repository?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MemberJDBCRepositoryImpl.java | 80 ++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 0bcdf2f7..02215c75 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -1,4 +1,82 @@ package com.example.bcsd.repository; -public class MemberJDBCRepositoryImpl { +import com.example.bcsd.model.Member; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +@RequiredArgsConstructor +public class MemberJDBCRepositoryImpl implements MemberRepository { + private final JdbcTemplate jdbcTemplate; + + @Override + public List findAll() { + String sql = "SELECT * FROM Member"; + + return jdbcTemplate.query(sql, memberRowMapper()); + } + + @Override + public Optional findById(Long id) { + String sql = "SELECT * FROM Member WHERE id = ?"; + + return Optional.ofNullable( + jdbcTemplate.queryForObject( + sql, + memberRowMapper(), + id + ) + ); + } + + @Override + public Member save(Member member) { + String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; + + jdbcTemplate.update( + sql, + member.getName(), + member.getEmail(), + member.getPassword() + ); + + return member; + } + + @Override + public Member save(Long id, Member member) { + String sql = "UPDATE Member SET name = ?, email = ? password = ?, WHERE id = ?"; + + jdbcTemplate.update( + sql, + member.getName(), + member.getEmail(), + member.getPassword(), + id + ); + + return member; + } + + @Override + public void delete(Long id) { + String sql = "DELETE from Member WHERE id = ?"; + + jdbcTemplate.update(sql, id); + } + + private RowMapper memberRowMapper() { + return ((rs, rowNum) -> { + return Member.builder() + .name(rs.getString("name")) + .email(rs.getString("email")) + .password(rs.getString("password")) + .build(); + }); + } } From 08591d2d0d7f34908ddab0af8049f9ffa0b1765c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:16:46 +0900 Subject: [PATCH 059/143] =?UTF-8?q?fix.=20=EB=A9=A4=EB=B2=84=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=A4=91=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?pw=20->=20password=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/dto/request/MemberRequest.java | 4 ++-- src/main/java/com/example/bcsd/model/Member.java | 6 +++--- src/main/java/com/example/bcsd/service/MemberService.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index cee13863..c4daa964 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -5,13 +5,13 @@ public record MemberRequest( String name, String email, - String pw + String password ) { public Member toEntity() { return Member.builder() .name(name) .email(email) - .pw(pw) + .password(password) .build(); } } diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 150296be..272f5fa1 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -14,12 +14,12 @@ public class Member { private String name; private String email; - private String pw; + private String password; - public Member updatePersonalInformation(String name, String email, String pw) { + public Member updatePersonalInformation(String name, String email, String password) { this.name = name; this.email = email; - this.pw = pw; + this.password = password; return this; } diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index b23dbfec..0eaf5899 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -45,7 +45,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { .orElseThrow(() -> new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ) - .updatePersonalInformation(request.name(), request.email(), request.pw()); + .updatePersonalInformation(request.name(), request.email(), request.password()); return MemberResponse.fromEntity( memberRepository.save(id, member) From 94e08906f06b3b1aea00260938f1829047f4a0ba Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:21:02 +0900 Subject: [PATCH 060/143] =?UTF-8?q?fix.=20=EB=A9=A4=EB=B2=84=20RowMapper?= =?UTF-8?q?=20id=EB=8F=84=20=EB=A7=A4=ED=95=91=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/repository/MemberJDBCRepositoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 02215c75..5f1b8dbe 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -73,6 +73,7 @@ public void delete(Long id) { private RowMapper memberRowMapper() { return ((rs, rowNum) -> { return Member.builder() + .id(rs.getLong("id")) .name(rs.getString("name")) .email(rs.getString("email")) .password(rs.getString("password")) From cc864e9cd71e331b54cdd2a33b08d38690bb05af Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 20:52:35 +0900 Subject: [PATCH 061/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20C?= =?UTF-8?q?RUD=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/BoardController.java | 52 +++++++++++++ .../bcsd/dto/request/BoardRequest.java | 13 ++++ .../bcsd/dto/resopnse/BoardResponse.java | 17 ++++ .../bcsd/exception/ExceptionMessage.java | 3 +- .../java/com/example/bcsd/model/Board.java | 11 +++ .../repository/BoardJDBCRepositoryImpl.java | 77 +++++++++++++++++++ .../bcsd/repository/BoardRepository.java | 14 ++++ .../example/bcsd/service/BoardService.java | 64 +++++++++++++++ 8 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/bcsd/controller/BoardController.java create mode 100644 src/main/java/com/example/bcsd/dto/request/BoardRequest.java create mode 100644 src/main/java/com/example/bcsd/dto/resopnse/BoardResponse.java create mode 100644 src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java create mode 100644 src/main/java/com/example/bcsd/repository/BoardRepository.java create mode 100644 src/main/java/com/example/bcsd/service/BoardService.java diff --git a/src/main/java/com/example/bcsd/controller/BoardController.java b/src/main/java/com/example/bcsd/controller/BoardController.java new file mode 100644 index 00000000..72d40b34 --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/BoardController.java @@ -0,0 +1,52 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.dto.request.BoardRequest; +import com.example.bcsd.dto.resopnse.BoardResponse; +import com.example.bcsd.service.BoardService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/boards") +@RequiredArgsConstructor +public class BoardController { + private final BoardService boardService; + + @GetMapping + public ResponseEntity> getAllBoards() { + return ResponseEntity + .ok(boardService.getAllBoards()); + } + + @GetMapping("/{id}") + public ResponseEntity getBoardById(@PathVariable Long id) { + return ResponseEntity + .ok(boardService.getBoardById(id)); + } + + @PostMapping + public ResponseEntity createBoard(@RequestBody BoardRequest request) { + return ResponseEntity + .status(HttpStatus.CREATED) + .body(boardService.createBoard(request)); + } + + @PutMapping("/{id}") + public ResponseEntity updateArticleById( + @PathVariable Long id, @RequestBody BoardRequest request + ) { + return ResponseEntity + .ok(boardService.updateBoardById(id, request)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteBoardById(@PathVariable Long id) { + boardService.deleteBoardById(id); + + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/example/bcsd/dto/request/BoardRequest.java b/src/main/java/com/example/bcsd/dto/request/BoardRequest.java new file mode 100644 index 00000000..62892405 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/request/BoardRequest.java @@ -0,0 +1,13 @@ +package com.example.bcsd.dto.request; + +import com.example.bcsd.model.Board; + +public record BoardRequest( + String name +) { + public Board toEntity() { + return Board.builder() + .name(name) + .build(); + } +} diff --git a/src/main/java/com/example/bcsd/dto/resopnse/BoardResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/BoardResponse.java new file mode 100644 index 00000000..9a1d7426 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/resopnse/BoardResponse.java @@ -0,0 +1,17 @@ +package com.example.bcsd.dto.resopnse; + +import com.example.bcsd.model.Board; +import lombok.Builder; + +@Builder +public record BoardResponse( + Long id, + String name +) { + public static BoardResponse fromEntity(Board board) { + return BoardResponse.builder() + .id(board.getId()) + .name(board.getName()) + .build(); + } +} diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index acc17eb4..72f8c63b 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -5,7 +5,8 @@ @Getter public enum ExceptionMessage { ARTICLE_NOT_FOUND(404, "해당 게시글을 찾을 수 없습니다."), - MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."); + MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."), + BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 9739de7d..9e3ffe1f 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -1,6 +1,17 @@ package com.example.bcsd.model; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter public class Board { private Long id; private String name; + + public Board updateBoardName(String name) { + this.name = name; + + return this; + } } diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java new file mode 100644 index 00000000..83d9fc15 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -0,0 +1,77 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Board; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +@RequiredArgsConstructor +public class BoardJDBCRepositoryImpl implements BoardRepository { + private final JdbcTemplate jdbcTemplate; + + @Override + public List findAll() { + String sql = "SELECT * FROM Board"; + + return jdbcTemplate.query(sql, boardRowMapper()); + } + + @Override + public Optional findById(Long id) { + String sql = "SELECT * FROM Board WHERE id = ?"; + + return Optional.ofNullable( + jdbcTemplate.queryForObject( + sql, + boardRowMapper(), + id + ) + ); + } + + @Override + public Board save(Board board) { + String sql = "INSERT INTO Board (name) VALUES (?)"; + + jdbcTemplate.update( + sql, + board.getName() + ); + + return board; + } + + @Override + public Board save(Long id, Board board) { + String sql = "UPDATE Board SET name = ? WHERE id = ?"; + + jdbcTemplate.update( + sql, + board.getName(), + id + ); + + return board; + } + + @Override + public void delete(Long id) { + String sql = "DELETE from Board WHERE id = ?"; + + jdbcTemplate.update(sql, id); + } + + private RowMapper boardRowMapper() { + return ((rs, rowNum) -> { + return Board.builder() + .id(rs.getLong("id")) + .name(rs.getString("name")) + .build(); + }); + } +} diff --git a/src/main/java/com/example/bcsd/repository/BoardRepository.java b/src/main/java/com/example/bcsd/repository/BoardRepository.java new file mode 100644 index 00000000..64470445 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/BoardRepository.java @@ -0,0 +1,14 @@ +package com.example.bcsd.repository; + +import com.example.bcsd.model.Board; + +import java.util.List; +import java.util.Optional; + +public interface BoardRepository { + List findAll(); + Optional findById(Long id); + Board save(Board board); + Board save(Long id, Board board); + void delete(Long id); +} diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java new file mode 100644 index 00000000..fd32f32d --- /dev/null +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -0,0 +1,64 @@ +package com.example.bcsd.service; + +import com.example.bcsd.dto.request.BoardRequest; +import com.example.bcsd.dto.resopnse.BoardResponse; +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.model.Board; +import com.example.bcsd.repository.BoardRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class BoardService { + private final BoardRepository boardRepository; + + public List getAllBoards() { + return boardRepository.findAll() + .stream() + .map(BoardResponse::fromEntity) + .toList(); + } + + public BoardResponse getBoardById(Long id) { + return BoardResponse.fromEntity( + boardRepository.findById(id) + .orElseThrow(() -> + new CustomException(ExceptionMessage.BOARD_NOT_FOUND) + ) + ); + } + + public BoardResponse createBoard(BoardRequest request) { + return BoardResponse.fromEntity( + boardRepository.save( + request.toEntity() + ) + ); + } + + public BoardResponse updateBoardById(Long id, BoardRequest request) { + Board board = boardRepository + .findById(id) + .orElseThrow(() -> + new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) + ) + .updateBoardName(request.name()); + + return BoardResponse.fromEntity( + boardRepository.save(id, board) + ); + } + + public void deleteBoardById(Long id) { + boardRepository.findById(id) + .orElseThrow(() -> + new CustomException(ExceptionMessage.BOARD_NOT_FOUND) + ); + + boardRepository.delete(id); + } +} From 966fc540e6c4923aaabd2586b4d32255adf5a599 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 21:09:48 +0900 Subject: [PATCH 062/143] =?UTF-8?q?fix.=20=EC=9E=90=EC=9B=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=20=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=ED=95=A0=EB=8B=B9=EB=90=9C=20id=EA=B0=92=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=EB=B0=9B=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/model/Board.java | 3 +++ .../repository/ArticleJDBCRepositoryImpl.java | 25 +++++++++++++------ .../repository/BoardJDBCRepositoryImpl.java | 17 ++++++++++--- .../repository/MemberJDBCRepositoryImpl.java | 21 +++++++++++----- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 9e3ffe1f..eea1b37a 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -2,11 +2,14 @@ import lombok.Builder; import lombok.Getter; +import lombok.Setter; @Builder @Getter public class Board { + @Setter private Long id; + private String name; public Board updateBoardName(String name) { diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index c2c2f1ab..4411b17e 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -4,8 +4,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import java.sql.PreparedStatement; import java.util.List; import java.util.Optional; @@ -37,16 +40,22 @@ public Optional
findById(Long id) { @Override public Article save(Article article) { String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); - jdbcTemplate.update( - sql, - article.getAuthorId(), - article.getBoardId(), - article.getTitle(), - article.getContent() - ); + ps.setLong(1, article.getAuthorId()); + ps.setLong(2, article.getBoardId()); + ps.setString(3, article.getTitle()); + ps.setString(4, article.getContent()); - return article; + return ps; + }, keyHolder); + + Long id = keyHolder.getKey().longValue(); + article.setId(id); + + return findById(id).get(); } @Override diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java index 83d9fc15..6e0fc2a0 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -4,8 +4,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import java.sql.PreparedStatement; import java.util.List; import java.util.Optional; @@ -38,10 +41,16 @@ public Optional findById(Long id) { public Board save(Board board) { String sql = "INSERT INTO Board (name) VALUES (?)"; - jdbcTemplate.update( - sql, - board.getName() - ); + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); + + ps.setString(1, board.getName()); + + return ps; + }, keyHolder); + + board.setId(keyHolder.getKey().longValue()); return board; } diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 5f1b8dbe..1d962328 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -4,8 +4,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import java.sql.PreparedStatement; import java.util.List; import java.util.Optional; @@ -37,13 +40,19 @@ public Optional findById(Long id) { @Override public Member save(Member member) { String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; + KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update( - sql, - member.getName(), - member.getEmail(), - member.getPassword() - ); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); + + ps.setString(1, member.getName()); + ps.setString(2, member.getEmail()); + ps.setString(3, member.getPassword()); + + return ps; + }, keyHolder); + + member.setId(keyHolder.getKey().longValue()); return member; } From bd040753bd73d998ef72678773a9bc5b920f9616 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 21:13:09 +0900 Subject: [PATCH 063/143] =?UTF-8?q?style.=20css=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/style.css | 7 +++++++ src/main/resources/templates/post.html | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css index 91e02376..dd18cee6 100644 --- a/src/main/resources/static/style.css +++ b/src/main/resources/static/style.css @@ -4,6 +4,13 @@ margin: 20px; } +.article-title { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + .article-header { display: flex; flex-direction: column; diff --git a/src/main/resources/templates/post.html b/src/main/resources/templates/post.html index 0107b2b9..d071b775 100644 --- a/src/main/resources/templates/post.html +++ b/src/main/resources/templates/post.html @@ -9,7 +9,7 @@

자유 게시판

-

+


From 7ef2047a066a34597886b923d0abdcacfa0aed9a Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 21:23:20 +0900 Subject: [PATCH 064/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20i?= =?UTF-8?q?d=EB=A1=9C=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=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 --- .../com/example/bcsd/controller/ArticleController.java | 6 ++++++ .../example/bcsd/repository/ArticleJDBCRepositoryImpl.java | 6 ++++++ .../com/example/bcsd/repository/ArticleRepository.java | 1 + .../com/example/bcsd/repository/ArticleRepositoryImpl.java | 5 +++++ src/main/java/com/example/bcsd/service/ArticleService.java | 7 +++++++ 5 files changed, 25 insertions(+) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 853a8549..edbac1e2 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -29,6 +29,12 @@ public ResponseEntity getArticleById(@PathVariable Long id) { .ok(articleService.getArticleById(id)); } + @GetMapping(params = "boardId") + public ResponseEntity> getArticlesByBoardId(@RequestParam Long boardId) { + return ResponseEntity + .ok(articleService.getArticlesByBoardId(boardId)); + } + @PostMapping public ResponseEntity createArticle(@RequestBody ArticleCreateRequest request) { return ResponseEntity diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index 4411b17e..9b8f63e3 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -37,6 +37,12 @@ public Optional
findById(Long id) { ); } + public List
findAllByBoardId(Long boardId) { + String sql = "SELECT * FROM Article WHERE board_id = ?"; + + return jdbcTemplate.query(sql, articleRowMapper(), boardId); + } + @Override public Article save(Article article) { String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 6c0af88c..2bbc2fd6 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -8,6 +8,7 @@ public interface ArticleRepository { List
findAll(); Optional
findById(Long id); + List
findAllByBoardId(Long BoardId); Article save(Article article); Article save(Long id, Article article); void delete(Long id); diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java index 0cd6f729..eb8d5274 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java @@ -24,6 +24,11 @@ public Optional
findById(Long id) { return Optional.ofNullable(article); } + @Override + public List
findAllByBoardId(Long BoardId) { + return List.of(); + } + public Article save(Article article) { article.setId(key.get()); articles.put(key.getAndIncrement(), article); diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index e798a091..7580ed38 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -33,6 +33,13 @@ public ArticleResponse getArticleById(Long id) { ); } + public List getArticlesByBoardId(Long boardId) { + return articleRepository.findAllByBoardId(boardId) + .stream() + .map(ArticleResponse::fromEntity) + .toList(); + } + public ArticleResponse createArticle(ArticleCreateRequest request) { return ArticleResponse.fromEntity( articleRepository.save( From 504f9570cd1241341b19c5fcfa83784cbfaa9a97 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 21:31:25 +0900 Subject: [PATCH 065/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20i?= =?UTF-8?q?d=EB=A1=9C=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EB=B7=B0=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- .../bcsd/controller/ArticleViewController.java | 14 ++++++++++++-- .../example/bcsd/service/ArticleViewService.java | 13 +++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index 96f2f254..ff02a594 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -7,6 +7,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -18,9 +19,18 @@ public class ArticleViewController { @GetMapping public String getAllArticlesView(Model model) { - List articleList = articleViewService.getAllPostViews(); + List articleViewResponseList = articleViewService.getAllPostViews(); - model.addAttribute("articleList", articleList); + model.addAttribute("articleList", articleViewResponseList); + + return "post"; + } + + @GetMapping(params = "boardId") + public String getAllArticlesViewByBoardId(Model model, @RequestParam Long boardId) { + List articleViewResponseList = articleViewService.getAllPostViewsByBoardId(boardId); + + model.addAttribute("articleList", articleViewResponseList); return "post"; } diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 8527f6f1..88d712b2 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -28,4 +28,17 @@ public List getAllPostViews() { ) ).toList(); } + + public List getAllPostViewsByBoardId(Long boardId) { + List
articles = articleRepository.findAllByBoardId(boardId); + + return articles.stream() + .map(article -> + ArticleViewResponse.fromEntity( + article, memberRepository.findById(article.getAuthorId()) + .map(Member::getName) + .orElse("알 수 없음") + ) + ).toList(); + } } From ec6e2708447f4ec9c5920f832a563ab0259d87c1 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 14 May 2025 21:32:40 +0900 Subject: [PATCH 066/143] =?UTF-8?q?refactory.=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20private=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EB=A1=9C=20=EB=AA=A8=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/service/ArticleViewService.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 88d712b2..6602b0ba 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -19,19 +19,16 @@ public class ArticleViewService { public List getAllPostViews() { List
articles = articleRepository.findAll(); - return articles.stream() - .map(article -> - ArticleViewResponse.fromEntity( - article, memberRepository.findById(article.getAuthorId()) - .map(Member::getName) - .orElse("알 수 없음") - ) - ).toList(); + return convertToViewResponse(articles); } public List getAllPostViewsByBoardId(Long boardId) { List
articles = articleRepository.findAllByBoardId(boardId); + return convertToViewResponse(articles); + } + + private List convertToViewResponse(List
articles) { return articles.stream() .map(article -> ArticleViewResponse.fromEntity( From e67f28770a2262ae07e6ba5f2c4e9992df49ed8e Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 15 May 2025 14:37:36 +0900 Subject: [PATCH 067/143] =?UTF-8?q?fix.=20/posts=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EC=8B=9C=20=EA=B2=8C=EC=8B=9C=ED=8C=90=EC=9D=84=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=ED=95=98=EC=97=AC=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=A0=9C=EA=B3=B5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ArticleViewController.java | 7 ++- .../dto/resopnse/ArticleViewResponse.java | 4 +- .../bcsd/service/ArticleViewService.java | 19 +++++--- src/main/resources/static/style.css | 43 +++++++++++-------- src/main/resources/templates/post.html | 16 ++++--- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index ff02a594..11c55f9a 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Controller @RequestMapping("/posts") @@ -21,7 +23,10 @@ public class ArticleViewController { public String getAllArticlesView(Model model) { List articleViewResponseList = articleViewService.getAllPostViews(); - model.addAttribute("articleList", articleViewResponseList); + Map> ArticleListGroupByBoard = articleViewResponseList.stream() + .collect(Collectors.groupingBy(ArticleViewResponse::board)); + + model.addAttribute("articleListGroupByBoard", ArticleListGroupByBoard); return "post"; } diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java index 0d00d375..98d13625 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleViewResponse.java @@ -9,13 +9,15 @@ public record ArticleViewResponse( String title, String author, + String board, String content, LocalDateTime createdAt, LocalDateTime updatedAt ) { - public static ArticleViewResponse fromEntity(Article article, String authorName) { + public static ArticleViewResponse fromEntity(Article article, String authorName, String boardName) { return ArticleViewResponse.builder() .title(article.getTitle()) + .board(boardName) .author(authorName) .content(article.getContent()) .createdAt(article.getCreatedAt()) diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 6602b0ba..ef02eb79 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -2,8 +2,10 @@ import com.example.bcsd.dto.resopnse.ArticleViewResponse; import com.example.bcsd.model.Article; +import com.example.bcsd.model.Board; import com.example.bcsd.model.Member; import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.BoardRepository; import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,6 +17,7 @@ public class ArticleViewService { private final ArticleRepository articleRepository; private final MemberRepository memberRepository; + private final BoardRepository boardRepository; public List getAllPostViews() { List
articles = articleRepository.findAll(); @@ -30,12 +33,16 @@ public List getAllPostViewsByBoardId(Long boardId) { private List convertToViewResponse(List
articles) { return articles.stream() - .map(article -> - ArticleViewResponse.fromEntity( - article, memberRepository.findById(article.getAuthorId()) - .map(Member::getName) - .orElse("알 수 없음") - ) + .map(article -> + ArticleViewResponse.fromEntity( + article, + memberRepository.findById(article.getAuthorId()) + .map(Member::getName) + .orElse("알 수 없음"), + boardRepository.findById(article.getBoardId()) + .map(Board::getName) + .orElse("알 수 없음") + ) ).toList(); } } diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css index dd18cee6..730f1d62 100644 --- a/src/main/resources/static/style.css +++ b/src/main/resources/static/style.css @@ -1,28 +1,27 @@ .article-box { width: 300px; border: 1px solid black; - margin: 20px; + margin-bottom: 10px; } -.article-title { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; -} - -.article-header { +.board-container { display: flex; - flex-direction: column; + gap: 20px; + margin-bottom: 20px; } -.article-header h1 { - align-self: center; +.board-column { + border: 1px solid #ccc; + padding: 10px; + width: 300px; + flex-shrink: 0; } -.article-header p { - align-self: flex-end; - margin-right: 10px; +.article-title { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; } hr { @@ -30,7 +29,17 @@ hr { margin: 0 auto; } +.article-header { + display: flex; + justify-content: flex-end; + padding: 0 10px; + font-size: 0.9em; + color: #555; +} + .article-content { - width: 90%; - margin: 10px auto 30px auto; + margin-top: 10px; + padding: 0 15px; + text-align: left; + word-wrap: break-word; } diff --git a/src/main/resources/templates/post.html b/src/main/resources/templates/post.html index d071b775..73cb3aac 100644 --- a/src/main/resources/templates/post.html +++ b/src/main/resources/templates/post.html @@ -6,14 +6,16 @@ -

자유 게시판

-
-
-

-

+
+
+

+
+

+

+
+

+
-
-

From 4240d0bd6e09cf1806d9911d29fff85df4005400 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 15 May 2025 14:43:55 +0900 Subject: [PATCH 068/143] =?UTF-8?q?refactory.=20=EB=B9=84=EC=8A=B7?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EC=A7=81=20=EB=AA=A8=EB=93=88=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleViewController.java | 10 +++------- .../example/bcsd/service/ArticleViewService.java | 13 ++++++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleViewController.java b/src/main/java/com/example/bcsd/controller/ArticleViewController.java index 11c55f9a..59d09afc 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleViewController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleViewController.java @@ -11,7 +11,6 @@ import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Controller @RequestMapping("/posts") @@ -21,10 +20,7 @@ public class ArticleViewController { @GetMapping public String getAllArticlesView(Model model) { - List articleViewResponseList = articleViewService.getAllPostViews(); - - Map> ArticleListGroupByBoard = articleViewResponseList.stream() - .collect(Collectors.groupingBy(ArticleViewResponse::board)); + Map> ArticleListGroupByBoard = articleViewService.getAllPostViews(); model.addAttribute("articleListGroupByBoard", ArticleListGroupByBoard); @@ -33,9 +29,9 @@ public String getAllArticlesView(Model model) { @GetMapping(params = "boardId") public String getAllArticlesViewByBoardId(Model model, @RequestParam Long boardId) { - List articleViewResponseList = articleViewService.getAllPostViewsByBoardId(boardId); + Map> articleViewResponseList = articleViewService.getAllPostViewsByBoardId(boardId); - model.addAttribute("articleList", articleViewResponseList); + model.addAttribute("articleListGroupByBoard", articleViewResponseList); return "post"; } diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index ef02eb79..39c4c0d2 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -11,6 +11,8 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -19,20 +21,21 @@ public class ArticleViewService { private final MemberRepository memberRepository; private final BoardRepository boardRepository; - public List getAllPostViews() { + public Map> getAllPostViews() { List
articles = articleRepository.findAll(); return convertToViewResponse(articles); } - public List getAllPostViewsByBoardId(Long boardId) { + public Map> getAllPostViewsByBoardId(Long boardId) { List
articles = articleRepository.findAllByBoardId(boardId); return convertToViewResponse(articles); } - private List convertToViewResponse(List
articles) { - return articles.stream() + private Map> convertToViewResponse(List
articles) { + return + articles.stream() .map(article -> ArticleViewResponse.fromEntity( article, @@ -43,6 +46,6 @@ private List convertToViewResponse(List
articles) .map(Board::getName) .orElse("알 수 없음") ) - ).toList(); + ).collect(Collectors.groupingBy(ArticleViewResponse::board)); } } From 079778230a4efd653b948071b0fbd7ae5a01e443 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 13:37:34 +0900 Subject: [PATCH 069/143] =?UTF-8?q?feat.=20@Transactional=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/repository/ArticleJDBCRepositoryImpl.java | 5 +++++ .../com/example/bcsd/repository/BoardJDBCRepositoryImpl.java | 5 +++++ .../example/bcsd/repository/MemberJDBCRepositoryImpl.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index 9b8f63e3..9be64a5e 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -7,6 +7,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -14,6 +15,7 @@ @RequiredArgsConstructor @Repository +@Transactional(readOnly = true) public class ArticleJDBCRepositoryImpl implements ArticleRepository { private final JdbcTemplate jdbcTemplate; @@ -44,6 +46,7 @@ public List
findAllByBoardId(Long boardId) { } @Override + @Transactional public Article save(Article article) { String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -65,6 +68,7 @@ public Article save(Article article) { } @Override + @Transactional public Article save(Long id, Article article) { String sql = "UPDATE Article SET title = ?, content = ? WHERE id = ?"; @@ -79,6 +83,7 @@ public Article save(Long id, Article article) { } @Override + @Transactional public void delete(Long id) { String sql = "DELETE from Article WHERE id = ?"; diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java index 6e0fc2a0..bded2676 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -7,6 +7,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -14,6 +15,7 @@ @Repository @RequiredArgsConstructor +@Transactional(readOnly = true) public class BoardJDBCRepositoryImpl implements BoardRepository { private final JdbcTemplate jdbcTemplate; @@ -38,6 +40,7 @@ public Optional findById(Long id) { } @Override + @Transactional public Board save(Board board) { String sql = "INSERT INTO Board (name) VALUES (?)"; @@ -56,6 +59,7 @@ public Board save(Board board) { } @Override + @Transactional public Board save(Long id, Board board) { String sql = "UPDATE Board SET name = ? WHERE id = ?"; @@ -69,6 +73,7 @@ public Board save(Long id, Board board) { } @Override + @Transactional public void delete(Long id) { String sql = "DELETE from Board WHERE id = ?"; diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 1d962328..b77f10b2 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -7,6 +7,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -14,6 +15,7 @@ @Repository @RequiredArgsConstructor +@Transactional(readOnly = true) public class MemberJDBCRepositoryImpl implements MemberRepository { private final JdbcTemplate jdbcTemplate; @@ -38,6 +40,7 @@ public Optional findById(Long id) { } @Override + @Transactional public Member save(Member member) { String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -58,6 +61,7 @@ public Member save(Member member) { } @Override + @Transactional public Member save(Long id, Member member) { String sql = "UPDATE Member SET name = ?, email = ? password = ?, WHERE id = ?"; @@ -73,6 +77,7 @@ public Member save(Long id, Member member) { } @Override + @Transactional public void delete(Long id) { String sql = "DELETE from Member WHERE id = ?"; From 78d5fe639139bc07cad301b69c09c5f48e9b1450 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 13:45:19 +0900 Subject: [PATCH 070/143] =?UTF-8?q?refactory.=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EB=90=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20CRUDRepostio?= =?UTF-8?q?ry=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=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 --- .../example/bcsd/repository/ArticleRepository.java | 10 ++-------- .../com/example/bcsd/repository/BoardRepository.java | 11 +---------- .../com/example/bcsd/repository/CRUDRepository.java | 12 ++++++++++++ .../example/bcsd/repository/MemberRepository.java | 11 +---------- 4 files changed, 16 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/example/bcsd/repository/CRUDRepository.java diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 2bbc2fd6..3013beb5 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -3,13 +3,7 @@ import com.example.bcsd.model.Article; import java.util.List; -import java.util.Optional; -public interface ArticleRepository { - List
findAll(); - Optional
findById(Long id); - List
findAllByBoardId(Long BoardId); - Article save(Article article); - Article save(Long id, Article article); - void delete(Long id); +public interface ArticleRepository extends CRUDRepository { + public List
findAllByBoardId(Long boardId); } diff --git a/src/main/java/com/example/bcsd/repository/BoardRepository.java b/src/main/java/com/example/bcsd/repository/BoardRepository.java index 64470445..777b3c9b 100644 --- a/src/main/java/com/example/bcsd/repository/BoardRepository.java +++ b/src/main/java/com/example/bcsd/repository/BoardRepository.java @@ -2,13 +2,4 @@ import com.example.bcsd.model.Board; -import java.util.List; -import java.util.Optional; - -public interface BoardRepository { - List findAll(); - Optional findById(Long id); - Board save(Board board); - Board save(Long id, Board board); - void delete(Long id); -} +public interface BoardRepository extends CRUDRepository { } diff --git a/src/main/java/com/example/bcsd/repository/CRUDRepository.java b/src/main/java/com/example/bcsd/repository/CRUDRepository.java new file mode 100644 index 00000000..dd446f0f --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/CRUDRepository.java @@ -0,0 +1,12 @@ +package com.example.bcsd.repository; + +import java.util.List; +import java.util.Optional; + +public interface CRUDRepository { + List findAll(); + Optional findById(ID id); + T save(T entity); + T save(ID id, T entity); + void delete(ID id); +} diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index b011d77e..b883cd7b 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -2,13 +2,4 @@ import com.example.bcsd.model.Member; -import java.util.List; -import java.util.Optional; - -public interface MemberRepository { - List findAll(); - Optional findById(Long id); - Member save(Member member); - Member save(Long id, Member member); - void delete(Long id); -} +public interface MemberRepository extends CRUDRepository { } From 6aa6c3192e7f060f40b034c558b7563ccd18da13 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 14:10:31 +0900 Subject: [PATCH 071/143] =?UTF-8?q?build.=20BCrypt=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8109f511..a729594c 100644 --- a/build.gradle +++ b/build.gradle @@ -26,8 +26,8 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.38' implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'com.mysql:mysql-connector-j:8.2.0' + implementation 'org.mindrot:jbcrypt:0.4' } - tasks.named('test') { useJUnitPlatform() } From 21779600c4a789847e71d9bc6f3952383e83a4bf Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 14:11:04 +0900 Subject: [PATCH 072/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=95=94=ED=98=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/dto/request/MemberRequest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index c4daa964..33cf40c0 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -1,12 +1,18 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Member; +import org.mindrot.jbcrypt.BCrypt; public record MemberRequest( String name, String email, String password ) { + public MemberRequest(String name, String email, String password) { + this.name = name; + this.email = email; + this.password = BCrypt.hashpw(password, BCrypt.gensalt()); + } public Member toEntity() { return Member.builder() .name(name) From 5f2a58ca8b1a9c43cbfbd137dec59d67f0f95204 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 17:27:31 +0900 Subject: [PATCH 073/143] =?UTF-8?q?style.=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index 9be64a5e..53290bb8 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -50,6 +50,7 @@ public List
findAllByBoardId(Long boardId) { public Article save(Article article) { String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); From 2ad8656b88cae174d828572662c3787700a2c5f0 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 17:39:26 +0900 Subject: [PATCH 074/143] =?UTF-8?q?fix.=20=EB=8B=A8=EA=B1=B4=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EC=88=98=EC=A0=95=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=BB=A4=EC=8A=A4=ED=85=80=20=EC=98=88=EC=99=B8=EB=A1=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/repository/ArticleJDBCRepositoryImpl.java | 6 +++--- .../example/bcsd/repository/BoardJDBCRepositoryImpl.java | 6 +++--- .../example/bcsd/repository/MemberJDBCRepositoryImpl.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index 53290bb8..35503867 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -30,13 +30,13 @@ public List
findAll() { public Optional
findById(Long id) { String sql = "SELECT * FROM Article WHERE id = ?"; - return Optional.ofNullable( - jdbcTemplate.queryForObject( + return jdbcTemplate.query( sql, articleRowMapper(), id ) - ); + .stream() + .findFirst(); } public List
findAllByBoardId(Long boardId) { diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java index bded2676..e49625c7 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -30,13 +30,13 @@ public List findAll() { public Optional findById(Long id) { String sql = "SELECT * FROM Board WHERE id = ?"; - return Optional.ofNullable( - jdbcTemplate.queryForObject( + return jdbcTemplate.query( sql, boardRowMapper(), id ) - ); + .stream() + .findFirst(); } @Override diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index b77f10b2..39167f1c 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -30,13 +30,13 @@ public List findAll() { public Optional findById(Long id) { String sql = "SELECT * FROM Member WHERE id = ?"; - return Optional.ofNullable( - jdbcTemplate.queryForObject( + return jdbcTemplate.query( sql, memberRowMapper(), id ) - ); + .stream() + .findFirst(); } @Override From edd6d7a18125f345b9d79e3406cd30b98e3abd79 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 22:35:41 +0900 Subject: [PATCH 075/143] =?UTF-8?q?fix.=20Repository=EC=97=90=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20@Transactional=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20Service=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/repository/ArticleJDBCRepositoryImpl.java | 5 ----- .../example/bcsd/repository/BoardJDBCRepositoryImpl.java | 5 ----- .../example/bcsd/repository/MemberJDBCRepositoryImpl.java | 5 ----- src/main/java/com/example/bcsd/service/ArticleService.java | 5 +++++ .../java/com/example/bcsd/service/ArticleViewService.java | 2 ++ src/main/java/com/example/bcsd/service/BoardService.java | 5 +++++ src/main/java/com/example/bcsd/service/MemberService.java | 7 ++++++- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index 35503867..faeb9a5c 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -7,7 +7,6 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -15,7 +14,6 @@ @RequiredArgsConstructor @Repository -@Transactional(readOnly = true) public class ArticleJDBCRepositoryImpl implements ArticleRepository { private final JdbcTemplate jdbcTemplate; @@ -46,7 +44,6 @@ public List
findAllByBoardId(Long boardId) { } @Override - @Transactional public Article save(Article article) { String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -69,7 +66,6 @@ public Article save(Article article) { } @Override - @Transactional public Article save(Long id, Article article) { String sql = "UPDATE Article SET title = ?, content = ? WHERE id = ?"; @@ -84,7 +80,6 @@ public Article save(Long id, Article article) { } @Override - @Transactional public void delete(Long id) { String sql = "DELETE from Article WHERE id = ?"; diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java index e49625c7..1c506ef8 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -7,7 +7,6 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -15,7 +14,6 @@ @Repository @RequiredArgsConstructor -@Transactional(readOnly = true) public class BoardJDBCRepositoryImpl implements BoardRepository { private final JdbcTemplate jdbcTemplate; @@ -40,7 +38,6 @@ public Optional findById(Long id) { } @Override - @Transactional public Board save(Board board) { String sql = "INSERT INTO Board (name) VALUES (?)"; @@ -59,7 +56,6 @@ public Board save(Board board) { } @Override - @Transactional public Board save(Long id, Board board) { String sql = "UPDATE Board SET name = ? WHERE id = ?"; @@ -73,7 +69,6 @@ public Board save(Long id, Board board) { } @Override - @Transactional public void delete(Long id) { String sql = "DELETE from Board WHERE id = ?"; diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 39167f1c..fc719aa1 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -7,7 +7,6 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; import java.util.List; @@ -15,7 +14,6 @@ @Repository @RequiredArgsConstructor -@Transactional(readOnly = true) public class MemberJDBCRepositoryImpl implements MemberRepository { private final JdbcTemplate jdbcTemplate; @@ -40,7 +38,6 @@ public Optional findById(Long id) { } @Override - @Transactional public Member save(Member member) { String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -61,7 +58,6 @@ public Member save(Member member) { } @Override - @Transactional public Member save(Long id, Member member) { String sql = "UPDATE Member SET name = ?, email = ? password = ?, WHERE id = ?"; @@ -77,7 +73,6 @@ public Member save(Long id, Member member) { } @Override - @Transactional public void delete(Long id) { String sql = "DELETE from Member WHERE id = ?"; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 7580ed38..ba167dff 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -9,11 +9,13 @@ import com.example.bcsd.repository.ArticleRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class ArticleService { private final ArticleRepository articleRepository; @@ -40,6 +42,7 @@ public List getArticlesByBoardId(Long boardId) { .toList(); } + @Transactional public ArticleResponse createArticle(ArticleCreateRequest request) { return ArticleResponse.fromEntity( articleRepository.save( @@ -48,6 +51,7 @@ public ArticleResponse createArticle(ArticleCreateRequest request) { ); } + @Transactional public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { Article article = articleRepository .findById(id) @@ -61,6 +65,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) ); } + @Transactional public void deleteArticleById(Long id) { articleRepository.findById(id) .orElseThrow(() -> diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 39c4c0d2..40fb581a 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -9,6 +9,7 @@ import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; @@ -16,6 +17,7 @@ @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class ArticleViewService { private final ArticleRepository articleRepository; private final MemberRepository memberRepository; diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index fd32f32d..c1024336 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -8,11 +8,13 @@ import com.example.bcsd.repository.BoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class BoardService { private final BoardRepository boardRepository; @@ -32,6 +34,7 @@ public BoardResponse getBoardById(Long id) { ); } + @Transactional public BoardResponse createBoard(BoardRequest request) { return BoardResponse.fromEntity( boardRepository.save( @@ -40,6 +43,7 @@ public BoardResponse createBoard(BoardRequest request) { ); } + @Transactional public BoardResponse updateBoardById(Long id, BoardRequest request) { Board board = boardRepository .findById(id) @@ -53,6 +57,7 @@ public BoardResponse updateBoardById(Long id, BoardRequest request) { ); } + @Transactional public void deleteBoardById(Long id) { boardRepository.findById(id) .orElseThrow(() -> diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 0eaf5899..7b92b01b 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -8,11 +8,13 @@ import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; @@ -32,6 +34,7 @@ public MemberResponse getMemberById(Long id) { ); } + @Transactional public MemberResponse createMember(MemberRequest request) { return MemberResponse.fromEntity( memberRepository.save( @@ -40,6 +43,7 @@ public MemberResponse createMember(MemberRequest request) { ); } + @Transactional public MemberResponse updateMember(Long id, MemberRequest request) { Member member = memberRepository.findById(id) .orElseThrow(() -> @@ -51,7 +55,8 @@ public MemberResponse updateMember(Long id, MemberRequest request) { memberRepository.save(id, member) ); } - +Re + @Transactional public void deleteMember(Long id) { memberRepository.findById(id) .orElseThrow(() -> From 9d84e2c0cfa4a6a3d6e9389003f01abf09240fef Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 22:37:53 +0900 Subject: [PATCH 076/143] =?UTF-8?q?fix.=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=AC=B8=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/MemberService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 7b92b01b..e8d2bed9 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -55,7 +55,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { memberRepository.save(id, member) ); } -Re + @Transactional public void deleteMember(Long id) { memberRepository.findById(id) From 044201a9e30c4408ead065ce95e327adff9d7c7a Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 19 May 2025 22:43:22 +0900 Subject: [PATCH 077/143] =?UTF-8?q?fix.=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=8B=A8=EC=97=90=20=EC=9E=88=EB=8A=94=20@Transactional(readOn?= =?UTF-8?q?ly=3Dtrue)=20=EC=9D=BD=EA=B8=B0=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=81=EA=B0=81=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/ArticleService.java | 3 +++ src/main/java/com/example/bcsd/service/ArticleViewService.java | 2 ++ src/main/java/com/example/bcsd/service/BoardService.java | 3 ++- src/main/java/com/example/bcsd/service/MemberService.java | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index ba167dff..89b8aa6a 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -19,6 +19,7 @@ public class ArticleService { private final ArticleRepository articleRepository; + @Transactional(readOnly = true) public List getAllArticles() { return articleRepository.findAll() .stream() @@ -26,6 +27,7 @@ public List getAllArticles() { .toList(); } + @Transactional(readOnly = true) public ArticleResponse getArticleById(Long id) { return ArticleResponse.fromEntity( articleRepository.findById(id) @@ -35,6 +37,7 @@ public ArticleResponse getArticleById(Long id) { ); } + @Transactional(readOnly = true) public List getArticlesByBoardId(Long boardId) { return articleRepository.findAllByBoardId(boardId) .stream() diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index 40fb581a..dc47d2ed 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -23,12 +23,14 @@ public class ArticleViewService { private final MemberRepository memberRepository; private final BoardRepository boardRepository; + @Transactional(readOnly = true) public Map> getAllPostViews() { List
articles = articleRepository.findAll(); return convertToViewResponse(articles); } + @Transactional(readOnly = true) public Map> getAllPostViewsByBoardId(Long boardId) { List
articles = articleRepository.findAllByBoardId(boardId); diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index c1024336..bb91cf2e 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -14,10 +14,10 @@ @Service @RequiredArgsConstructor -@Transactional(readOnly = true) public class BoardService { private final BoardRepository boardRepository; + @Transactional(readOnly = true) public List getAllBoards() { return boardRepository.findAll() .stream() @@ -25,6 +25,7 @@ public List getAllBoards() { .toList(); } + @Transactional(readOnly = true) public BoardResponse getBoardById(Long id) { return BoardResponse.fromEntity( boardRepository.findById(id) diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index e8d2bed9..e71cf6ca 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -14,10 +14,10 @@ @Service @RequiredArgsConstructor -@Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; + @Transactional(readOnly = true) public List getAllMembers() { return memberRepository.findAll() .stream() @@ -25,6 +25,7 @@ public List getAllMembers() { .toList(); } + @Transactional(readOnly = true) public MemberResponse getMemberById(Long id) { return MemberResponse.fromEntity( memberRepository.findById(id) From 1a22c9565ea10f8f93461c7967611b0a785f5737 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 21 May 2025 10:07:39 +0900 Subject: [PATCH 078/143] =?UTF-8?q?build.=20Validation=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index a729594c..735199d8 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ dependencies { compileOnly("org.projectlombok:lombok:1.18.38") annotationProcessor 'org.projectlombok:lombok:1.18.38' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-validation' runtimeOnly 'com.mysql:mysql-connector-j:8.2.0' implementation 'org.mindrot:jbcrypt:0.4' } From 36bf954bc87a39554b2f0c3e9d5a8020e4ca6ac9 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 21 May 2025 10:34:08 +0900 Subject: [PATCH 079/143] =?UTF-8?q?feat.=20Article=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 22 ++++++++++++++----- .../dto/request/ArticleCreateRequest.java | 11 ++++++++++ .../dto/request/ArticleUpdateRequest.java | 7 ++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index edbac1e2..59ac1252 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -1,9 +1,10 @@ package com.example.bcsd.controller; import com.example.bcsd.dto.request.ArticleCreateRequest; -import com.example.bcsd.dto.resopnse.ArticleResponse; import com.example.bcsd.dto.request.ArticleUpdateRequest; +import com.example.bcsd.dto.resopnse.ArticleResponse; import com.example.bcsd.service.ArticleService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -24,19 +25,25 @@ public ResponseEntity> getAllArticles() { } @GetMapping("/{id}") - public ResponseEntity getArticleById(@PathVariable Long id) { + public ResponseEntity getArticleById( + @PathVariable Long id + ) { return ResponseEntity .ok(articleService.getArticleById(id)); } @GetMapping(params = "boardId") - public ResponseEntity> getArticlesByBoardId(@RequestParam Long boardId) { + public ResponseEntity> getArticlesByBoardId( + @RequestParam Long boardId + ) { return ResponseEntity .ok(articleService.getArticlesByBoardId(boardId)); } @PostMapping - public ResponseEntity createArticle(@RequestBody ArticleCreateRequest request) { + public ResponseEntity createArticle( + @RequestBody @Valid ArticleCreateRequest request + ) { return ResponseEntity .status(HttpStatus.CREATED) .body(articleService.createArticle(request)); @@ -44,14 +51,17 @@ public ResponseEntity createArticle(@RequestBody ArticleCreateR @PutMapping("/{id}") public ResponseEntity updateArticleById( - @PathVariable Long id, @RequestBody ArticleUpdateRequest request + @PathVariable Long id, + @RequestBody @Valid ArticleUpdateRequest request ) { return ResponseEntity .ok(articleService.updateArticleById(id, request)); } @DeleteMapping("/{id}") - public ResponseEntity deleteArticleById(@PathVariable Long id) { + public ResponseEntity deleteArticleById( + @PathVariable Long id + ) { articleService.deleteArticleById(id); return ResponseEntity.noContent().build(); diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index d14af847..9f305e3e 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -1,11 +1,22 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Article; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public record ArticleCreateRequest ( + @NotBlank + @Size(max=255) String title, + + @NotNull Long authorId, + + @NotNull Long boardId, + + @NotBlank String content ) { public Article toEntity() { diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index a4f8ee2b..3905483b 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -1,6 +1,13 @@ package com.example.bcsd.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + public record ArticleUpdateRequest ( + @NotBlank + @Size(max=255) String title, + + @NotBlank String content ) { } From b90af9b4aab45054c6d2a0f2a19b3732c5af614c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 21 May 2025 10:50:51 +0900 Subject: [PATCH 080/143] =?UTF-8?q?feat.=20=EC=98=88=EC=99=B8=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/validation/ArticleValidation.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/com/example/bcsd/validation/ArticleValidation.java diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java new file mode 100644 index 00000000..4d10f483 --- /dev/null +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -0,0 +1,4 @@ +package com.example.bcsd.validation; + +public class ArticleValidation { +} From b7d6c90bbb8c79047685df5d859b3121d251b11e Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 21 May 2025 10:52:12 +0900 Subject: [PATCH 081/143] =?UTF-8?q?feat.=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9E=90=EC=9B=90=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=B0=B8=EC=A1=B0=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/exception/ExceptionMessage.java | 3 ++- .../example/bcsd/service/ArticleService.java | 4 ++++ .../bcsd/validation/ArticleValidation.java | 21 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index 72f8c63b..4880df79 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -6,7 +6,8 @@ public enum ExceptionMessage { ARTICLE_NOT_FOUND(404, "해당 게시글을 찾을 수 없습니다."), MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."), - BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."); + BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."), + REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 89b8aa6a..3b57cb9f 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -7,6 +7,7 @@ import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.validation.ArticleValidation; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,6 +19,7 @@ @Transactional(readOnly = true) public class ArticleService { private final ArticleRepository articleRepository; + private final ArticleValidation articleValidation; @Transactional(readOnly = true) public List getAllArticles() { @@ -47,6 +49,8 @@ public List getArticlesByBoardId(Long boardId) { @Transactional public ArticleResponse createArticle(ArticleCreateRequest request) { + articleValidation.validateCreateArticle(request); + return ArticleResponse.fromEntity( articleRepository.save( request.toEntity() diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index 4d10f483..4d5ba952 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -1,4 +1,25 @@ package com.example.bcsd.validation; +import com.example.bcsd.dto.request.ArticleCreateRequest; +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.service.BoardService; +import com.example.bcsd.service.MemberService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor public class ArticleValidation { + private final BoardService boardService; + private final MemberService memberService; + + public void validateCreateArticle(ArticleCreateRequest request) { + try { + memberService.getMemberById(request.authorId()); + boardService.getBoardById(request.boardId()); + } catch(CustomException ex) { + throw new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND); + } + } } From 47cdce1c6e7d6dcc02b9a4de93a9e40c83ed5dd2 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 10:24:43 +0900 Subject: [PATCH 082/143] =?UTF-8?q?refactory.=20Article=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=9A=94=EC=B2=AD=EC=97=90=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90,=20=EB=A9=A4=EB=B2=84=EB=8F=84=20=EB=B0=94=EA=BF=80?= =?UTF-8?q?=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/dto/request/ArticleUpdateRequest.java | 7 +++++++ src/main/java/com/example/bcsd/model/Article.java | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index 3905483b..f2dc2414 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -1,9 +1,16 @@ package com.example.bcsd.dto.request; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; public record ArticleUpdateRequest ( + @NotNull + Long authorId, + + @NotNull + Long boardId, + @NotBlank @Size(max=255) String title, diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index ebecda3d..0fa7093c 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -15,14 +15,21 @@ public class Article { private Long id; private String title; - private final Long authorId; - private final Long boardId; + private Long authorId; + private Long boardId; private String content; private final LocalDateTime createdAt; private LocalDateTime updatedAt; - public Article updateDetails(String title, String content) { + public Article updateDetails( + Long authorId, + Long boardId, + String title, + String content + ) { + this.authorId = authorId; + this.boardId = boardId; this.title = title; this.content = content; updatedAt = LocalDateTime.now(); From f05c2ffd2a621533de60156790bb692b03578a96 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:08:45 +0900 Subject: [PATCH 083/143] =?UTF-8?q?chore.=20=ED=95=84=EB=93=9C=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/dto/request/ArticleCreateRequest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index 9f305e3e..29b2a823 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -6,16 +6,16 @@ import jakarta.validation.constraints.Size; public record ArticleCreateRequest ( - @NotBlank - @Size(max=255) - String title, - @NotNull Long authorId, @NotNull Long boardId, + @NotBlank + @Size(max=255) + String title, + @NotBlank String content ) { From f03a27ca798ab62e5c3212c5d085c1b0d981f384 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:14:15 +0900 Subject: [PATCH 084/143] =?UTF-8?q?refactory.=20=EC=B0=B8=EC=A1=B0=20?= =?UTF-8?q?=EB=AC=B4=EA=B2=B0=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=B6=84=ED=95=A0=20=EB=B0=8F=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EB=8A=94=20=EA=B2=80=EC=A6=9D=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/service/ArticleService.java | 18 ++++----- .../bcsd/validation/ArticleValidation.java | 40 +++++++++++++------ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 3b57cb9f..747ca625 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -49,7 +49,8 @@ public List getArticlesByBoardId(Long boardId) { @Transactional public ArticleResponse createArticle(ArticleCreateRequest request) { - articleValidation.validateCreateArticle(request); + articleValidation.validateAuthorExist(request.authorId()); + articleValidation.validateBoardExist(request.boardId()); return ArticleResponse.fromEntity( articleRepository.save( @@ -60,12 +61,14 @@ public ArticleResponse createArticle(ArticleCreateRequest request) { @Transactional public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { + articleValidation.validateAuthorExist(request.authorId()); + articleValidation.validateBoardExist(request.boardId()); + articleValidation.validateArticleExist(id); + Article article = articleRepository .findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) - ) - .updateDetails(request.title(), request.content()); + .get() + .updateDetails(request.authorId(), request.boardId(), request.title(), request.content()); return ArticleResponse.fromEntity( articleRepository.save(id, article) @@ -74,10 +77,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) @Transactional public void deleteArticleById(Long id) { - articleRepository.findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) - ); + articleValidation.validateArticleExist(id); articleRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index 4d5ba952..3d7b5629 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -1,25 +1,41 @@ package com.example.bcsd.validation; -import com.example.bcsd.dto.request.ArticleCreateRequest; import com.example.bcsd.exception.CustomException; import com.example.bcsd.exception.ExceptionMessage; -import com.example.bcsd.service.BoardService; -import com.example.bcsd.service.MemberService; +import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.BoardRepository; +import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class ArticleValidation { - private final BoardService boardService; - private final MemberService memberService; + private final ArticleRepository articleRepository; + private final BoardRepository boardRepository; + private final MemberRepository memberRepository; - public void validateCreateArticle(ArticleCreateRequest request) { - try { - memberService.getMemberById(request.authorId()); - boardService.getBoardById(request.boardId()); - } catch(CustomException ex) { - throw new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND); - } + public void validateAuthorExist(Long authorId) { + memberRepository + .findById(authorId) + .orElseThrow(() -> + new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) + ); + } + + public void validateBoardExist(Long boardId) { + boardRepository + .findById(boardId) + .orElseThrow(() -> + new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) + ); + } + + public void validateArticleExist(Long articleId) { + articleRepository + .findById(articleId) + .orElseThrow(() -> + new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) + ); } } From f4262b8176bfa49d758c46fd126f5d1d46e37c44 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:15:27 +0900 Subject: [PATCH 085/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EA=B2=80=EC=A6=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/exception/ExceptionMessage.java | 3 +- .../example/bcsd/service/MemberService.java | 16 +++++----- .../bcsd/validation/MemberValidation.java | 29 +++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/bcsd/validation/MemberValidation.java diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index 4880df79..082fadff 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -7,7 +7,8 @@ public enum ExceptionMessage { ARTICLE_NOT_FOUND(404, "해당 게시글을 찾을 수 없습니다."), MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."), BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."), - REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."); + REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), + EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index e71cf6ca..2bb11974 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -6,6 +6,7 @@ import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; +import com.example.bcsd.validation.MemberValidation; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +17,7 @@ @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + private final MemberValidation memberValidation; @Transactional(readOnly = true) public List getAllMembers() { @@ -37,6 +39,8 @@ public MemberResponse getMemberById(Long id) { @Transactional public MemberResponse createMember(MemberRequest request) { + memberValidation.validateEmailDuplicate(request.email()); + return MemberResponse.fromEntity( memberRepository.save( request.toEntity() @@ -46,10 +50,11 @@ public MemberResponse createMember(MemberRequest request) { @Transactional public MemberResponse updateMember(Long id, MemberRequest request) { + memberValidation.validateEmailDuplicate(request.email()); + memberValidation.validateMemberExist(id); + Member member = memberRepository.findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) - ) + .get() .updatePersonalInformation(request.name(), request.email(), request.password()); return MemberResponse.fromEntity( @@ -59,10 +64,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { @Transactional public void deleteMember(Long id) { - memberRepository.findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) - ); + memberValidation.validateMemberExist(id); memberRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java new file mode 100644 index 00000000..43febd88 --- /dev/null +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -0,0 +1,29 @@ +package com.example.bcsd.validation; + +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.service.MemberService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class MemberValidation { + private final MemberService memberService; + + public void validateEmailDuplicate(String email) { + memberService.getAllMembers() + .stream() + .filter((member) -> + email.equals( + member.email() + ) + ) + .findFirst() + .orElseThrow(() -> new CustomException(ExceptionMessage.EMAIL_DUPLICATE)); + } + + public void validateMemberExist(Long memberId) { + memberService.getMemberById(memberId); + } +} From 022d2bef054f1a4e4ff27a967284e0bc819a4d3b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:20:12 +0900 Subject: [PATCH 086/143] =?UTF-8?q?refactory.=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=B0=B8=EC=A1=B0=EC=84=B1=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/service/ArticleService.java | 6 ++---- .../java/com/example/bcsd/validation/ArticleValidation.java | 5 +++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 747ca625..d0238030 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -49,8 +49,7 @@ public List getArticlesByBoardId(Long boardId) { @Transactional public ArticleResponse createArticle(ArticleCreateRequest request) { - articleValidation.validateAuthorExist(request.authorId()); - articleValidation.validateBoardExist(request.boardId()); + articleValidation.validateArticleReference(request.authorId(), request.boardId()); return ArticleResponse.fromEntity( articleRepository.save( @@ -61,8 +60,7 @@ public ArticleResponse createArticle(ArticleCreateRequest request) { @Transactional public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { - articleValidation.validateAuthorExist(request.authorId()); - articleValidation.validateBoardExist(request.boardId()); + articleValidation.validateArticleReference(request.authorId(), request.boardId()); articleValidation.validateArticleExist(id); Article article = articleRepository diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index 3d7b5629..cfdbbe30 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -15,6 +15,11 @@ public class ArticleValidation { private final BoardRepository boardRepository; private final MemberRepository memberRepository; + public void validateArticleReference(Long authorId, Long boardId) { + validateAuthorExist(authorId); + validateBoardExist(boardId); + } + public void validateAuthorExist(Long authorId) { memberRepository .findById(authorId) From 556577b18f960f346c4864e5e1f498a4e7d1ea4b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:23:22 +0900 Subject: [PATCH 087/143] =?UTF-8?q?fix.=20=EC=88=9C=ED=99=98=20=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/validation/MemberValidation.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java index 43febd88..ac98d913 100644 --- a/src/main/java/com/example/bcsd/validation/MemberValidation.java +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -2,21 +2,21 @@ import com.example.bcsd.exception.CustomException; import com.example.bcsd.exception.ExceptionMessage; -import com.example.bcsd.service.MemberService; +import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @RequiredArgsConstructor @Component public class MemberValidation { - private final MemberService memberService; + private final MemberRepository memberRepository; public void validateEmailDuplicate(String email) { - memberService.getAllMembers() + memberRepository.findAll() .stream() .filter((member) -> email.equals( - member.email() + member.getEmail() ) ) .findFirst() @@ -24,6 +24,9 @@ public void validateEmailDuplicate(String email) { } public void validateMemberExist(Long memberId) { - memberService.getMemberById(memberId); + memberRepository.findById(memberId) + .orElseThrow(() -> + new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) + ); } } From 08927a9dace7bbc7df7a5972e1c333274123040b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:39:36 +0900 Subject: [PATCH 088/143] =?UTF-8?q?fix.=20SQL=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EB=AC=B8=20=EC=89=BC=ED=91=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/repository/MemberJDBCRepositoryImpl.java | 2 +- .../com/example/bcsd/validation/MemberValidation.java | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index fc719aa1..780a0e88 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -59,7 +59,7 @@ public Member save(Member member) { @Override public Member save(Long id, Member member) { - String sql = "UPDATE Member SET name = ?, email = ? password = ?, WHERE id = ?"; + String sql = "UPDATE Member SET name = ?, email = ?, password = ? WHERE id = ?"; jdbcTemplate.update( sql, diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java index ac98d913..cc864961 100644 --- a/src/main/java/com/example/bcsd/validation/MemberValidation.java +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -14,13 +14,12 @@ public class MemberValidation { public void validateEmailDuplicate(String email) { memberRepository.findAll() .stream() - .filter((member) -> - email.equals( - member.getEmail() - ) - ) + .filter(member -> + email.equals(member.getEmail())) .findFirst() - .orElseThrow(() -> new CustomException(ExceptionMessage.EMAIL_DUPLICATE)); + .ifPresent(member -> { + throw new CustomException(ExceptionMessage.EMAIL_DUPLICATE); + }); } public void validateMemberExist(Long memberId) { From 0d82418e16119748d997fd699741bb3600b8ebc0 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:46:58 +0900 Subject: [PATCH 089/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20=EB=A9=A4=EB=B2=84=EA=B0=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=ED=95=9C=20=EA=B2=8C=EC=8B=9C=EA=B8=80=EC=9D=B4=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=A9=B4=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/exception/ExceptionMessage.java | 3 ++- .../java/com/example/bcsd/service/MemberService.java | 1 + .../example/bcsd/validation/MemberValidation.java | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index 082fadff..cf2eea8c 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -8,7 +8,8 @@ public enum ExceptionMessage { MEMBER_NOT_FOUND(404, "해당 멤버를 찾을 수 없습니다."), BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."), REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), - EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."); + EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), + MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 2bb11974..9f790bb9 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -65,6 +65,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { @Transactional public void deleteMember(Long id) { memberValidation.validateMemberExist(id); + memberValidation.validateMemberHasNoArticles(id); memberRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java index cc864961..8fa97d30 100644 --- a/src/main/java/com/example/bcsd/validation/MemberValidation.java +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -2,6 +2,7 @@ import com.example.bcsd.exception.CustomException; import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -10,6 +11,7 @@ @Component public class MemberValidation { private final MemberRepository memberRepository; + private final ArticleRepository articleRepository; public void validateEmailDuplicate(String email) { memberRepository.findAll() @@ -28,4 +30,14 @@ public void validateMemberExist(Long memberId) { new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) ); } + + public void validateMemberHasNoArticles(Long memberId) { + articleRepository.findAll() + .stream() + .filter(article -> article.getAuthorId() == memberId) + .findFirst() + .ifPresent(article -> { + throw new CustomException(ExceptionMessage.MEMBER_HAS_ARTICLES); + }); + } } From c538251c46b48baf87bb76083328183830da13b6 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 14:53:16 +0900 Subject: [PATCH 090/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EA=B2=8C=EC=8B=9C=ED=8C=90?= =?UTF-8?q?=EC=97=90=20=EC=9E=91=EC=84=B1=EB=90=9C=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=A9=B4=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/exception/ExceptionMessage.java | 3 ++- .../com/example/bcsd/service/BoardService.java | 4 ++++ .../bcsd/validation/BoardValidation.java | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/bcsd/validation/BoardValidation.java diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java index cf2eea8c..d94c1f88 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/exception/ExceptionMessage.java @@ -9,7 +9,8 @@ public enum ExceptionMessage { BOARD_NOT_FOUND(404, "해당 게시판을 찾을 수 없습니다."), REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), - MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."); + MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), + BOARD_HAS_ARTICLES(400, "작성된 게시글이 존재하여 삭제할 수 없습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index bb91cf2e..b23f8882 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -6,6 +6,7 @@ import com.example.bcsd.exception.ExceptionMessage; import com.example.bcsd.model.Board; import com.example.bcsd.repository.BoardRepository; +import com.example.bcsd.validation.BoardValidation; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +17,7 @@ @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; + private final BoardValidation boardValidation; @Transactional(readOnly = true) public List getAllBoards() { @@ -60,6 +62,8 @@ public BoardResponse updateBoardById(Long id, BoardRequest request) { @Transactional public void deleteBoardById(Long id) { + boardValidation.validateBoardHasNoArticles(id); + boardRepository.findById(id) .orElseThrow(() -> new CustomException(ExceptionMessage.BOARD_NOT_FOUND) diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java new file mode 100644 index 00000000..d4403b4e --- /dev/null +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -0,0 +1,18 @@ +package com.example.bcsd.validation; + +import com.example.bcsd.exception.CustomException; +import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.repository.ArticleRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class BoardValidation { + private final ArticleRepository articleRepository; + + public void validateBoardHasNoArticles(Long boardId) { + if(!articleRepository.findAllByBoardId(boardId).isEmpty()) + throw new CustomException(ExceptionMessage.BOARD_HAS_ARTICLES); + } +} From c08debdd6206536e03abbde21ed79f1bf095f032 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 22 May 2025 15:25:57 +0900 Subject: [PATCH 091/143] =?UTF-8?q?feat.=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=97=AD=EC=A7=81=EB=A0=AC=ED=99=94=ED=95=98?= =?UTF-8?q?=EB=A9=B4=EC=84=9C=20=EC=95=94=ED=98=B8=ED=99=94=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PasswordBcryptDeserializer.java | 19 +++++++++++++++++++ .../bcsd/dto/request/MemberRequest.java | 7 +++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java diff --git a/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java b/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java new file mode 100644 index 00000000..9018b451 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java @@ -0,0 +1,19 @@ +package com.example.bcsd.dto.deserializer; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import org.mindrot.jbcrypt.BCrypt; + +import java.io.IOException; + +public class PasswordBcryptDeserializer extends JsonDeserializer { + + @Override + public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { + String password = jsonParser.getValueAsString(); + + return BCrypt.hashpw(password, BCrypt.gensalt()); + } +} diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index 33cf40c0..ed9cd433 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -1,17 +1,20 @@ package com.example.bcsd.dto.request; +import com.example.bcsd.dto.deserializer.PasswordBcryptDeserializer; import com.example.bcsd.model.Member; -import org.mindrot.jbcrypt.BCrypt; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; public record MemberRequest( String name, String email, + + @JsonDeserialize(using = PasswordBcryptDeserializer.class ) String password ) { public MemberRequest(String name, String email, String password) { this.name = name; this.email = email; - this.password = BCrypt.hashpw(password, BCrypt.gensalt()); + this.password = password; } public Member toEntity() { return Member.builder() From f722633b56edfe04aea89bbf4d0488bdfd3639dd Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 10:17:47 +0900 Subject: [PATCH 092/143] =?UTF-8?q?refactory.=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=EC=97=90=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=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 --- .../example/bcsd/dto/request/ArticleCreateRequest.java | 10 +++++----- .../example/bcsd/dto/request/ArticleUpdateRequest.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index 29b2a823..c703027a 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -6,17 +6,17 @@ import jakarta.validation.constraints.Size; public record ArticleCreateRequest ( - @NotNull + @NotNull(message = "작성자 ID가 누락되었습니다.") Long authorId, - @NotNull + @NotNull(message = "게시판 ID가 누락되었습니다.") Long boardId, - @NotBlank - @Size(max=255) + @NotBlank(message = "제목이 누락되었습니다.") + @Size(max=255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") String title, - @NotBlank + @NotBlank(message = "본문이 누락되었습니다.") String content ) { public Article toEntity() { diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index f2dc2414..f97ebd7c 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -5,16 +5,16 @@ import jakarta.validation.constraints.Size; public record ArticleUpdateRequest ( - @NotNull + @NotNull(message = "작성자 ID가 누락되었습니다.") Long authorId, - @NotNull + @NotNull(message = "게시판 ID가 누락되었습니다.") Long boardId, - @NotBlank - @Size(max=255) + @NotBlank(message = "제목이 누락되었습니다.") + @Size(max=255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") String title, - @NotBlank + @NotBlank(message = "본문이 누락되었습니다.") String content ) { } From 6dc53a63914e4892cc74ca28198ba9828dd3318b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 11:56:00 +0900 Subject: [PATCH 093/143] =?UTF-8?q?feat.=20Board=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=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/example/bcsd/dto/request/BoardRequest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/example/bcsd/dto/request/BoardRequest.java b/src/main/java/com/example/bcsd/dto/request/BoardRequest.java index 62892405..662bd7f0 100644 --- a/src/main/java/com/example/bcsd/dto/request/BoardRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/BoardRequest.java @@ -1,8 +1,12 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Board; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public record BoardRequest( + @NotNull(message = "게시판 이름이 누락되었습니다.") + @Size(max = 100, message = "게시판 이름의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") String name ) { public Board toEntity() { From eefc560709e75def82c5dde7a5c0cbdebb1f789d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 11:56:12 +0900 Subject: [PATCH 094/143] =?UTF-8?q?feat.=20Member=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/dto/request/MemberRequest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index ed9cd433..651edf50 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -3,12 +3,21 @@ import com.example.bcsd.dto.deserializer.PasswordBcryptDeserializer; import com.example.bcsd.model.Member; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public record MemberRequest( + @NotNull(message = "이름이 누락되었습니다.") + @Size(max = 100, message = "이름의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") String name, + + @NotNull(message = "이메일이 누락되었습니다.") + @Size(max = 100, message = "이메일의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") String email, - @JsonDeserialize(using = PasswordBcryptDeserializer.class ) + @NotNull(message = "비밀번호가 누락되었습니다.") + @Size(max = 255, message = "비밀번호의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") + @JsonDeserialize(using = PasswordBcryptDeserializer.class) String password ) { public MemberRequest(String name, String email, String password) { From 3ee138aa2a0f642ba8b12d40a484f2e403669579 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 11:57:36 +0900 Subject: [PATCH 095/143] =?UTF-8?q?fix.=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/exception/GlobalExceptionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index 60ad0b41..ac731ef4 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -9,7 +9,7 @@ @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) - public ResponseEntity notFoundExceptionHandle(CustomException ex) { + public ResponseEntity ExceptionHandle(CustomException ex) { log.error(ex.getMessage()); return ResponseEntity.status( From 42ca928b8097589723ffef42b52e46fe9b506cd6 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 12:05:45 +0900 Subject: [PATCH 096/143] =?UTF-8?q?feat.=20valid=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=EC=9C=BC=EB=A1=9C=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=98=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java index ac731ef4..bd91a7e0 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java @@ -1,16 +1,21 @@ package com.example.bcsd.exception; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import java.util.List; +import java.util.stream.Collectors; + @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity ExceptionHandle(CustomException ex) { - log.error(ex.getMessage()); + log.error("[Exception] : " + ex.getMessage()); return ResponseEntity.status( ex.getExceptionMessage() @@ -18,4 +23,18 @@ public ResponseEntity ExceptionHandle(CustomException ex) { ) .body(ex.getMessage()); } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity> ExceptionHandle(MethodArgumentNotValidException ex) { + List errorMessages = ex.getBindingResult() + .getFieldErrors() + .stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.toList()); + + log.error("[Exception] : " + errorMessages.toString()); + + + return ResponseEntity.badRequest().body(errorMessages); + } } From 92e6d5dad6d7b0904333c2c8f8b1570dedfcf16e Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 14:55:12 +0900 Subject: [PATCH 097/143] =?UTF-8?q?chore.=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=8C=A8=ED=82=A4=EC=A7=80=20global=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=82=B4=EB=B6=80=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/{ => global}/exception/CustomException.java | 2 +- .../bcsd/{ => global}/exception/ExceptionMessage.java | 2 +- .../{ => global}/exception/GlobalExceptionHandler.java | 9 +++++---- .../java/com/example/bcsd/service/ArticleService.java | 4 ++-- src/main/java/com/example/bcsd/service/BoardService.java | 4 ++-- .../java/com/example/bcsd/service/MemberService.java | 4 ++-- .../com/example/bcsd/validation/ArticleValidation.java | 4 ++-- .../com/example/bcsd/validation/BoardValidation.java | 4 ++-- .../com/example/bcsd/validation/MemberValidation.java | 4 ++-- 9 files changed, 19 insertions(+), 18 deletions(-) rename src/main/java/com/example/bcsd/{ => global}/exception/CustomException.java (87%) rename src/main/java/com/example/bcsd/{ => global}/exception/ExceptionMessage.java (95%) rename src/main/java/com/example/bcsd/{ => global}/exception/GlobalExceptionHandler.java (83%) diff --git a/src/main/java/com/example/bcsd/exception/CustomException.java b/src/main/java/com/example/bcsd/global/exception/CustomException.java similarity index 87% rename from src/main/java/com/example/bcsd/exception/CustomException.java rename to src/main/java/com/example/bcsd/global/exception/CustomException.java index ef6decd2..6ed73607 100644 --- a/src/main/java/com/example/bcsd/exception/CustomException.java +++ b/src/main/java/com/example/bcsd/global/exception/CustomException.java @@ -1,4 +1,4 @@ -package com.example.bcsd.exception; +package com.example.bcsd.global.exception; import lombok.Getter; diff --git a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java similarity index 95% rename from src/main/java/com/example/bcsd/exception/ExceptionMessage.java rename to src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index d94c1f88..5123f8a5 100644 --- a/src/main/java/com/example/bcsd/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -1,4 +1,4 @@ -package com.example.bcsd.exception; +package com.example.bcsd.global.exception; import lombok.Getter; diff --git a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java similarity index 83% rename from src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java rename to src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java index bd91a7e0..d070a0af 100644 --- a/src/main/java/com/example/bcsd/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ -package com.example.bcsd.exception; +package com.example.bcsd.global.exception; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.ResponseEntity; @@ -14,8 +15,8 @@ @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) - public ResponseEntity ExceptionHandle(CustomException ex) { - log.error("[Exception] : " + ex.getMessage()); + public ResponseEntity ExceptionHandle(CustomException ex, HttpServletRequest request) { + log.error("[Exception] : {}", ex.getMessage()); return ResponseEntity.status( ex.getExceptionMessage() @@ -32,7 +33,7 @@ public ResponseEntity> ExceptionHandle(MethodArgumentNotValidExcept .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); - log.error("[Exception] : " + errorMessages.toString()); + log.error("[Exception] : {}", errorMessages.toString()); return ResponseEntity.badRequest().body(errorMessages); diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index d0238030..0bf5eb3f 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -3,8 +3,8 @@ import com.example.bcsd.dto.request.ArticleCreateRequest; import com.example.bcsd.dto.request.ArticleUpdateRequest; import com.example.bcsd.dto.resopnse.ArticleResponse; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.validation.ArticleValidation; diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index b23f8882..1dbecee6 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -2,8 +2,8 @@ import com.example.bcsd.dto.request.BoardRequest; import com.example.bcsd.dto.resopnse.BoardResponse; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.model.Board; import com.example.bcsd.repository.BoardRepository; import com.example.bcsd.validation.BoardValidation; diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 9f790bb9..e0df4cf8 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -2,8 +2,8 @@ import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; import com.example.bcsd.validation.MemberValidation; diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index cfdbbe30..103c3247 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -1,7 +1,7 @@ package com.example.bcsd.validation; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.BoardRepository; import com.example.bcsd.repository.MemberRepository; diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java index d4403b4e..349de218 100644 --- a/src/main/java/com/example/bcsd/validation/BoardValidation.java +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -1,7 +1,7 @@ package com.example.bcsd.validation; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.repository.ArticleRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java index 8fa97d30..276fbd57 100644 --- a/src/main/java/com/example/bcsd/validation/MemberValidation.java +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -1,7 +1,7 @@ package com.example.bcsd.validation; -import com.example.bcsd.exception.CustomException; -import com.example.bcsd.exception.ExceptionMessage; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; From 6ee4818107fe815fa9dc5393a5ad26f0b9d098f3 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sat, 24 May 2025 14:55:47 +0900 Subject: [PATCH 098/143] =?UTF-8?q?feat.=20POST,=20PUT=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=8B=9C=20=EC=9A=94=EC=B2=AD=20=EB=B0=94=EB=94=94?= =?UTF-8?q?=20=EB=82=B4=EC=9A=A9=EC=9D=84=20=EB=A1=9C=EA=B9=85=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=ED=95=84=ED=84=B0=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 --- .../example/bcsd/global/filter/LogFilter.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/com/example/bcsd/global/filter/LogFilter.java diff --git a/src/main/java/com/example/bcsd/global/filter/LogFilter.java b/src/main/java/com/example/bcsd/global/filter/LogFilter.java new file mode 100644 index 00000000..cb081045 --- /dev/null +++ b/src/main/java/com/example/bcsd/global/filter/LogFilter.java @@ -0,0 +1,35 @@ +package com.example.bcsd.global.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; + +import java.io.IOException; + +@Slf4j +@Component +public class LogFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request); + + log.info("-----------------------------------------"); + + filterChain.doFilter(wrappedRequest, response); + + String method = wrappedRequest.getMethod(); + + if (method.equals("POST") || method.equals("PUT")) { + String body = new String(wrappedRequest.getContentAsByteArray(), wrappedRequest.getCharacterEncoding()); + + log.info("[요청 Body] : {}", body.replaceAll("\\s{2,}", "")); + } + + log.info("-----------------------------------------"); + } +} From 1ca75681f31e56fd7ba80cdb340f6ddafc9d67d8 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 26 May 2025 16:42:18 +0900 Subject: [PATCH 099/143] =?UTF-8?q?fix.=20@Valid=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EA=B2=83=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/controller/BoardController.java | 5 +++-- .../java/com/example/bcsd/controller/MemberController.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/BoardController.java b/src/main/java/com/example/bcsd/controller/BoardController.java index 72d40b34..656a3e04 100644 --- a/src/main/java/com/example/bcsd/controller/BoardController.java +++ b/src/main/java/com/example/bcsd/controller/BoardController.java @@ -3,6 +3,7 @@ import com.example.bcsd.dto.request.BoardRequest; import com.example.bcsd.dto.resopnse.BoardResponse; import com.example.bcsd.service.BoardService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -29,7 +30,7 @@ public ResponseEntity getBoardById(@PathVariable Long id) { } @PostMapping - public ResponseEntity createBoard(@RequestBody BoardRequest request) { + public ResponseEntity createBoard(@RequestBody @Valid BoardRequest request) { return ResponseEntity .status(HttpStatus.CREATED) .body(boardService.createBoard(request)); @@ -37,7 +38,7 @@ public ResponseEntity createBoard(@RequestBody BoardRequest reque @PutMapping("/{id}") public ResponseEntity updateArticleById( - @PathVariable Long id, @RequestBody BoardRequest request + @PathVariable Long id, @RequestBody @Valid BoardRequest request ) { return ResponseEntity .ok(boardService.updateBoardById(id, request)); diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index 0461a7a9..c0862573 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -3,6 +3,7 @@ import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.service.MemberService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -28,14 +29,14 @@ public ResponseEntity getMemberById(@PathVariable Long id) { } @PostMapping() - public ResponseEntity createMember(@RequestBody MemberRequest request) { + public ResponseEntity createMember(@RequestBody @Valid MemberRequest request) { return ResponseEntity .status(HttpStatus.CREATED) .body(memberService.createMember(request)); } @PutMapping("/{id}") - public ResponseEntity updateMember(@PathVariable Long id, @RequestBody MemberRequest request) { + public ResponseEntity updateMember(@PathVariable Long id, @RequestBody @Valid MemberRequest request) { return ResponseEntity .ok(memberService.updateMember(id, request)); } From b5f1da228d103df0f97771aadeaacda9a2e8607d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 26 May 2025 16:48:19 +0900 Subject: [PATCH 100/143] =?UTF-8?q?chore.=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B3=B5=EB=B0=B1=20=EB=AC=B8=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/ArticleController.java | 2 +- .../dto/request/ArticleCreateRequest.java | 4 ++-- .../dto/request/ArticleUpdateRequest.java | 7 +++--- .../bcsd/dto/request/MemberRequest.java | 3 +++ .../bcsd/dto/resopnse/ArticleResponse.java | 2 +- .../bcsd/dto/resopnse/JsonResponse.java | 3 ++- .../exception/GlobalExceptionHandler.java | 4 ++-- .../repository/ArticleJDBCRepositoryImpl.java | 16 +++++++------- .../repository/BoardJDBCRepositoryImpl.java | 6 ++--- .../bcsd/repository/BoardRepository.java | 3 ++- .../repository/MemberJDBCRepositoryImpl.java | 10 ++++----- .../bcsd/repository/MemberRepository.java | 3 ++- .../bcsd/service/ArticleViewService.java | 22 +++++++++---------- .../example/bcsd/service/BoardService.java | 18 +++++++-------- .../bcsd/validation/BoardValidation.java | 2 +- 15 files changed, 56 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 59ac1252..8d36d783 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -27,7 +27,7 @@ public ResponseEntity> getAllArticles() { @GetMapping("/{id}") public ResponseEntity getArticleById( @PathVariable Long id - ) { + ) { return ResponseEntity .ok(articleService.getArticleById(id)); } diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index c703027a..2677b615 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -public record ArticleCreateRequest ( +public record ArticleCreateRequest( @NotNull(message = "작성자 ID가 누락되었습니다.") Long authorId, @@ -13,7 +13,7 @@ public record ArticleCreateRequest ( Long boardId, @NotBlank(message = "제목이 누락되었습니다.") - @Size(max=255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") + @Size(max = 255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") String title, @NotBlank(message = "본문이 누락되었습니다.") diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index f97ebd7c..99a5b144 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -public record ArticleUpdateRequest ( +public record ArticleUpdateRequest( @NotNull(message = "작성자 ID가 누락되었습니다.") Long authorId, @@ -12,9 +12,10 @@ public record ArticleUpdateRequest ( Long boardId, @NotBlank(message = "제목이 누락되었습니다.") - @Size(max=255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") + @Size(max = 255, message = "제목의 최대 길이를 벗어났습니다. (최대 길이 : 255자)") String title, @NotBlank(message = "본문이 누락되었습니다.") String content -) { } +) { +} diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index 651edf50..de9d14c4 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -3,6 +3,7 @@ import com.example.bcsd.dto.deserializer.PasswordBcryptDeserializer; import com.example.bcsd.model.Member; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -13,6 +14,7 @@ public record MemberRequest( @NotNull(message = "이메일이 누락되었습니다.") @Size(max = 100, message = "이메일의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") + @Email String email, @NotNull(message = "비밀번호가 누락되었습니다.") @@ -25,6 +27,7 @@ public MemberRequest(String name, String email, String password) { this.email = email; this.password = password; } + public Member toEntity() { return Member.builder() .name(name) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index da7c9be8..dbc4dd4d 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; @Builder -public record ArticleResponse ( +public record ArticleResponse( Long id, String title, Long authorId, diff --git a/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java index fe71c9e4..fbb9d69f 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/JsonResponse.java @@ -3,4 +3,5 @@ public record JsonResponse( int age, String name -) { } +) { +} diff --git a/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java index d070a0af..081cc478 100644 --- a/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java @@ -19,8 +19,8 @@ public ResponseEntity ExceptionHandle(CustomException ex, HttpServletReq log.error("[Exception] : {}", ex.getMessage()); return ResponseEntity.status( - ex.getExceptionMessage() - .getStatus() + ex.getExceptionMessage() + .getStatus() ) .body(ex.getMessage()); } diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java index faeb9a5c..75407950 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java @@ -89,14 +89,14 @@ public void delete(Long id) { private RowMapper
articleRowMapper() { return ((rs, rowNum) -> { return Article.builder() - .id(rs.getLong("id")) - .authorId(rs.getLong("author_id")) - .boardId(rs.getLong("board_id")) - .title(rs.getString("title")) - .content(rs.getString("content")) - .createdAt(rs.getTimestamp("created_at").toLocalDateTime()) - .updatedAt(rs.getTimestamp("updated_at").toLocalDateTime()) - .build(); + .id(rs.getLong("id")) + .authorId(rs.getLong("author_id")) + .boardId(rs.getLong("board_id")) + .title(rs.getString("title")) + .content(rs.getString("content")) + .createdAt(rs.getTimestamp("created_at").toLocalDateTime()) + .updatedAt(rs.getTimestamp("updated_at").toLocalDateTime()) + .build(); }); } } diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java index 1c506ef8..380221b3 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java @@ -78,9 +78,9 @@ public void delete(Long id) { private RowMapper boardRowMapper() { return ((rs, rowNum) -> { return Board.builder() - .id(rs.getLong("id")) - .name(rs.getString("name")) - .build(); + .id(rs.getLong("id")) + .name(rs.getString("name")) + .build(); }); } } diff --git a/src/main/java/com/example/bcsd/repository/BoardRepository.java b/src/main/java/com/example/bcsd/repository/BoardRepository.java index 777b3c9b..78a5845a 100644 --- a/src/main/java/com/example/bcsd/repository/BoardRepository.java +++ b/src/main/java/com/example/bcsd/repository/BoardRepository.java @@ -2,4 +2,5 @@ import com.example.bcsd.model.Board; -public interface BoardRepository extends CRUDRepository { } +public interface BoardRepository extends CRUDRepository { +} diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java index 780a0e88..4a5d3798 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java @@ -82,11 +82,11 @@ public void delete(Long id) { private RowMapper memberRowMapper() { return ((rs, rowNum) -> { return Member.builder() - .id(rs.getLong("id")) - .name(rs.getString("name")) - .email(rs.getString("email")) - .password(rs.getString("password")) - .build(); + .id(rs.getLong("id")) + .name(rs.getString("name")) + .email(rs.getString("email")) + .password(rs.getString("password")) + .build(); }); } } diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index b883cd7b..ffcf6442 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -2,4 +2,5 @@ import com.example.bcsd.model.Member; -public interface MemberRepository extends CRUDRepository { } +public interface MemberRepository extends CRUDRepository { +} diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index dc47d2ed..a25b1ea9 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -40,16 +40,16 @@ public Map> getAllPostViewsByBoardId(Long boar private Map> convertToViewResponse(List
articles) { return articles.stream() - .map(article -> - ArticleViewResponse.fromEntity( - article, - memberRepository.findById(article.getAuthorId()) - .map(Member::getName) - .orElse("알 수 없음"), - boardRepository.findById(article.getBoardId()) - .map(Board::getName) - .orElse("알 수 없음") - ) - ).collect(Collectors.groupingBy(ArticleViewResponse::board)); + .map(article -> + ArticleViewResponse.fromEntity( + article, + memberRepository.findById(article.getAuthorId()) + .map(Member::getName) + .orElse("알 수 없음"), + boardRepository.findById(article.getBoardId()) + .map(Board::getName) + .orElse("알 수 없음") + ) + ).collect(Collectors.groupingBy(ArticleViewResponse::board)); } } diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index 1dbecee6..953e060d 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -22,18 +22,18 @@ public class BoardService { @Transactional(readOnly = true) public List getAllBoards() { return boardRepository.findAll() - .stream() - .map(BoardResponse::fromEntity) - .toList(); + .stream() + .map(BoardResponse::fromEntity) + .toList(); } @Transactional(readOnly = true) public BoardResponse getBoardById(Long id) { return BoardResponse.fromEntity( boardRepository.findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.BOARD_NOT_FOUND) - ) + .orElseThrow(() -> + new CustomException(ExceptionMessage.BOARD_NOT_FOUND) + ) ); } @@ -65,9 +65,9 @@ public void deleteBoardById(Long id) { boardValidation.validateBoardHasNoArticles(id); boardRepository.findById(id) - .orElseThrow(() -> - new CustomException(ExceptionMessage.BOARD_NOT_FOUND) - ); + .orElseThrow(() -> + new CustomException(ExceptionMessage.BOARD_NOT_FOUND) + ); boardRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java index 349de218..689e5094 100644 --- a/src/main/java/com/example/bcsd/validation/BoardValidation.java +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -12,7 +12,7 @@ public class BoardValidation { private final ArticleRepository articleRepository; public void validateBoardHasNoArticles(Long boardId) { - if(!articleRepository.findAllByBoardId(boardId).isEmpty()) + if (!articleRepository.findAllByBoardId(boardId).isEmpty()) throw new CustomException(ExceptionMessage.BOARD_HAS_ARTICLES); } } From e4b600220a9251969bc02ad878d6548c7954c8fc Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 28 May 2025 10:32:18 +0900 Subject: [PATCH 101/143] =?UTF-8?q?build.=20JPA=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 735199d8..b0f772ae 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' runtimeOnly 'com.mysql:mysql-connector-j:8.2.0' implementation 'org.mindrot:jbcrypt:0.4' + implementation("org.springframework.boot:spring-boot-starter-data-jpa") } tasks.named('test') { useJUnitPlatform() From 02b2dbd0638ea08ab2628d13a070bdcd0bae0b16 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 28 May 2025 10:33:57 +0900 Subject: [PATCH 102/143] =?UTF-8?q?chore.=20Repository=20=EC=A2=85?= =?UTF-8?q?=EB=A5=98(jdbc,=20jpa,=20=EC=9D=B8=EB=A9=94=EB=AA=A8=EB=A6=AC)?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B6=84=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/repository/{ => jdbc}/ArticleJDBCRepositoryImpl.java | 3 ++- .../bcsd/repository/{ => jdbc}/BoardJDBCRepositoryImpl.java | 3 ++- .../bcsd/repository/{ => jdbc}/MemberJDBCRepositoryImpl.java | 3 ++- .../bcsd/repository/{ => memory}/ArticleRepositoryImpl.java | 3 ++- .../bcsd/repository/{ => memory}/MemberRepositoryImpl.java | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) rename src/main/java/com/example/bcsd/repository/{ => jdbc}/ArticleJDBCRepositoryImpl.java (96%) rename src/main/java/com/example/bcsd/repository/{ => jdbc}/BoardJDBCRepositoryImpl.java (95%) rename src/main/java/com/example/bcsd/repository/{ => jdbc}/MemberJDBCRepositoryImpl.java (96%) rename src/main/java/com/example/bcsd/repository/{ => memory}/ArticleRepositoryImpl.java (91%) rename src/main/java/com/example/bcsd/repository/{ => memory}/MemberRepositoryImpl.java (90%) diff --git a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java similarity index 96% rename from src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java rename to src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java index 75407950..43816cb0 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java @@ -1,6 +1,7 @@ -package com.example.bcsd.repository; +package com.example.bcsd.repository.jdbc; import com.example.bcsd.model.Article; +import com.example.bcsd.repository.ArticleRepository; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java similarity index 95% rename from src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java rename to src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java index 380221b3..5dfb9a33 100644 --- a/src/main/java/com/example/bcsd/repository/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java @@ -1,6 +1,7 @@ -package com.example.bcsd.repository; +package com.example.bcsd.repository.jdbc; import com.example.bcsd.model.Board; +import com.example.bcsd.repository.BoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java similarity index 96% rename from src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java rename to src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java index 4a5d3798..b6878564 100644 --- a/src/main/java/com/example/bcsd/repository/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java @@ -1,6 +1,7 @@ -package com.example.bcsd.repository; +package com.example.bcsd.repository.jdbc; import com.example.bcsd.model.Member; +import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java similarity index 91% rename from src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java rename to src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java index eb8d5274..113cfea0 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java @@ -1,6 +1,7 @@ -package com.example.bcsd.repository; +package com.example.bcsd.repository.memory; import com.example.bcsd.model.Article; +import com.example.bcsd.repository.ArticleRepository; import java.util.*; import java.util.concurrent.atomic.AtomicLong; diff --git a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java similarity index 90% rename from src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java rename to src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java index 0cace3a3..b460bec6 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java @@ -1,6 +1,7 @@ -package com.example.bcsd.repository; +package com.example.bcsd.repository.memory; import com.example.bcsd.model.Member; +import com.example.bcsd.repository.MemberRepository; import java.util.*; import java.util.concurrent.atomic.AtomicLong; From ecf925ae735b0b74b5b3c78e0856380a040a0591 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 28 May 2025 10:39:59 +0900 Subject: [PATCH 103/143] =?UTF-8?q?feat.=20jpa=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20Repository=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/ArticleJPARepositoryImpl.java | 39 +++++++++++++++++++ .../jpa/BoardJPARepositoryImpl.java | 34 ++++++++++++++++ .../jpa/MemberJPARepositoryImpl.java | 34 ++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java create mode 100644 src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java create mode 100644 src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java diff --git a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java new file mode 100644 index 00000000..c40e635c --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java @@ -0,0 +1,39 @@ +package com.example.bcsd.repository.jpa; + +import com.example.bcsd.model.Article; +import com.example.bcsd.repository.ArticleRepository; + +import java.util.List; +import java.util.Optional; + +public class ArticleJPARepositoryImpl implements ArticleRepository { + @Override + public List
findAllByBoardId(Long boardId) { + return List.of(); + } + + @Override + public List
findAll() { + return List.of(); + } + + @Override + public Optional
findById(Long aLong) { + return Optional.empty(); + } + + @Override + public Article save(Article entity) { + return null; + } + + @Override + public Article save(Long aLong, Article entity) { + return null; + } + + @Override + public void delete(Long aLong) { + + } +} diff --git a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java new file mode 100644 index 00000000..f024ea8d --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java @@ -0,0 +1,34 @@ +package com.example.bcsd.repository.jpa; + +import com.example.bcsd.model.Board; +import com.example.bcsd.repository.BoardRepository; + +import java.util.List; +import java.util.Optional; + +public class BoardJPARepositoryImpl implements BoardRepository { + @Override + public List findAll() { + return List.of(); + } + + @Override + public Optional findById(Long aLong) { + return Optional.empty(); + } + + @Override + public Board save(Board entity) { + return null; + } + + @Override + public Board save(Long aLong, Board entity) { + return null; + } + + @Override + public void delete(Long aLong) { + + } +} diff --git a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java new file mode 100644 index 00000000..d2462f94 --- /dev/null +++ b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java @@ -0,0 +1,34 @@ +package com.example.bcsd.repository.jpa; + +import com.example.bcsd.model.Member; +import com.example.bcsd.repository.MemberRepository; + +import java.util.List; +import java.util.Optional; + +public class MemberJPARepositoryImpl implements MemberRepository { + @Override + public List findAll() { + return List.of(); + } + + @Override + public Optional findById(Long aLong) { + return Optional.empty(); + } + + @Override + public Member save(Member entity) { + return null; + } + + @Override + public Member save(Long aLong, Member entity) { + return null; + } + + @Override + public void delete(Long aLong) { + + } +} From caa96d60b58fb6101c22915c838af2512424524c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 28 May 2025 13:42:47 +0900 Subject: [PATCH 104/143] =?UTF-8?q?feat.=20JPA=20=EB=8F=84=EC=9E=85?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/model/Article.java | 26 ++++++++++++++----- .../java/com/example/bcsd/model/Board.java | 12 ++++++--- .../java/com/example/bcsd/model/Member.java | 15 ++++++++--- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 0fa7093c..7a6cfe2d 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,24 +1,38 @@ package com.example.bcsd.model; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; @Getter @Builder @AllArgsConstructor +@NoArgsConstructor +@Entity public class Article { - @Setter + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column private String title; + + @Column private Long authorId; + + @Column private Long boardId; + + @Column private String content; - private final LocalDateTime createdAt; + + @Column + @CreationTimestamp + private LocalDateTime createdAt; + + @Column private LocalDateTime updatedAt; diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index eea1b37a..1aec6f07 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -1,15 +1,19 @@ package com.example.bcsd.model; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import jakarta.persistence.*; +import lombok.*; @Builder @Getter +@AllArgsConstructor +@NoArgsConstructor +@Entity public class Board { - @Setter + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column private String name; public Board updateBoardName(String name) { diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 272f5fa1..5818301e 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,19 +1,26 @@ package com.example.bcsd.model; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import jakarta.persistence.*; +import lombok.*; @Getter @Builder @AllArgsConstructor +@NoArgsConstructor +@Entity public class Member { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Setter private Long id; + @Column private String name; + + @Column private String email; + + @Column private String password; public Member updatePersonalInformation(String name, String email, String password) { From 7018d45a15fa8c269e9b38af2a3570f4230b69d5 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 14:23:48 +0900 Subject: [PATCH 105/143] =?UTF-8?q?chore.=20JPA=20=EB=8F=84=EC=9E=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EC=A0=84=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=EC=9D=98=20Repository=20=EC=BD=94=EB=93=9C=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jdbc/ArticleJDBCRepositoryImpl.java | 206 +++++++++--------- .../jdbc/BoardJDBCRepositoryImpl.java | 174 +++++++-------- .../jdbc/MemberJDBCRepositoryImpl.java | 186 ++++++++-------- .../memory/ArticleRepositoryImpl.java | 98 ++++----- .../memory/MemberRepositoryImpl.java | 88 ++++---- 5 files changed, 376 insertions(+), 376 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java index 43816cb0..6be89c5b 100644 --- a/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/ArticleJDBCRepositoryImpl.java @@ -1,103 +1,103 @@ -package com.example.bcsd.repository.jdbc; - -import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; -import java.util.List; -import java.util.Optional; - -@RequiredArgsConstructor -@Repository -public class ArticleJDBCRepositoryImpl implements ArticleRepository { - private final JdbcTemplate jdbcTemplate; - - @Override - public List
findAll() { - String sql = "SELECT * FROM Article"; - - return jdbcTemplate.query(sql, articleRowMapper()); - } - - @Override - public Optional
findById(Long id) { - String sql = "SELECT * FROM Article WHERE id = ?"; - - return jdbcTemplate.query( - sql, - articleRowMapper(), - id - ) - .stream() - .findFirst(); - } - - public List
findAllByBoardId(Long boardId) { - String sql = "SELECT * FROM Article WHERE board_id = ?"; - - return jdbcTemplate.query(sql, articleRowMapper(), boardId); - } - - @Override - public Article save(Article article) { - String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; - KeyHolder keyHolder = new GeneratedKeyHolder(); - - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); - - ps.setLong(1, article.getAuthorId()); - ps.setLong(2, article.getBoardId()); - ps.setString(3, article.getTitle()); - ps.setString(4, article.getContent()); - - return ps; - }, keyHolder); - - Long id = keyHolder.getKey().longValue(); - article.setId(id); - - return findById(id).get(); - } - - @Override - public Article save(Long id, Article article) { - String sql = "UPDATE Article SET title = ?, content = ? WHERE id = ?"; - - jdbcTemplate.update( - sql, - article.getTitle(), - article.getContent(), - id - ); - - return article; - } - - @Override - public void delete(Long id) { - String sql = "DELETE from Article WHERE id = ?"; - - jdbcTemplate.update(sql, id); - } - - private RowMapper
articleRowMapper() { - return ((rs, rowNum) -> { - return Article.builder() - .id(rs.getLong("id")) - .authorId(rs.getLong("author_id")) - .boardId(rs.getLong("board_id")) - .title(rs.getString("title")) - .content(rs.getString("content")) - .createdAt(rs.getTimestamp("created_at").toLocalDateTime()) - .updatedAt(rs.getTimestamp("updated_at").toLocalDateTime()) - .build(); - }); - } -} +//package com.example.bcsd.repository.jdbc; +// +//import com.example.bcsd.model.Article; +//import com.example.bcsd.repository.ArticleRepository; +//import lombok.RequiredArgsConstructor; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.jdbc.core.RowMapper; +//import org.springframework.jdbc.support.GeneratedKeyHolder; +//import org.springframework.jdbc.support.KeyHolder; +//import org.springframework.stereotype.Repository; +// +//import java.sql.PreparedStatement; +//import java.util.List; +//import java.util.Optional; +// +//@RequiredArgsConstructor +//@Repository +//public class ArticleJDBCRepositoryImpl implements ArticleRepository { +// private final JdbcTemplate jdbcTemplate; +// +// @Override +// public List
findAll() { +// String sql = "SELECT * FROM Article"; +// +// return jdbcTemplate.query(sql, articleRowMapper()); +// } +// +// @Override +// public Optional
findById(Long id) { +// String sql = "SELECT * FROM Article WHERE id = ?"; +// +// return jdbcTemplate.query( +// sql, +// articleRowMapper(), +// id +// ) +// .stream() +// .findFirst(); +// } +// +// public List
findAllByBoardId(Long boardId) { +// String sql = "SELECT * FROM Article WHERE board_id = ?"; +// +// return jdbcTemplate.query(sql, articleRowMapper(), boardId); +// } +// +// @Override +// public Article save(Article article) { +// String sql = "INSERT INTO Article (author_id, board_id, title, content) VALUES (?, ?, ?, ?)"; +// KeyHolder keyHolder = new GeneratedKeyHolder(); +// +// jdbcTemplate.update(connection -> { +// PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); +// +// ps.setLong(1, article.getAuthorId()); +// ps.setLong(2, article.getBoardId()); +// ps.setString(3, article.getTitle()); +// ps.setString(4, article.getContent()); +// +// return ps; +// }, keyHolder); +// +// Long id = keyHolder.getKey().longValue(); +// article.setId(id); +// +// return findById(id).get(); +// } +// +// @Override +// public Article save(Long id, Article article) { +// String sql = "UPDATE Article SET title = ?, content = ? WHERE id = ?"; +// +// jdbcTemplate.update( +// sql, +// article.getTitle(), +// article.getContent(), +// id +// ); +// +// return article; +// } +// +// @Override +// public void delete(Long id) { +// String sql = "DELETE from Article WHERE id = ?"; +// +// jdbcTemplate.update(sql, id); +// } +// +// private RowMapper
articleRowMapper() { +// return ((rs, rowNum) -> { +// return Article.builder() +// .id(rs.getLong("id")) +// .authorId(rs.getLong("author_id")) +// .boardId(rs.getLong("board_id")) +// .title(rs.getString("title")) +// .content(rs.getString("content")) +// .createdAt(rs.getTimestamp("created_at").toLocalDateTime()) +// .updatedAt(rs.getTimestamp("updated_at").toLocalDateTime()) +// .build(); +// }); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java index 5dfb9a33..b3d17200 100644 --- a/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/BoardJDBCRepositoryImpl.java @@ -1,87 +1,87 @@ -package com.example.bcsd.repository.jdbc; - -import com.example.bcsd.model.Board; -import com.example.bcsd.repository.BoardRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; -import java.util.List; -import java.util.Optional; - -@Repository -@RequiredArgsConstructor -public class BoardJDBCRepositoryImpl implements BoardRepository { - private final JdbcTemplate jdbcTemplate; - - @Override - public List findAll() { - String sql = "SELECT * FROM Board"; - - return jdbcTemplate.query(sql, boardRowMapper()); - } - - @Override - public Optional findById(Long id) { - String sql = "SELECT * FROM Board WHERE id = ?"; - - return jdbcTemplate.query( - sql, - boardRowMapper(), - id - ) - .stream() - .findFirst(); - } - - @Override - public Board save(Board board) { - String sql = "INSERT INTO Board (name) VALUES (?)"; - - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); - - ps.setString(1, board.getName()); - - return ps; - }, keyHolder); - - board.setId(keyHolder.getKey().longValue()); - - return board; - } - - @Override - public Board save(Long id, Board board) { - String sql = "UPDATE Board SET name = ? WHERE id = ?"; - - jdbcTemplate.update( - sql, - board.getName(), - id - ); - - return board; - } - - @Override - public void delete(Long id) { - String sql = "DELETE from Board WHERE id = ?"; - - jdbcTemplate.update(sql, id); - } - - private RowMapper boardRowMapper() { - return ((rs, rowNum) -> { - return Board.builder() - .id(rs.getLong("id")) - .name(rs.getString("name")) - .build(); - }); - } -} +//package com.example.bcsd.repository.jdbc; +// +//import com.example.bcsd.model.Board; +//import com.example.bcsd.repository.BoardRepository; +//import lombok.RequiredArgsConstructor; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.jdbc.core.RowMapper; +//import org.springframework.jdbc.support.GeneratedKeyHolder; +//import org.springframework.jdbc.support.KeyHolder; +//import org.springframework.stereotype.Repository; +// +//import java.sql.PreparedStatement; +//import java.util.List; +//import java.util.Optional; +// +//@Repository +//@RequiredArgsConstructor +//public class BoardJDBCRepositoryImpl implements BoardRepository { +// private final JdbcTemplate jdbcTemplate; +// +// @Override +// public List findAll() { +// String sql = "SELECT * FROM Board"; +// +// return jdbcTemplate.query(sql, boardRowMapper()); +// } +// +// @Override +// public Optional findById(Long id) { +// String sql = "SELECT * FROM Board WHERE id = ?"; +// +// return jdbcTemplate.query( +// sql, +// boardRowMapper(), +// id +// ) +// .stream() +// .findFirst(); +// } +// +// @Override +// public Board save(Board board) { +// String sql = "INSERT INTO Board (name) VALUES (?)"; +// +// KeyHolder keyHolder = new GeneratedKeyHolder(); +// jdbcTemplate.update(connection -> { +// PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); +// +// ps.setString(1, board.getName()); +// +// return ps; +// }, keyHolder); +// +// board.setId(keyHolder.getKey().longValue()); +// +// return board; +// } +// +// @Override +// public Board save(Long id, Board board) { +// String sql = "UPDATE Board SET name = ? WHERE id = ?"; +// +// jdbcTemplate.update( +// sql, +// board.getName(), +// id +// ); +// +// return board; +// } +// +// @Override +// public void delete(Long id) { +// String sql = "DELETE from Board WHERE id = ?"; +// +// jdbcTemplate.update(sql, id); +// } +// +// private RowMapper boardRowMapper() { +// return ((rs, rowNum) -> { +// return Board.builder() +// .id(rs.getLong("id")) +// .name(rs.getString("name")) +// .build(); +// }); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java index b6878564..43064523 100644 --- a/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jdbc/MemberJDBCRepositoryImpl.java @@ -1,93 +1,93 @@ -package com.example.bcsd.repository.jdbc; - -import com.example.bcsd.model.Member; -import com.example.bcsd.repository.MemberRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; -import java.util.List; -import java.util.Optional; - -@Repository -@RequiredArgsConstructor -public class MemberJDBCRepositoryImpl implements MemberRepository { - private final JdbcTemplate jdbcTemplate; - - @Override - public List findAll() { - String sql = "SELECT * FROM Member"; - - return jdbcTemplate.query(sql, memberRowMapper()); - } - - @Override - public Optional findById(Long id) { - String sql = "SELECT * FROM Member WHERE id = ?"; - - return jdbcTemplate.query( - sql, - memberRowMapper(), - id - ) - .stream() - .findFirst(); - } - - @Override - public Member save(Member member) { - String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; - KeyHolder keyHolder = new GeneratedKeyHolder(); - - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); - - ps.setString(1, member.getName()); - ps.setString(2, member.getEmail()); - ps.setString(3, member.getPassword()); - - return ps; - }, keyHolder); - - member.setId(keyHolder.getKey().longValue()); - - return member; - } - - @Override - public Member save(Long id, Member member) { - String sql = "UPDATE Member SET name = ?, email = ?, password = ? WHERE id = ?"; - - jdbcTemplate.update( - sql, - member.getName(), - member.getEmail(), - member.getPassword(), - id - ); - - return member; - } - - @Override - public void delete(Long id) { - String sql = "DELETE from Member WHERE id = ?"; - - jdbcTemplate.update(sql, id); - } - - private RowMapper memberRowMapper() { - return ((rs, rowNum) -> { - return Member.builder() - .id(rs.getLong("id")) - .name(rs.getString("name")) - .email(rs.getString("email")) - .password(rs.getString("password")) - .build(); - }); - } -} +//package com.example.bcsd.repository.jdbc; +// +//import com.example.bcsd.model.Member; +//import com.example.bcsd.repository.MemberRepository; +//import lombok.RequiredArgsConstructor; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.jdbc.core.RowMapper; +//import org.springframework.jdbc.support.GeneratedKeyHolder; +//import org.springframework.jdbc.support.KeyHolder; +//import org.springframework.stereotype.Repository; +// +//import java.sql.PreparedStatement; +//import java.util.List; +//import java.util.Optional; +// +//@Repository +//@RequiredArgsConstructor +//public class MemberJDBCRepositoryImpl implements MemberRepository { +// private final JdbcTemplate jdbcTemplate; +// +// @Override +// public List findAll() { +// String sql = "SELECT * FROM Member"; +// +// return jdbcTemplate.query(sql, memberRowMapper()); +// } +// +// @Override +// public Optional findById(Long id) { +// String sql = "SELECT * FROM Member WHERE id = ?"; +// +// return jdbcTemplate.query( +// sql, +// memberRowMapper(), +// id +// ) +// .stream() +// .findFirst(); +// } +// +// @Override +// public Member save(Member member) { +// String sql = "INSERT INTO Member (name, email, password) VALUES (?, ?, ?)"; +// KeyHolder keyHolder = new GeneratedKeyHolder(); +// +// jdbcTemplate.update(connection -> { +// PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); +// +// ps.setString(1, member.getName()); +// ps.setString(2, member.getEmail()); +// ps.setString(3, member.getPassword()); +// +// return ps; +// }, keyHolder); +// +// member.setId(keyHolder.getKey().longValue()); +// +// return member; +// } +// +// @Override +// public Member save(Long id, Member member) { +// String sql = "UPDATE Member SET name = ?, email = ?, password = ? WHERE id = ?"; +// +// jdbcTemplate.update( +// sql, +// member.getName(), +// member.getEmail(), +// member.getPassword(), +// id +// ); +// +// return member; +// } +// +// @Override +// public void delete(Long id) { +// String sql = "DELETE from Member WHERE id = ?"; +// +// jdbcTemplate.update(sql, id); +// } +// +// private RowMapper memberRowMapper() { +// return ((rs, rowNum) -> { +// return Member.builder() +// .id(rs.getLong("id")) +// .name(rs.getString("name")) +// .email(rs.getString("email")) +// .password(rs.getString("password")) +// .build(); +// }); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java index 113cfea0..6499168c 100644 --- a/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/memory/ArticleRepositoryImpl.java @@ -1,49 +1,49 @@ -package com.example.bcsd.repository.memory; - -import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepository; - -import java.util.*; -import java.util.concurrent.atomic.AtomicLong; - -public class ArticleRepositoryImpl implements ArticleRepository { - private final AtomicLong key = new AtomicLong(1); - private final Map articles = new HashMap<>(); - - public List
findAll() { - List
result = new ArrayList<>(); - - articles.forEach((id, article) -> - result.add(article)); - - return result; - } - - public Optional
findById(Long id) { - Article article = articles.get(id); - - return Optional.ofNullable(article); - } - - @Override - public List
findAllByBoardId(Long BoardId) { - return List.of(); - } - - public Article save(Article article) { - article.setId(key.get()); - articles.put(key.getAndIncrement(), article); - - return article; - } - - public Article save(Long id, Article article) { - articles.put(id, article); - - return article; - } - - public void delete(Long id) { - articles.remove(id); - } -} +//package com.example.bcsd.repository.memory; +// +//import com.example.bcsd.model.Article; +//import com.example.bcsd.repository.ArticleRepository; +// +//import java.util.*; +//import java.util.concurrent.atomic.AtomicLong; +// +//public class ArticleRepositoryImpl implements ArticleRepository { +// private final AtomicLong key = new AtomicLong(1); +// private final Map articles = new HashMap<>(); +// +// public List
findAll() { +// List
result = new ArrayList<>(); +// +// articles.forEach((id, article) -> +// result.add(article)); +// +// return result; +// } +// +// public Optional
findById(Long id) { +// Article article = articles.get(id); +// +// return Optional.ofNullable(article); +// } +// +// @Override +// public List
findAllByBoardId(Long BoardId) { +// return List.of(); +// } +// +// public Article save(Article article) { +// article.setId(key.get()); +// articles.put(key.getAndIncrement(), article); +// +// return article; +// } +// +// public Article save(Long id, Article article) { +// articles.put(id, article); +// +// return article; +// } +// +// public void delete(Long id) { +// articles.remove(id); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java b/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java index b460bec6..48007bae 100644 --- a/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/memory/MemberRepositoryImpl.java @@ -1,44 +1,44 @@ -package com.example.bcsd.repository.memory; - -import com.example.bcsd.model.Member; -import com.example.bcsd.repository.MemberRepository; - -import java.util.*; -import java.util.concurrent.atomic.AtomicLong; - -public class MemberRepositoryImpl implements MemberRepository { - private final AtomicLong key = new AtomicLong(1); - private final Map members = new HashMap<>(); - - public List findAll() { - List result = new ArrayList<>(); - - members.forEach((id, member) -> - result.add(member)); - - return result; - } - - public Optional findById(Long id) { - Member member = members.get(id); - - return Optional.ofNullable(member); - } - - public Member save(Member member) { - member.setId(key.get()); - members.put(key.getAndIncrement(), member); - - return member; - } - - public Member save(Long id, Member member) { - members.put(id, member); - - return member; - } - - public void delete(Long id) { - members.remove(id); - } -} +//package com.example.bcsd.repository.memory; +// +//import com.example.bcsd.model.Member; +//import com.example.bcsd.repository.MemberRepository; +// +//import java.util.*; +//import java.util.concurrent.atomic.AtomicLong; +// +//public class MemberRepositoryImpl implements MemberRepository { +// private final AtomicLong key = new AtomicLong(1); +// private final Map members = new HashMap<>(); +// +// public List findAll() { +// List result = new ArrayList<>(); +// +// members.forEach((id, member) -> +// result.add(member)); +// +// return result; +// } +// +// public Optional findById(Long id) { +// Member member = members.get(id); +// +// return Optional.ofNullable(member); +// } +// +// public Member save(Member member) { +// member.setId(key.get()); +// members.put(key.getAndIncrement(), member); +// +// return member; +// } +// +// public Member save(Long id, Member member) { +// members.put(id, member); +// +// return member; +// } +// +// public void delete(Long id) { +// members.remove(id); +// } +//} From 16912f4aedeb3829f7be17a83a2bddf371b1e0ed Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 14:25:18 +0900 Subject: [PATCH 106/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20J?= =?UTF-8?q?PA=20Repository=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/ArticleJPARepositoryImpl.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java index c40e635c..aae6ef5f 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java @@ -2,38 +2,54 @@ import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +@Repository public class ArticleJPARepositoryImpl implements ArticleRepository { + @PersistenceContext + private EntityManager entityManager; + @Override public List
findAllByBoardId(Long boardId) { - return List.of(); + return entityManager + .createQuery("SELECT a FROM Article a WHERE boardId = :boardId", Article.class) + .setParameter("boardId", boardId) + .getResultList(); } @Override public List
findAll() { - return List.of(); + return entityManager + .createQuery("SELECT a FROM Article a", Article.class) + .getResultList(); } @Override - public Optional
findById(Long aLong) { - return Optional.empty(); + public Optional
findById(Long id) { + return Optional.ofNullable(entityManager.find(Article.class, id)); } @Override public Article save(Article entity) { - return null; + entityManager.persist(entity); + + return entity; } @Override - public Article save(Long aLong, Article entity) { + public Article save(Long id, Article entity) { return null; } @Override - public void delete(Long aLong) { + public void delete(Long id) { + Article article = entityManager.find(Article.class, id); + entityManager.remove(id); } } From 327a6edd86046348001c59e1aaa481a1213fb48b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 14:25:32 +0900 Subject: [PATCH 107/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20J?= =?UTF-8?q?PA=20Repository=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/BoardJPARepositoryImpl.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java index f024ea8d..3e804313 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java @@ -2,33 +2,46 @@ import com.example.bcsd.model.Board; import com.example.bcsd.repository.BoardRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +@Repository public class BoardJPARepositoryImpl implements BoardRepository { + @PersistenceContext + private EntityManager entityManager; + @Override public List findAll() { - return List.of(); + return entityManager + .createQuery("SELECT b FROM Board b", Board.class) + .getResultList(); } @Override - public Optional findById(Long aLong) { - return Optional.empty(); + public Optional findById(Long id) { + return Optional.ofNullable(entityManager.find(Board.class, id)); } @Override public Board save(Board entity) { - return null; + entityManager.persist(entity); + + return entity; } @Override - public Board save(Long aLong, Board entity) { + public Board save(Long id, Board entity) { return null; } @Override - public void delete(Long aLong) { + public void delete(Long id) { + Board board = entityManager.find(Board.class, id); + entityManager.remove(id); } } From 9ab2b2dff538863c7a1efe3c8180cfb9ed717f4b Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 14:25:46 +0900 Subject: [PATCH 108/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20JPA=20Repo?= =?UTF-8?q?sitory=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/MemberJPARepositoryImpl.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java index d2462f94..39d68b18 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java @@ -2,33 +2,44 @@ import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +@Repository public class MemberJPARepositoryImpl implements MemberRepository { + @PersistenceContext + private EntityManager entityManager; + @Override public List findAll() { - return List.of(); + return entityManager + .createQuery("SELECT m FROM Member m", Member.class) + .getResultList(); } @Override - public Optional findById(Long aLong) { - return Optional.empty(); + public Optional findById(Long id) { + return Optional.ofNullable(entityManager.find(Member.class, id)); } @Override public Member save(Member entity) { - return null; + entityManager.persist(entity); + + return entity; } @Override - public Member save(Long aLong, Member entity) { + public Member save(Long id, Member entity) { return null; } @Override - public void delete(Long aLong) { - + public void delete(Long id) { + entityManager.remove(id); } } From 284aa6a97508913a02fbeef2fb4376a05e037398 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 14:52:39 +0900 Subject: [PATCH 109/143] =?UTF-8?q?refactory.=20JPA=20Dirty=20Check=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=9C=BC=EB=A1=9C=20Repository=EC=9D=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=EC=9D=B4=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=86=EC=96=B4=EC=84=9C=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/example/bcsd/service/ArticleService.java | 4 +--- src/main/java/com/example/bcsd/service/BoardService.java | 4 +--- src/main/java/com/example/bcsd/service/MemberService.java | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 0bf5eb3f..34ee8bbd 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -68,9 +68,7 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) .get() .updateDetails(request.authorId(), request.boardId(), request.title(), request.content()); - return ArticleResponse.fromEntity( - articleRepository.save(id, article) - ); + return ArticleResponse.fromEntity(article); } @Transactional diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index 953e060d..4eaa0bab 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -55,9 +55,7 @@ public BoardResponse updateBoardById(Long id, BoardRequest request) { ) .updateBoardName(request.name()); - return BoardResponse.fromEntity( - boardRepository.save(id, board) - ); + return BoardResponse.fromEntity(board); } @Transactional diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index e0df4cf8..2ed09c0a 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -57,9 +57,7 @@ public MemberResponse updateMember(Long id, MemberRequest request) { .get() .updatePersonalInformation(request.name(), request.email(), request.password()); - return MemberResponse.fromEntity( - memberRepository.save(id, member) - ); + return MemberResponse.fromEntity(member); } @Transactional From 04fdb160fe246d2b9f109fb6ae0bd9451c4855ca Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 15:01:10 +0900 Subject: [PATCH 110/143] =?UTF-8?q?feat.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=A4=91=EB=B3=B5=20=EC=8B=9C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/global/exception/ExceptionMessage.java | 3 ++- .../java/com/example/bcsd/service/BoardService.java | 4 ++++ .../com/example/bcsd/validation/BoardValidation.java | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index 5123f8a5..430957e9 100644 --- a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -10,7 +10,8 @@ public enum ExceptionMessage { REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), - BOARD_HAS_ARTICLES(400, "작성된 게시글이 존재하여 삭제할 수 없습니다."); + BOARD_HAS_ARTICLES(400, "작성된 게시글이 존재하여 삭제할 수 없습니다."), + BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index 4eaa0bab..64d5092d 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -39,6 +39,8 @@ public BoardResponse getBoardById(Long id) { @Transactional public BoardResponse createBoard(BoardRequest request) { + boardValidation.validateNameDuplicate(request.name()); + return BoardResponse.fromEntity( boardRepository.save( request.toEntity() @@ -48,6 +50,8 @@ public BoardResponse createBoard(BoardRequest request) { @Transactional public BoardResponse updateBoardById(Long id, BoardRequest request) { + boardValidation.validateNameDuplicate(request.name()); + Board board = boardRepository .findById(id) .orElseThrow(() -> diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java index 689e5094..6c344231 100644 --- a/src/main/java/com/example/bcsd/validation/BoardValidation.java +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -3,16 +3,28 @@ import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.BoardRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class BoardValidation { + private final BoardRepository boardRepository; private final ArticleRepository articleRepository; public void validateBoardHasNoArticles(Long boardId) { if (!articleRepository.findAllByBoardId(boardId).isEmpty()) throw new CustomException(ExceptionMessage.BOARD_HAS_ARTICLES); } + + public void validateNameDuplicate(String name) { + boardRepository.findAll().stream() + .filter(board -> + name.equals(board.getName())) + .findFirst() + .ifPresent(board -> { + throw new CustomException(ExceptionMessage.BOARD_NAME_DUPLICATE); + }); + } } From 04c18f55fc9a0033a1b3fac7a92aecb8e7b15ea5 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 29 May 2025 15:24:51 +0900 Subject: [PATCH 111/143] =?UTF-8?q?refactory.=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=8B=9C=20=EC=98=88=EC=99=B8=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=EC=97=90=EC=84=9C=20=EB=A1=9C=EA=B9=85?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/GlobalExceptionHandler.java | 9 ++++----- .../com/example/bcsd/global/filter/LogFilter.java | 12 +++++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java index 081cc478..6478ea1a 100644 --- a/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/bcsd/global/exception/GlobalExceptionHandler.java @@ -16,7 +16,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity ExceptionHandle(CustomException ex, HttpServletRequest request) { - log.error("[Exception] : {}", ex.getMessage()); + request.setAttribute("exceptionMessage", ex.getMessage()); return ResponseEntity.status( ex.getExceptionMessage() @@ -26,16 +26,15 @@ public ResponseEntity ExceptionHandle(CustomException ex, HttpServletReq } @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> ExceptionHandle(MethodArgumentNotValidException ex) { + public ResponseEntity> ExceptionHandle(MethodArgumentNotValidException ex, HttpServletRequest request) { + request.setAttribute("exceptionMessage", ex.getMessage()); + List errorMessages = ex.getBindingResult() .getFieldErrors() .stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); - log.error("[Exception] : {}", errorMessages.toString()); - - return ResponseEntity.badRequest().body(errorMessages); } } diff --git a/src/main/java/com/example/bcsd/global/filter/LogFilter.java b/src/main/java/com/example/bcsd/global/filter/LogFilter.java index cb081045..b05608dd 100644 --- a/src/main/java/com/example/bcsd/global/filter/LogFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LogFilter.java @@ -18,8 +18,6 @@ public class LogFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request); - log.info("-----------------------------------------"); - filterChain.doFilter(wrappedRequest, response); String method = wrappedRequest.getMethod(); @@ -27,9 +25,17 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (method.equals("POST") || method.equals("PUT")) { String body = new String(wrappedRequest.getContentAsByteArray(), wrappedRequest.getCharacterEncoding()); + log.info("-----------------------------------------"); + + String exceptionMessage = (String)wrappedRequest.getAttribute("exceptionMessage"); + + if (exceptionMessage != null) + log.error("[Exception] : {}", exceptionMessage); + log.info("[요청 Body] : {}", body.replaceAll("\\s{2,}", "")); + + log.info("-----------------------------------------"); } - log.info("-----------------------------------------"); } } From 540e9531cb0622d18f0bb4de783253283aef813d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 2 Jun 2025 15:54:20 +0900 Subject: [PATCH 112/143] =?UTF-8?q?fix.=20=EC=9E=90=EC=9B=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=20ResponseEntity=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/controller/ArticleController.java | 8 +++++--- .../com/example/bcsd/controller/BoardController.java | 8 +++++--- .../com/example/bcsd/controller/MemberController.java | 9 +++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/bcsd/controller/ArticleController.java b/src/main/java/com/example/bcsd/controller/ArticleController.java index 8d36d783..34415fce 100644 --- a/src/main/java/com/example/bcsd/controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/controller/ArticleController.java @@ -6,10 +6,10 @@ import com.example.bcsd.service.ArticleService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.List; @RestController @@ -44,9 +44,11 @@ public ResponseEntity> getArticlesByBoardId( public ResponseEntity createArticle( @RequestBody @Valid ArticleCreateRequest request ) { + ArticleResponse response = articleService.createArticle(request); + return ResponseEntity - .status(HttpStatus.CREATED) - .body(articleService.createArticle(request)); + .created(URI.create("/articles/" + response.id())) + .body(response); } @PutMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/controller/BoardController.java b/src/main/java/com/example/bcsd/controller/BoardController.java index 656a3e04..f3d8535e 100644 --- a/src/main/java/com/example/bcsd/controller/BoardController.java +++ b/src/main/java/com/example/bcsd/controller/BoardController.java @@ -5,10 +5,10 @@ import com.example.bcsd.service.BoardService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.List; @RestController @@ -31,9 +31,11 @@ public ResponseEntity getBoardById(@PathVariable Long id) { @PostMapping public ResponseEntity createBoard(@RequestBody @Valid BoardRequest request) { + BoardResponse response = boardService.createBoard(request); + return ResponseEntity - .status(HttpStatus.CREATED) - .body(boardService.createBoard(request)); + .created(URI.create("/boards/" + response.id())) + .body(response); } @PutMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/controller/MemberController.java b/src/main/java/com/example/bcsd/controller/MemberController.java index c0862573..97c46449 100644 --- a/src/main/java/com/example/bcsd/controller/MemberController.java +++ b/src/main/java/com/example/bcsd/controller/MemberController.java @@ -5,10 +5,10 @@ import com.example.bcsd.service.MemberService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.List; @RestController @@ -30,9 +30,10 @@ public ResponseEntity getMemberById(@PathVariable Long id) { @PostMapping() public ResponseEntity createMember(@RequestBody @Valid MemberRequest request) { - return ResponseEntity - .status(HttpStatus.CREATED) - .body(memberService.createMember(request)); + MemberResponse response = memberService.createMember(request); + + return ResponseEntity.created(URI.create("/members/" + response.id())) + .body(response); } @PutMapping("/{id}") From 3e7a73ed8d5709e291df61763a2c09435ac79d3c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 2 Jun 2025 16:41:35 +0900 Subject: [PATCH 113/143] =?UTF-8?q?fix.=20=EC=83=9D=EC=84=B1,=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=9D=BC=EC=8B=9C=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 7a6cfe2d..a3575910 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,8 +1,12 @@ package com.example.bcsd.model; import jakarta.persistence.*; -import lombok.*; -import org.hibernate.annotations.CreationTimestamp; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import java.time.LocalDateTime; @@ -29,10 +33,11 @@ public class Article { private String content; @Column - @CreationTimestamp + @CreatedDate private LocalDateTime createdAt; @Column + @LastModifiedDate private LocalDateTime updatedAt; From 453871aab1d809a45162b80fec4c214cd16a36ee Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 2 Jun 2025 16:41:51 +0900 Subject: [PATCH 114/143] =?UTF-8?q?fix.=20=EC=82=AD=EC=A0=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java | 2 +- .../example/bcsd/repository/jpa/BoardJPARepositoryImpl.java | 2 +- .../example/bcsd/repository/jpa/MemberJPARepositoryImpl.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java index aae6ef5f..1049b561 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java @@ -50,6 +50,6 @@ public Article save(Long id, Article entity) { public void delete(Long id) { Article article = entityManager.find(Article.class, id); - entityManager.remove(id); + entityManager.remove(article); } } diff --git a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java index 3e804313..e27e11ed 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java @@ -42,6 +42,6 @@ public Board save(Long id, Board entity) { public void delete(Long id) { Board board = entityManager.find(Board.class, id); - entityManager.remove(id); + entityManager.remove(board); } } diff --git a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java index 39d68b18..67435594 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java @@ -40,6 +40,8 @@ public Member save(Long id, Member entity) { @Override public void delete(Long id) { - entityManager.remove(id); + Member member = entityManager.find(Member.class, id); + + entityManager.remove(member); } } From d330be0be787cac23e2ef7cc86de59211f38932c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 22 Jun 2025 23:16:49 +0900 Subject: [PATCH 115/143] =?UTF-8?q?refacotry.=20=EC=84=B8=ED=84=B0=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Member.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 5818301e..0846d93e 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -11,7 +11,6 @@ public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Setter private Long id; @Column From bddb1f13797b5d5bab4ab190e28357cb356529b7 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 22 Jun 2025 23:21:38 +0900 Subject: [PATCH 116/143] =?UTF-8?q?refactory.=20@Column=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=EC=97=90=20=EC=86=8D?= =?UTF-8?q?=EC=84=B1=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/example/bcsd/model/Article.java | 4 ++-- src/main/java/com/example/bcsd/model/Board.java | 2 +- src/main/java/com/example/bcsd/model/Member.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index a3575910..d86b6c3e 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -20,7 +20,7 @@ public class Article { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column + @Column(nullable = false) private String title; @Column @@ -29,7 +29,7 @@ public class Article { @Column private Long boardId; - @Column + @Column(nullable = false) private String content; @Column diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 1aec6f07..4c7fb0b6 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -13,7 +13,7 @@ public class Board { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column + @Column(length = 100, nullable = false) private String name; public Board updateBoardName(String name) { diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 0846d93e..522778df 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -13,13 +13,13 @@ public class Member { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column + @Column(length = 100, nullable = false) private String name; - @Column + @Column(length = 100, nullable = false) private String email; - @Column + @Column(nullable = false) private String password; public Member updatePersonalInformation(String name, String email, String password) { From 6dbccee80dedb7117e708c0fb401b4be406ac661 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Sun, 22 Jun 2025 23:37:17 +0900 Subject: [PATCH 117/143] =?UTF-8?q?feat.=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EA=B0=84=20=EC=97=B0=EA=B4=80=20=EA=B4=80=EA=B3=84=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 10 ++++++---- src/main/java/com/example/bcsd/model/Board.java | 5 +++++ src/main/java/com/example/bcsd/model/Member.java | 5 +++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index d86b6c3e..b5abebac 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -23,11 +23,13 @@ public class Article { @Column(nullable = false) private String title; - @Column - private Long authorId; + @ManyToOne + @JoinColumn(name = "author_id") + private Member author; - @Column - private Long boardId; + @ManyToOne + @JoinColumn(name = "board_id") + private Board board; @Column(nullable = false) private String content; diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 4c7fb0b6..aa035067 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -3,6 +3,8 @@ import jakarta.persistence.*; import lombok.*; +import java.util.List; + @Builder @Getter @AllArgsConstructor @@ -16,6 +18,9 @@ public class Board { @Column(length = 100, nullable = false) private String name; + @OneToMany(mappedBy = "board") + private List
articles; + public Board updateBoardName(String name) { this.name = name; diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 522778df..d121d8e9 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -3,6 +3,8 @@ import jakarta.persistence.*; import lombok.*; +import java.util.List; + @Getter @Builder @AllArgsConstructor @@ -22,6 +24,9 @@ public class Member { @Column(nullable = false) private String password; + @OneToMany(mappedBy = "author") + private List
articles; + public Member updatePersonalInformation(String name, String email, String password) { this.name = name; this.email = email; From 00acfa185b64fac67c233ad90245c19d3f7d7b68 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 00:33:50 +0900 Subject: [PATCH 118/143] =?UTF-8?q?refactory.=20=EC=97=B0=EA=B4=80=20?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=84=A4=EC=A0=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ArticleCreateRequest.java | 8 +++++--- .../dto/request/ArticleUpdateRequest.java | 3 --- .../bcsd/dto/resopnse/ArticleResponse.java | 4 ++-- .../java/com/example/bcsd/model/Article.java | 9 ++++----- .../example/bcsd/service/ArticleService.java | 19 +++++++++++++++---- .../bcsd/service/ArticleViewService.java | 4 ++-- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java index 2677b615..2f18530c 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleCreateRequest.java @@ -1,6 +1,8 @@ package com.example.bcsd.dto.request; import com.example.bcsd.model.Article; +import com.example.bcsd.model.Board; +import com.example.bcsd.model.Member; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -19,11 +21,11 @@ public record ArticleCreateRequest( @NotBlank(message = "본문이 누락되었습니다.") String content ) { - public Article toEntity() { + public Article toEntity(Member author, Board board) { return Article.builder() .title(title) - .authorId(authorId) - .boardId(boardId) + .author(author) + .board(board) .content(content) .build(); } diff --git a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java index 99a5b144..815c9189 100644 --- a/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/ArticleUpdateRequest.java @@ -5,9 +5,6 @@ import jakarta.validation.constraints.Size; public record ArticleUpdateRequest( - @NotNull(message = "작성자 ID가 누락되었습니다.") - Long authorId, - @NotNull(message = "게시판 ID가 누락되었습니다.") Long boardId, diff --git a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java index dbc4dd4d..bf80789d 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/ArticleResponse.java @@ -19,8 +19,8 @@ public static ArticleResponse fromEntity(Article article) { return ArticleResponse.builder() .id(article.getId()) .title(article.getTitle()) - .authorId(article.getAuthorId()) - .boardId(article.getBoardId()) + .authorId(article.getAuthor().getId()) + .boardId(article.getBoard().getId()) .content(article.getContent()) .createdAt(article.getCreatedAt()) .updatedAt(article.getUpdatedAt()) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index b5abebac..189cd3d6 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.LocalDateTime; @@ -15,6 +16,7 @@ @AllArgsConstructor @NoArgsConstructor @Entity +@EntityListeners(AuditingEntityListener.class) public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -44,16 +46,13 @@ public class Article { public Article updateDetails( - Long authorId, - Long boardId, + Board board, String title, String content ) { - this.authorId = authorId; - this.boardId = boardId; + this.board = board; this.title = title; this.content = content; - updatedAt = LocalDateTime.now(); return this; } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index 34ee8bbd..fc8ee5a4 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -6,8 +6,14 @@ import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; import com.example.bcsd.model.Article; +import com.example.bcsd.model.Board; +import com.example.bcsd.model.Member; import com.example.bcsd.repository.ArticleRepository; +import com.example.bcsd.repository.BoardRepository; +import com.example.bcsd.repository.MemberRepository; import com.example.bcsd.validation.ArticleValidation; +import com.example.bcsd.validation.BoardValidation; +import com.example.bcsd.validation.MemberValidation; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,7 +25,11 @@ @Transactional(readOnly = true) public class ArticleService { private final ArticleRepository articleRepository; + private final BoardRepository boardRepository; + private final MemberRepository memberRepository; private final ArticleValidation articleValidation; + private final MemberValidation memberValidation; + private final BoardValidation boardValidation; @Transactional(readOnly = true) public List getAllArticles() { @@ -49,24 +59,25 @@ public List getArticlesByBoardId(Long boardId) { @Transactional public ArticleResponse createArticle(ArticleCreateRequest request) { - articleValidation.validateArticleReference(request.authorId(), request.boardId()); + Member author = memberValidation.validateMemberExistAndGet(request.authorId()); + Board board = boardValidation.validateBoardExistAndGet(request.boardId()); return ArticleResponse.fromEntity( articleRepository.save( - request.toEntity() + request.toEntity(author, board) ) ); } @Transactional public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) { - articleValidation.validateArticleReference(request.authorId(), request.boardId()); + boardValidation.validateBoardExist(request.boardId()); articleValidation.validateArticleExist(id); Article article = articleRepository .findById(id) .get() - .updateDetails(request.authorId(), request.boardId(), request.title(), request.content()); + .updateDetails(boardRepository.findById(request.boardId()).get(), request.title(), request.content()); return ArticleResponse.fromEntity(article); } diff --git a/src/main/java/com/example/bcsd/service/ArticleViewService.java b/src/main/java/com/example/bcsd/service/ArticleViewService.java index a25b1ea9..e75648a4 100644 --- a/src/main/java/com/example/bcsd/service/ArticleViewService.java +++ b/src/main/java/com/example/bcsd/service/ArticleViewService.java @@ -43,10 +43,10 @@ private Map> convertToViewResponse(List ArticleViewResponse.fromEntity( article, - memberRepository.findById(article.getAuthorId()) + memberRepository.findById(article.getAuthor().getId()) .map(Member::getName) .orElse("알 수 없음"), - boardRepository.findById(article.getBoardId()) + boardRepository.findById(article.getBoard().getId()) .map(Board::getName) .orElse("알 수 없음") ) From 4ab7b02a37df7be61f9d5307f0cab01e54eb3068 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 00:34:57 +0900 Subject: [PATCH 119/143] =?UTF-8?q?refactory.=20=EC=9E=90=EC=9B=90=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=20=EC=97=AC=EB=B6=80=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=9D=B4=ED=9B=84=20=EC=A4=91=EB=B3=B5=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EB=A7=89=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=9C=20=EC=9E=90=EC=9B=90=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/validation/ArticleValidation.java | 21 ------------------- .../bcsd/validation/BoardValidation.java | 13 ++++++++++++ .../bcsd/validation/MemberValidation.java | 14 +++++++++---- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index 103c3247..ee12d8c2 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -15,27 +15,6 @@ public class ArticleValidation { private final BoardRepository boardRepository; private final MemberRepository memberRepository; - public void validateArticleReference(Long authorId, Long boardId) { - validateAuthorExist(authorId); - validateBoardExist(boardId); - } - - public void validateAuthorExist(Long authorId) { - memberRepository - .findById(authorId) - .orElseThrow(() -> - new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) - ); - } - - public void validateBoardExist(Long boardId) { - boardRepository - .findById(boardId) - .orElseThrow(() -> - new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) - ); - } - public void validateArticleExist(Long articleId) { articleRepository .findById(articleId) diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java index 6c344231..48e420db 100644 --- a/src/main/java/com/example/bcsd/validation/BoardValidation.java +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -2,6 +2,7 @@ import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.model.Board; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.BoardRepository; import lombok.RequiredArgsConstructor; @@ -13,6 +14,18 @@ public class BoardValidation { private final BoardRepository boardRepository; private final ArticleRepository articleRepository; + public Board validateBoardExistAndGet(Long boardId) { + return boardRepository + .findById(boardId) + .orElseThrow(() -> + new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) + ); + } + + public void validateBoardExist(Long boardId) { + validateBoardExistAndGet(boardId); + } + public void validateBoardHasNoArticles(Long boardId) { if (!articleRepository.findAllByBoardId(boardId).isEmpty()) throw new CustomException(ExceptionMessage.BOARD_HAS_ARTICLES); diff --git a/src/main/java/com/example/bcsd/validation/MemberValidation.java b/src/main/java/com/example/bcsd/validation/MemberValidation.java index 276fbd57..d5fc6dad 100644 --- a/src/main/java/com/example/bcsd/validation/MemberValidation.java +++ b/src/main/java/com/example/bcsd/validation/MemberValidation.java @@ -2,6 +2,7 @@ import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.model.Member; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -24,17 +25,22 @@ public void validateEmailDuplicate(String email) { }); } - public void validateMemberExist(Long memberId) { - memberRepository.findById(memberId) + public Member validateMemberExistAndGet(Long memberId) { + return memberRepository + .findById(memberId) .orElseThrow(() -> - new CustomException(ExceptionMessage.MEMBER_NOT_FOUND) + new CustomException(ExceptionMessage.REFERENCED_RESOURCE_NOT_FOUND) ); } + public void validateMemberExist(Long memberId) { + validateMemberExistAndGet(memberId); + } + public void validateMemberHasNoArticles(Long memberId) { articleRepository.findAll() .stream() - .filter(article -> article.getAuthorId() == memberId) + .filter(article -> article.getAuthor().getId() == memberId) .findFirst() .ifPresent(article -> { throw new CustomException(ExceptionMessage.MEMBER_HAS_ARTICLES); From 8bedeae9f8f622f432450d02fe71de8f972c4f5d Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 00:35:26 +0900 Subject: [PATCH 120/143] =?UTF-8?q?feat.=20=EC=83=9D=EC=84=B1,=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=8B=9C=EA=B0=84=20=EC=B2=B4=ED=81=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=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/example/bcsd/BcsdApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/example/bcsd/BcsdApplication.java b/src/main/java/com/example/bcsd/BcsdApplication.java index 6e3ecb1b..36808987 100644 --- a/src/main/java/com/example/bcsd/BcsdApplication.java +++ b/src/main/java/com/example/bcsd/BcsdApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class BcsdApplication { public static void main(String[] args) { From 22cc9a37a43fe793a06ba9fb10766c475ad0afce Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:01:18 +0900 Subject: [PATCH 121/143] =?UTF-8?q?chore.=20=EC=A3=BC=EC=84=9D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/ArticleJPARepositoryImpl.java | 110 +++++++++--------- .../jpa/BoardJPARepositoryImpl.java | 94 +++++++-------- .../jpa/MemberJPARepositoryImpl.java | 94 +++++++-------- 3 files changed, 149 insertions(+), 149 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java index 1049b561..d287dfa1 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/ArticleJPARepositoryImpl.java @@ -1,55 +1,55 @@ -package com.example.bcsd.repository.jpa; - -import com.example.bcsd.model.Article; -import com.example.bcsd.repository.ArticleRepository; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public class ArticleJPARepositoryImpl implements ArticleRepository { - @PersistenceContext - private EntityManager entityManager; - - @Override - public List
findAllByBoardId(Long boardId) { - return entityManager - .createQuery("SELECT a FROM Article a WHERE boardId = :boardId", Article.class) - .setParameter("boardId", boardId) - .getResultList(); - } - - @Override - public List
findAll() { - return entityManager - .createQuery("SELECT a FROM Article a", Article.class) - .getResultList(); - } - - @Override - public Optional
findById(Long id) { - return Optional.ofNullable(entityManager.find(Article.class, id)); - } - - @Override - public Article save(Article entity) { - entityManager.persist(entity); - - return entity; - } - - @Override - public Article save(Long id, Article entity) { - return null; - } - - @Override - public void delete(Long id) { - Article article = entityManager.find(Article.class, id); - - entityManager.remove(article); - } -} +//package com.example.bcsd.repository.jpa; +// +//import com.example.bcsd.model.Article; +//import com.example.bcsd.repository.ArticleRepository; +//import jakarta.persistence.EntityManager; +//import jakarta.persistence.PersistenceContext; +//import org.springframework.stereotype.Repository; +// +//import java.util.List; +//import java.util.Optional; +// +//@Repository +//public class ArticleJPARepositoryImpl implements ArticleRepository { +// @PersistenceContext +// private EntityManager entityManager; +// +// @Override +// public List
findAllByBoardId(Long boardId) { +// return entityManager +// .createQuery("SELECT a FROM Article a WHERE boardId = :boardId", Article.class) +// .setParameter("boardId", boardId) +// .getResultList(); +// } +// +// @Override +// public List
findAll() { +// return entityManager +// .createQuery("SELECT a FROM Article a", Article.class) +// .getResultList(); +// } +// +// @Override +// public Optional
findById(Long id) { +// return Optional.ofNullable(entityManager.find(Article.class, id)); +// } +// +// @Override +// public Article save(Article entity) { +// entityManager.persist(entity); +// +// return entity; +// } +// +// @Override +// public Article save(Long id, Article entity) { +// return null; +// } +// +// @Override +// public void delete(Long id) { +// Article article = entityManager.find(Article.class, id); +// +// entityManager.remove(article); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java index e27e11ed..dcdc22b4 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/BoardJPARepositoryImpl.java @@ -1,47 +1,47 @@ -package com.example.bcsd.repository.jpa; - -import com.example.bcsd.model.Board; -import com.example.bcsd.repository.BoardRepository; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public class BoardJPARepositoryImpl implements BoardRepository { - @PersistenceContext - private EntityManager entityManager; - - @Override - public List findAll() { - return entityManager - .createQuery("SELECT b FROM Board b", Board.class) - .getResultList(); - } - - @Override - public Optional findById(Long id) { - return Optional.ofNullable(entityManager.find(Board.class, id)); - } - - @Override - public Board save(Board entity) { - entityManager.persist(entity); - - return entity; - } - - @Override - public Board save(Long id, Board entity) { - return null; - } - - @Override - public void delete(Long id) { - Board board = entityManager.find(Board.class, id); - - entityManager.remove(board); - } -} +//package com.example.bcsd.repository.jpa; +// +//import com.example.bcsd.model.Board; +//import com.example.bcsd.repository.BoardRepository; +//import jakarta.persistence.EntityManager; +//import jakarta.persistence.PersistenceContext; +//import org.springframework.stereotype.Repository; +// +//import java.util.List; +//import java.util.Optional; +// +//@Repository +//public class BoardJPARepositoryImpl implements BoardRepository { +// @PersistenceContext +// private EntityManager entityManager; +// +// @Override +// public List findAll() { +// return entityManager +// .createQuery("SELECT b FROM Board b", Board.class) +// .getResultList(); +// } +// +// @Override +// public Optional findById(Long id) { +// return Optional.ofNullable(entityManager.find(Board.class, id)); +// } +// +// @Override +// public Board save(Board entity) { +// entityManager.persist(entity); +// +// return entity; +// } +// +// @Override +// public Board save(Long id, Board entity) { +// return null; +// } +// +// @Override +// public void delete(Long id) { +// Board board = entityManager.find(Board.class, id); +// +// entityManager.remove(board); +// } +//} diff --git a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java index 67435594..abea56d5 100644 --- a/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java +++ b/src/main/java/com/example/bcsd/repository/jpa/MemberJPARepositoryImpl.java @@ -1,47 +1,47 @@ -package com.example.bcsd.repository.jpa; - -import com.example.bcsd.model.Member; -import com.example.bcsd.repository.MemberRepository; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public class MemberJPARepositoryImpl implements MemberRepository { - @PersistenceContext - private EntityManager entityManager; - - @Override - public List findAll() { - return entityManager - .createQuery("SELECT m FROM Member m", Member.class) - .getResultList(); - } - - @Override - public Optional findById(Long id) { - return Optional.ofNullable(entityManager.find(Member.class, id)); - } - - @Override - public Member save(Member entity) { - entityManager.persist(entity); - - return entity; - } - - @Override - public Member save(Long id, Member entity) { - return null; - } - - @Override - public void delete(Long id) { - Member member = entityManager.find(Member.class, id); - - entityManager.remove(member); - } -} +//package com.example.bcsd.repository.jpa; +// +//import com.example.bcsd.model.Member; +//import com.example.bcsd.repository.MemberRepository; +//import jakarta.persistence.EntityManager; +//import jakarta.persistence.PersistenceContext; +//import org.springframework.stereotype.Repository; +// +//import java.util.List; +//import java.util.Optional; +// +//@Repository +//public class MemberJPARepositoryImpl implements MemberRepository { +// @PersistenceContext +// private EntityManager entityManager; +// +// @Override +// public List findAll() { +// return entityManager +// .createQuery("SELECT m FROM Member m", Member.class) +// .getResultList(); +// } +// +// @Override +// public Optional findById(Long id) { +// return Optional.ofNullable(entityManager.find(Member.class, id)); +// } +// +// @Override +// public Member save(Member entity) { +// entityManager.persist(entity); +// +// return entity; +// } +// +// @Override +// public Member save(Long id, Member entity) { +// return null; +// } +// +// @Override +// public void delete(Long id) { +// Member member = entityManager.find(Member.class, id); +// +// entityManager.remove(member); +// } +//} From 2f607d00344a45f37d8a2bac66ff0ba39d682adb Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:05:33 +0900 Subject: [PATCH 122/143] =?UTF-8?q?refactory.=20Spring=20Data=20Jpa=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/repository/ArticleRepository.java | 3 ++- .../java/com/example/bcsd/repository/BoardRepository.java | 3 ++- .../java/com/example/bcsd/repository/MemberRepository.java | 3 ++- src/main/java/com/example/bcsd/service/ArticleService.java | 6 ++---- src/main/java/com/example/bcsd/service/BoardService.java | 4 +++- src/main/java/com/example/bcsd/service/MemberService.java | 4 ++-- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/bcsd/repository/ArticleRepository.java b/src/main/java/com/example/bcsd/repository/ArticleRepository.java index 3013beb5..aa27b647 100644 --- a/src/main/java/com/example/bcsd/repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/repository/ArticleRepository.java @@ -1,9 +1,10 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Article; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -public interface ArticleRepository extends CRUDRepository { +public interface ArticleRepository extends JpaRepository { public List
findAllByBoardId(Long boardId); } diff --git a/src/main/java/com/example/bcsd/repository/BoardRepository.java b/src/main/java/com/example/bcsd/repository/BoardRepository.java index 78a5845a..6900c02e 100644 --- a/src/main/java/com/example/bcsd/repository/BoardRepository.java +++ b/src/main/java/com/example/bcsd/repository/BoardRepository.java @@ -1,6 +1,7 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Board; +import org.springframework.data.jpa.repository.JpaRepository; -public interface BoardRepository extends CRUDRepository { +public interface BoardRepository extends JpaRepository { } diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index ffcf6442..8eb61447 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -1,6 +1,7 @@ package com.example.bcsd.repository; import com.example.bcsd.model.Member; +import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberRepository extends CRUDRepository { +public interface MemberRepository extends JpaRepository { } diff --git a/src/main/java/com/example/bcsd/service/ArticleService.java b/src/main/java/com/example/bcsd/service/ArticleService.java index fc8ee5a4..598413a3 100644 --- a/src/main/java/com/example/bcsd/service/ArticleService.java +++ b/src/main/java/com/example/bcsd/service/ArticleService.java @@ -10,7 +10,6 @@ import com.example.bcsd.model.Member; import com.example.bcsd.repository.ArticleRepository; import com.example.bcsd.repository.BoardRepository; -import com.example.bcsd.repository.MemberRepository; import com.example.bcsd.validation.ArticleValidation; import com.example.bcsd.validation.BoardValidation; import com.example.bcsd.validation.MemberValidation; @@ -26,7 +25,6 @@ public class ArticleService { private final ArticleRepository articleRepository; private final BoardRepository boardRepository; - private final MemberRepository memberRepository; private final ArticleValidation articleValidation; private final MemberValidation memberValidation; private final BoardValidation boardValidation; @@ -84,8 +82,8 @@ public ArticleResponse updateArticleById(Long id, ArticleUpdateRequest request) @Transactional public void deleteArticleById(Long id) { - articleValidation.validateArticleExist(id); + Article article = articleValidation.validateArticleExistAndGet(id); - articleRepository.delete(id); + articleRepository.delete(article); } } diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index 64d5092d..93c17849 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -71,6 +71,8 @@ public void deleteBoardById(Long id) { new CustomException(ExceptionMessage.BOARD_NOT_FOUND) ); - boardRepository.delete(id); + Board board = boardValidation.validateBoardExistAndGet(id); + + boardRepository.delete(board); } } diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 2ed09c0a..3e493358 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -62,9 +62,9 @@ public MemberResponse updateMember(Long id, MemberRequest request) { @Transactional public void deleteMember(Long id) { - memberValidation.validateMemberExist(id); + Member member = memberValidation.validateMemberExistAndGet(id); memberValidation.validateMemberHasNoArticles(id); - memberRepository.delete(id); + memberRepository.delete(member); } } From 60ec60976edef4a1611c846f2a94b511106f9fdc Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:07:38 +0900 Subject: [PATCH 123/143] =?UTF-8?q?refactory.=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=95=88=ED=95=98=EB=8A=94=20=ED=95=84=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=8F=20=EA=B2=80=EC=A6=9D=20=ED=9B=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=A1=B0=ED=9A=8C=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/validation/ArticleValidation.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/bcsd/validation/ArticleValidation.java b/src/main/java/com/example/bcsd/validation/ArticleValidation.java index ee12d8c2..0c6c5aae 100644 --- a/src/main/java/com/example/bcsd/validation/ArticleValidation.java +++ b/src/main/java/com/example/bcsd/validation/ArticleValidation.java @@ -2,9 +2,8 @@ import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.model.Article; import com.example.bcsd.repository.ArticleRepository; -import com.example.bcsd.repository.BoardRepository; -import com.example.bcsd.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -12,14 +11,16 @@ @RequiredArgsConstructor public class ArticleValidation { private final ArticleRepository articleRepository; - private final BoardRepository boardRepository; - private final MemberRepository memberRepository; - public void validateArticleExist(Long articleId) { - articleRepository + public Article validateArticleExistAndGet(Long articleId) { + return articleRepository .findById(articleId) .orElseThrow(() -> new CustomException(ExceptionMessage.ARTICLE_NOT_FOUND) ); } + + public void validateArticleExist(Long articleId) { + validateArticleExistAndGet(articleId); + } } From 3e0c7768094058b43fca771bdda0bf785ead9180 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:13:31 +0900 Subject: [PATCH 124/143] =?UTF-8?q?feat.=20=EC=97=B0=EA=B4=80=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=98=81=EC=86=8D=EC=84=B1=20=EC=A0=84=EC=9D=B4,?= =?UTF-8?q?=20=EA=B3=A0=EC=95=84=20=EA=B0=9D=EC=B2=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Board.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index aa035067..67a1bd24 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -18,7 +18,7 @@ public class Board { @Column(length = 100, nullable = false) private String name; - @OneToMany(mappedBy = "board") + @OneToMany(mappedBy = "board", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private List
articles; public Board updateBoardName(String name) { From 5408e79d9a9224a58962887e4e9e4947c45ef883 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:14:26 +0900 Subject: [PATCH 125/143] =?UTF-8?q?fix.=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EA=B2=8C=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=A9=B4=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/global/exception/ExceptionMessage.java | 1 - src/main/java/com/example/bcsd/service/BoardService.java | 2 -- .../java/com/example/bcsd/validation/BoardValidation.java | 5 ----- 3 files changed, 8 deletions(-) diff --git a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index 430957e9..19b2c9d4 100644 --- a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -10,7 +10,6 @@ public enum ExceptionMessage { REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), - BOARD_HAS_ARTICLES(400, "작성된 게시글이 존재하여 삭제할 수 없습니다."), BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."); private final int status; diff --git a/src/main/java/com/example/bcsd/service/BoardService.java b/src/main/java/com/example/bcsd/service/BoardService.java index 93c17849..38238914 100644 --- a/src/main/java/com/example/bcsd/service/BoardService.java +++ b/src/main/java/com/example/bcsd/service/BoardService.java @@ -64,8 +64,6 @@ public BoardResponse updateBoardById(Long id, BoardRequest request) { @Transactional public void deleteBoardById(Long id) { - boardValidation.validateBoardHasNoArticles(id); - boardRepository.findById(id) .orElseThrow(() -> new CustomException(ExceptionMessage.BOARD_NOT_FOUND) diff --git a/src/main/java/com/example/bcsd/validation/BoardValidation.java b/src/main/java/com/example/bcsd/validation/BoardValidation.java index 48e420db..1ee7685b 100644 --- a/src/main/java/com/example/bcsd/validation/BoardValidation.java +++ b/src/main/java/com/example/bcsd/validation/BoardValidation.java @@ -26,11 +26,6 @@ public void validateBoardExist(Long boardId) { validateBoardExistAndGet(boardId); } - public void validateBoardHasNoArticles(Long boardId) { - if (!articleRepository.findAllByBoardId(boardId).isEmpty()) - throw new CustomException(ExceptionMessage.BOARD_HAS_ARTICLES); - } - public void validateNameDuplicate(String name) { boardRepository.findAll().stream() .filter(board -> From 04cf14e1fd5ec84ed4652f15fc8a6dfbe6e0b28f Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 01:20:58 +0900 Subject: [PATCH 126/143] =?UTF-8?q?feat.=20=EC=A7=80=EC=97=B0=EB=A1=9C?= =?UTF-8?q?=EB=94=A9=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 189cd3d6..2b6e2b92 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -25,11 +25,11 @@ public class Article { @Column(nullable = false) private String title; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id") private Member author; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") private Board board; From 0907a52d447a50d7c275a666d769a2908c67b2af Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 17:19:44 +0900 Subject: [PATCH 127/143] =?UTF-8?q?fix.=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EC=A0=9C=ED=95=9C=20=EB=B2=94=EC=9C=84=20protected?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Article.java | 7 ++----- src/main/java/com/example/bcsd/model/Board.java | 2 +- src/main/java/com/example/bcsd/model/Member.java | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 2b6e2b92..e181e733 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,10 +1,7 @@ package com.example.bcsd.model; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -14,7 +11,7 @@ @Getter @Builder @AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @EntityListeners(AuditingEntityListener.class) public class Article { diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 67a1bd24..da204c5d 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -8,7 +8,7 @@ @Builder @Getter @AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Board { @Id diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index d121d8e9..86ffef04 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -8,7 +8,7 @@ @Getter @Builder @AllArgsConstructor -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id From e38d779fc96d55d539bff6314737d19bf619889f Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 17:47:51 +0900 Subject: [PATCH 128/143] =?UTF-8?q?fix.=20=EC=98=81=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=A0=84=EC=9D=B4=20=EC=86=8D=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Board.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index da204c5d..0de47100 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -18,7 +18,7 @@ public class Board { @Column(length = 100, nullable = false) private String name; - @OneToMany(mappedBy = "board", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) + @OneToMany(mappedBy = "board", cascade = CascadeType.PERSIST, orphanRemoval = true) private List
articles; public Board updateBoardName(String name) { From f17cacc0e2c2c707bacce6f1d752bc1680f23329 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Mon, 23 Jun 2025 18:39:09 +0900 Subject: [PATCH 129/143] =?UTF-8?q?fix.=20=EC=98=81=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=A0=84=EC=9D=B4=20REMOVE=20=EC=86=8D=EC=84=B1=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=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/example/bcsd/model/Board.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 0de47100..da204c5d 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -18,7 +18,7 @@ public class Board { @Column(length = 100, nullable = false) private String name; - @OneToMany(mappedBy = "board", cascade = CascadeType.PERSIST, orphanRemoval = true) + @OneToMany(mappedBy = "board", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private List
articles; public Board updateBoardName(String name) { From 054f19f637d27fa855ba44f9c5a83deca1be3155 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Wed, 25 Jun 2025 17:20:33 +0900 Subject: [PATCH 130/143] =?UTF-8?q?feat.=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/AuthController.java | 28 +++++++++++++++++++ .../bcsd/dto/request/LoginRequest.java | 4 +++ .../com/example/bcsd/service/AuthService.java | 25 +++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/main/java/com/example/bcsd/controller/AuthController.java create mode 100644 src/main/java/com/example/bcsd/dto/request/LoginRequest.java create mode 100644 src/main/java/com/example/bcsd/service/AuthService.java diff --git a/src/main/java/com/example/bcsd/controller/AuthController.java b/src/main/java/com/example/bcsd/controller/AuthController.java new file mode 100644 index 00000000..084e8b4a --- /dev/null +++ b/src/main/java/com/example/bcsd/controller/AuthController.java @@ -0,0 +1,28 @@ +package com.example.bcsd.controller; + +import com.example.bcsd.dto.request.MemberRequest; +import com.example.bcsd.dto.resopnse.MemberResponse; +import com.example.bcsd.service.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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("/auth") +@RequiredArgsConstructor +public class AuthController { + private final AuthService authService; + + @PostMapping("/register") + public ResponseEntity registerMember(@RequestBody MemberRequest request) { + MemberResponse response = authService.register(request); + + return ResponseEntity + .status(HttpStatus.CREATED) + .body(response); + } +} diff --git a/src/main/java/com/example/bcsd/dto/request/LoginRequest.java b/src/main/java/com/example/bcsd/dto/request/LoginRequest.java new file mode 100644 index 00000000..d2f710a4 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/request/LoginRequest.java @@ -0,0 +1,4 @@ +package com.example.bcsd.dto.request; + +public record LoginRequest() { +} diff --git a/src/main/java/com/example/bcsd/service/AuthService.java b/src/main/java/com/example/bcsd/service/AuthService.java new file mode 100644 index 00000000..576eccae --- /dev/null +++ b/src/main/java/com/example/bcsd/service/AuthService.java @@ -0,0 +1,25 @@ +package com.example.bcsd.service; + +import com.example.bcsd.dto.request.MemberRequest; +import com.example.bcsd.dto.resopnse.MemberResponse; +import com.example.bcsd.repository.MemberRepository; +import com.example.bcsd.validation.MemberValidation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthService { + private final MemberRepository memberRepository; + private final MemberValidation memberValidation; + + public MemberResponse register(MemberRequest request) { + memberValidation.validateEmailDuplicate(request.email()); + + return MemberResponse.fromEntity( + memberRepository.save( + request.toEntity() + ) + ); + } +} From 971b0ea7cee234273b3f887c532e4d5b929abab2 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 26 Jun 2025 16:54:32 +0900 Subject: [PATCH 131/143] =?UTF-8?q?refactory.=20=EB=B9=84=EB=B0=80?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=95=94=ED=98=B8=ED=99=94=20=EC=8B=9C?= =?UTF-8?q?=EC=A0=90=20=EC=97=AD=EC=A7=81=EB=A0=AC=ED=99=94=20->=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B3=84=EC=B8=B5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/dto/request/MemberRequest.java | 7 ++----- .../example/bcsd/global/util/PasswordEncoder.java | 13 +++++++++++++ .../com/example/bcsd/service/MemberService.java | 11 +++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/example/bcsd/global/util/PasswordEncoder.java diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index de9d14c4..64a5511a 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -1,8 +1,6 @@ package com.example.bcsd.dto.request; -import com.example.bcsd.dto.deserializer.PasswordBcryptDeserializer; import com.example.bcsd.model.Member; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -19,7 +17,6 @@ public record MemberRequest( @NotNull(message = "비밀번호가 누락되었습니다.") @Size(max = 255, message = "비밀번호의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") - @JsonDeserialize(using = PasswordBcryptDeserializer.class) String password ) { public MemberRequest(String name, String email, String password) { @@ -28,11 +25,11 @@ public MemberRequest(String name, String email, String password) { this.password = password; } - public Member toEntity() { + public Member toEntity(String encodedPassword) { return Member.builder() .name(name) .email(email) - .password(password) + .password(encodedPassword) .build(); } } diff --git a/src/main/java/com/example/bcsd/global/util/PasswordEncoder.java b/src/main/java/com/example/bcsd/global/util/PasswordEncoder.java new file mode 100644 index 00000000..54b9f799 --- /dev/null +++ b/src/main/java/com/example/bcsd/global/util/PasswordEncoder.java @@ -0,0 +1,13 @@ +package com.example.bcsd.global.util; + +import org.mindrot.jbcrypt.BCrypt; + +public class PasswordEncoder { + public static String encode(String password) { + return BCrypt.hashpw(password, BCrypt.gensalt()); + } + + public static boolean matches(String plainPassword, String encodedPassword) { + return BCrypt.checkpw(plainPassword, encodedPassword); + } +} diff --git a/src/main/java/com/example/bcsd/service/MemberService.java b/src/main/java/com/example/bcsd/service/MemberService.java index 3e493358..c04e1cac 100644 --- a/src/main/java/com/example/bcsd/service/MemberService.java +++ b/src/main/java/com/example/bcsd/service/MemberService.java @@ -4,6 +4,7 @@ import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.global.exception.CustomException; import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.global.util.PasswordEncoder; import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; import com.example.bcsd.validation.MemberValidation; @@ -41,9 +42,11 @@ public MemberResponse getMemberById(Long id) { public MemberResponse createMember(MemberRequest request) { memberValidation.validateEmailDuplicate(request.email()); + String encodedPassword = PasswordEncoder.encode(request.password()); + return MemberResponse.fromEntity( memberRepository.save( - request.toEntity() + request.toEntity(encodedPassword) ) ); } @@ -55,7 +58,11 @@ public MemberResponse updateMember(Long id, MemberRequest request) { Member member = memberRepository.findById(id) .get() - .updatePersonalInformation(request.name(), request.email(), request.password()); + .updatePersonalInformation( + request.name(), + request.email(), + PasswordEncoder.encode(request.password()) + ); return MemberResponse.fromEntity(member); } From 6d8178b0f72ff30fe24cce6735dd3263bcd9c501 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 26 Jun 2025 16:55:01 +0900 Subject: [PATCH 132/143] =?UTF-8?q?feat.=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/controller/AuthController.java | 18 +++++++++++++++ .../PasswordBcryptDeserializer.java | 19 --------------- .../bcsd/dto/request/LoginRequest.java | 16 ++++++++++++- .../global/exception/ExceptionMessage.java | 3 ++- .../bcsd/repository/MemberRepository.java | 3 +++ .../com/example/bcsd/service/AuthService.java | 23 ++++++++++++++++++- 6 files changed, 60 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java diff --git a/src/main/java/com/example/bcsd/controller/AuthController.java b/src/main/java/com/example/bcsd/controller/AuthController.java index 084e8b4a..dd05fe48 100644 --- a/src/main/java/com/example/bcsd/controller/AuthController.java +++ b/src/main/java/com/example/bcsd/controller/AuthController.java @@ -1,8 +1,11 @@ package com.example.bcsd.controller; +import com.example.bcsd.dto.request.LoginRequest; import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.service.AuthService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -25,4 +28,19 @@ public ResponseEntity registerMember(@RequestBody MemberRequest .status(HttpStatus.CREATED) .body(response); } + + @PostMapping("/login") + public ResponseEntity loginMember( + @RequestBody LoginRequest request, + HttpServletRequest httpServletRequest + ) { + MemberResponse response = authService.login(request); + + HttpSession session = httpServletRequest.getSession(true); + + session.setAttribute("SESSION_ID", response.id()); + + return ResponseEntity + .ok(response); + } } diff --git a/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java b/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java deleted file mode 100644 index 9018b451..00000000 --- a/src/main/java/com/example/bcsd/dto/deserializer/PasswordBcryptDeserializer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.bcsd.dto.deserializer; - -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import org.mindrot.jbcrypt.BCrypt; - -import java.io.IOException; - -public class PasswordBcryptDeserializer extends JsonDeserializer { - - @Override - public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { - String password = jsonParser.getValueAsString(); - - return BCrypt.hashpw(password, BCrypt.gensalt()); - } -} diff --git a/src/main/java/com/example/bcsd/dto/request/LoginRequest.java b/src/main/java/com/example/bcsd/dto/request/LoginRequest.java index d2f710a4..32371911 100644 --- a/src/main/java/com/example/bcsd/dto/request/LoginRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/LoginRequest.java @@ -1,4 +1,18 @@ package com.example.bcsd.dto.request; -public record LoginRequest() { +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record LoginRequest( + @NotNull(message = "이메일이 누락되었습니다.") + @Size(max = 100, message = "이메일의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") + @Email + String email, + + @NotNull(message = "비밀번호가 누락되었습니다.") + @Size(max = 255, message = "비밀번호의 최대 길이를 벗어났습니다. (최대 길이 : 100자)") + String password +) { + } diff --git a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index 19b2c9d4..edff69c3 100644 --- a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -10,7 +10,8 @@ public enum ExceptionMessage { REFERENCED_RESOURCE_NOT_FOUND(400, "존재하지 않는 자원을 참조하고 있습니다."), EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), - BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."); + BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."), + INVALID_PASSWORD(400, "비밀번호가 일치하지 않습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/repository/MemberRepository.java b/src/main/java/com/example/bcsd/repository/MemberRepository.java index 8eb61447..e6061326 100644 --- a/src/main/java/com/example/bcsd/repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/repository/MemberRepository.java @@ -3,5 +3,8 @@ import com.example.bcsd.model.Member; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface MemberRepository extends JpaRepository { + Optional findByEmail(String email); } diff --git a/src/main/java/com/example/bcsd/service/AuthService.java b/src/main/java/com/example/bcsd/service/AuthService.java index 576eccae..cd451ad1 100644 --- a/src/main/java/com/example/bcsd/service/AuthService.java +++ b/src/main/java/com/example/bcsd/service/AuthService.java @@ -1,7 +1,12 @@ package com.example.bcsd.service; +import com.example.bcsd.dto.request.LoginRequest; import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.global.util.PasswordEncoder; +import com.example.bcsd.model.Member; import com.example.bcsd.repository.MemberRepository; import com.example.bcsd.validation.MemberValidation; import lombok.RequiredArgsConstructor; @@ -16,10 +21,26 @@ public class AuthService { public MemberResponse register(MemberRequest request) { memberValidation.validateEmailDuplicate(request.email()); + String encodedPassword = PasswordEncoder.encode(request.password()); + return MemberResponse.fromEntity( memberRepository.save( - request.toEntity() + request.toEntity(encodedPassword) ) ); } + + public MemberResponse login(LoginRequest request) { + String email = request.email(); + + Member member = memberRepository + .findByEmail(email) + .orElseThrow(() -> new CustomException(ExceptionMessage.MEMBER_NOT_FOUND)); + + if (!PasswordEncoder.matches(request.password(), member.getPassword())) { + throw new CustomException(ExceptionMessage.INVALID_PASSWORD); + } + + return MemberResponse.fromEntity(member); + } } From 08975c3293b82007a1b605b7ca85c626ac135340 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Thu, 26 Jun 2025 17:12:34 +0900 Subject: [PATCH 133/143] =?UTF-8?q?feat.=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=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 --- .../bcsd/controller/AuthController.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/com/example/bcsd/controller/AuthController.java b/src/main/java/com/example/bcsd/controller/AuthController.java index dd05fe48..9fd115c3 100644 --- a/src/main/java/com/example/bcsd/controller/AuthController.java +++ b/src/main/java/com/example/bcsd/controller/AuthController.java @@ -4,7 +4,9 @@ import com.example.bcsd.dto.request.MemberRequest; import com.example.bcsd.dto.resopnse.MemberResponse; import com.example.bcsd.service.AuthService; +import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -43,4 +45,24 @@ public ResponseEntity loginMember( return ResponseEntity .ok(response); } + + @PostMapping("/logout") + public ResponseEntity logoutMember( + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse + ) { + HttpSession session = httpServletRequest.getSession(false); + + if (session != null) { + session.invalidate(); + + Cookie cookie = new Cookie("JSESSIONID", null); + cookie.setMaxAge(0); + cookie.setPath("/"); + cookie.setHttpOnly(true); + httpServletResponse.addCookie(cookie); + } + + return ResponseEntity.ok().build(); + } } From 19ff25f8ff898a92440b942e7da2f2f7f5713471 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 15:28:04 +0900 Subject: [PATCH 134/143] =?UTF-8?q?feat.=20=ED=8A=B9=EC=A0=95=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A9=A4=EB=B2=84?= =?UTF-8?q?=EC=9D=98=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=ED=95=84=ED=84=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ExceptionMessage.java | 3 +- .../filter/ExceptionHandlingFilter.java | 28 +++++++++++ .../example/bcsd/global/filter/LogFilter.java | 2 + .../bcsd/global/filter/LoginCheckFilter.java | 48 +++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java create mode 100644 src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java diff --git a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index edff69c3..66379fd1 100644 --- a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -11,7 +11,8 @@ public enum ExceptionMessage { EMAIL_DUPLICATE(409, "이미 존재하는 이메일입니다."), MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."), - INVALID_PASSWORD(400, "비밀번호가 일치하지 않습니다."); + INVALID_PASSWORD(400, "비밀번호가 일치하지 않습니다."), + UNAUTHORIZED_USER(401, "로그인이 필요합니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java b/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java new file mode 100644 index 00000000..fc0213b1 --- /dev/null +++ b/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java @@ -0,0 +1,28 @@ +package com.example.bcsd.global.filter; + +import com.example.bcsd.global.exception.CustomException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@Order(1) +public class ExceptionHandlingFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + try { + filterChain.doFilter(request, response); + } catch (CustomException ex) { + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + response.setStatus(ex.getExceptionMessage().getStatus()); + response.getWriter().write(ex.getExceptionMessage().getMessage()); + } + } +} diff --git a/src/main/java/com/example/bcsd/global/filter/LogFilter.java b/src/main/java/com/example/bcsd/global/filter/LogFilter.java index b05608dd..2d075c24 100644 --- a/src/main/java/com/example/bcsd/global/filter/LogFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LogFilter.java @@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; @@ -13,6 +14,7 @@ @Slf4j @Component +@Order(3) public class LogFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { diff --git a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java new file mode 100644 index 00000000..fd70ffd3 --- /dev/null +++ b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java @@ -0,0 +1,48 @@ +package com.example.bcsd.global.filter; + +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@Order(2) +public class LoginCheckFilter extends OncePerRequestFilter { + private boolean isOpenAPI(HttpServletRequest httpServletRequest) { + String uri = httpServletRequest.getRequestURI(); + String method = httpServletRequest.getMethod(); + + if (uri.startsWith("/register") || uri.startsWith("/login")) { + return true; + } + + if (method.equals("GET") && (uri.startsWith("/articles") || uri.startsWith("/boards"))) { + return true; + } + + return false; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + if (isOpenAPI(request)) { + filterChain.doFilter(request, response); + return; + } + + HttpSession session = request.getSession(false); + + if (session == null || session.getAttribute("SESSION_ID") == null) + throw new CustomException(ExceptionMessage.UNAUTHORIZED_USER); + + filterChain.doFilter(request, response); + } +} From eeca8abb3d4644f727a6bb030f8044cf6961609a Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 15:28:35 +0900 Subject: [PATCH 135/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=EC=9D=98=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=EC=9C=BC=EB=A1=9C=20role=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/example/bcsd/model/Member.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 86ffef04..671c8479 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.ColumnDefault; import java.util.List; @@ -24,6 +25,10 @@ public class Member { @Column(nullable = false) private String password; + @Column(length = 100) + @ColumnDefault("user") + private String role; + @OneToMany(mappedBy = "author") private List
articles; From f271153abe39ea7da7d653d9c506e4ad900d5cb7 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 15:31:27 +0900 Subject: [PATCH 136/143] =?UTF-8?q?fix.=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=ED=95=84=ED=84=B0=20=ED=86=B5=EA=B3=BC=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EB=A5=BC=20/auth=20=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/global/filter/LoginCheckFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java index fd70ffd3..13bdb9b8 100644 --- a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java @@ -20,7 +20,7 @@ private boolean isOpenAPI(HttpServletRequest httpServletRequest) { String uri = httpServletRequest.getRequestURI(); String method = httpServletRequest.getMethod(); - if (uri.startsWith("/register") || uri.startsWith("/login")) { + if (uri.startsWith("/auth")) { return true; } From 21f491517530d1f8eb93dadb166192d11e8844bf Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 15:59:30 +0900 Subject: [PATCH 137/143] =?UTF-8?q?fix.=20/posts=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=97=AC=EB=B6=80=20=EC=83=81=EA=B4=80=EC=97=86?= =?UTF-8?q?=EC=9D=B4=20=ED=86=B5=EA=B3=BC=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/global/filter/LoginCheckFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java index 13bdb9b8..560ddf6e 100644 --- a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java @@ -24,7 +24,7 @@ private boolean isOpenAPI(HttpServletRequest httpServletRequest) { return true; } - if (method.equals("GET") && (uri.startsWith("/articles") || uri.startsWith("/boards"))) { + if (method.equals("GET") && (uri.startsWith("/articles") || uri.startsWith("/boards") || uri.startsWith("/posts"))) { return true; } From 023acdca2950d966ab572922c605cd000e55c27c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 16:00:04 +0900 Subject: [PATCH 138/143] =?UTF-8?q?fix.=20=EB=94=94=ED=8F=B4=ED=8A=B8=20?= =?UTF-8?q?=EA=B0=92=EC=9D=B4=20=EC=A0=81=EC=9A=A9=20=EC=95=88=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/model/Member.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 671c8479..1384e48b 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; import java.util.List; @@ -11,6 +12,7 @@ @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity +@DynamicInsert public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -26,7 +28,7 @@ public class Member { private String password; @Column(length = 100) - @ColumnDefault("user") + @ColumnDefault("'user'") private String role; @OneToMany(mappedBy = "author") From bf1b1266b562686c0f399fb4bf6bada72eccd81c Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 16:24:54 +0900 Subject: [PATCH 139/143] =?UTF-8?q?refactory.=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A5=BC=20Config=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=93=B1=EB=A1=9D=ED=95=98=EA=B3=A0=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EA=B2=BD=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/global/config/WebConfig.java | 4 ++++ .../bcsd/global/filter/ExceptionHandlingFilter.java | 4 ---- .../com/example/bcsd/global/filter/LogFilter.java | 4 ---- .../example/bcsd/global/filter/LoginCheckFilter.java | 11 +---------- 4 files changed, 5 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/example/bcsd/global/config/WebConfig.java diff --git a/src/main/java/com/example/bcsd/global/config/WebConfig.java b/src/main/java/com/example/bcsd/global/config/WebConfig.java new file mode 100644 index 00000000..19c6b726 --- /dev/null +++ b/src/main/java/com/example/bcsd/global/config/WebConfig.java @@ -0,0 +1,4 @@ +package com.example.bcsd.global.config; + +public class WebConfig { +} diff --git a/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java b/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java index fc0213b1..daf0787d 100644 --- a/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/ExceptionHandlingFilter.java @@ -5,14 +5,10 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -@Component -@Order(1) public class ExceptionHandlingFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { diff --git a/src/main/java/com/example/bcsd/global/filter/LogFilter.java b/src/main/java/com/example/bcsd/global/filter/LogFilter.java index 2d075c24..d4eb1f46 100644 --- a/src/main/java/com/example/bcsd/global/filter/LogFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LogFilter.java @@ -5,16 +5,12 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; import java.io.IOException; @Slf4j -@Component -@Order(3) public class LogFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { diff --git a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java index 560ddf6e..00892062 100644 --- a/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java +++ b/src/main/java/com/example/bcsd/global/filter/LoginCheckFilter.java @@ -7,24 +7,15 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -@Component -@Order(2) public class LoginCheckFilter extends OncePerRequestFilter { private boolean isOpenAPI(HttpServletRequest httpServletRequest) { - String uri = httpServletRequest.getRequestURI(); String method = httpServletRequest.getMethod(); - if (uri.startsWith("/auth")) { - return true; - } - - if (method.equals("GET") && (uri.startsWith("/articles") || uri.startsWith("/boards") || uri.startsWith("/posts"))) { + if (method.equals("GET")) { return true; } From dbee59fd6967c521f43020225fe268b306538332 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 16:55:22 +0900 Subject: [PATCH 140/143] =?UTF-8?q?feat.=20=EB=A9=A4=EB=B2=84=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20DTO=EC=97=90=20role=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/dto/resopnse/MemberResponse.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java index a1138d02..675180d1 100644 --- a/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java +++ b/src/main/java/com/example/bcsd/dto/resopnse/MemberResponse.java @@ -7,13 +7,15 @@ public record MemberResponse( Long id, String name, - String email + String email, + String role ) { public static MemberResponse fromEntity(Member member) { return MemberResponse.builder() .id(member.getId()) .name(member.getName()) .email(member.getEmail()) + .role(member.getRole()) .build(); } } From e049240e4b803b6dc3d4d4aed67e5162cd0d27aa Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 17:27:12 +0900 Subject: [PATCH 141/143] =?UTF-8?q?feat.=20=EC=9D=B8=ED=84=B0=EC=85=89?= =?UTF-8?q?=ED=84=B0=EB=A5=BC=20=ED=86=B5=ED=95=9C=20=EC=9E=90=EC=9B=90?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=8B=9C=20=EC=9D=B8=EA=B0=80=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/global/config/WebConfig.java | 57 ++++++++++++++++- .../global/exception/ExceptionMessage.java | 3 +- .../interceptor/AuthorizationInterceptor.java | 64 +++++++++++++++++++ 3 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java diff --git a/src/main/java/com/example/bcsd/global/config/WebConfig.java b/src/main/java/com/example/bcsd/global/config/WebConfig.java index 19c6b726..56a7599c 100644 --- a/src/main/java/com/example/bcsd/global/config/WebConfig.java +++ b/src/main/java/com/example/bcsd/global/config/WebConfig.java @@ -1,4 +1,59 @@ package com.example.bcsd.global.config; -public class WebConfig { +import com.example.bcsd.global.filter.ExceptionHandlingFilter; +import com.example.bcsd.global.filter.LogFilter; +import com.example.bcsd.global.filter.LoginCheckFilter; +import com.example.bcsd.global.interceptor.AuthorizationInterceptor; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + private final AuthorizationInterceptor authorizationInterceptor; + + public WebConfig(AuthorizationInterceptor authorizationInterceptor) { + this.authorizationInterceptor = authorizationInterceptor; + } + + @Bean + public FilterRegistrationBean exceptionHandlingFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + + registrationBean.setFilter(new ExceptionHandlingFilter()); + registrationBean.addUrlPatterns("/*"); + registrationBean.setOrder(1); + + return registrationBean; + } + + @Bean + public FilterRegistrationBean loginCheckFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + + registrationBean.setFilter(new LoginCheckFilter()); + registrationBean.addUrlPatterns("/articles/*", "/boards/*", "/members/*"); + registrationBean.setOrder(2); + + return registrationBean; + } + + @Bean + public FilterRegistrationBean logFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + + registrationBean.setFilter(new LogFilter()); + registrationBean.addUrlPatterns("/*"); + registrationBean.setOrder(3); + + return registrationBean; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authorizationInterceptor) + .addPathPatterns("/articles/**", "/members/**", "/boards/**"); + } } diff --git a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java index 66379fd1..d108a33c 100644 --- a/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java +++ b/src/main/java/com/example/bcsd/global/exception/ExceptionMessage.java @@ -12,7 +12,8 @@ public enum ExceptionMessage { MEMBER_HAS_ARTICLES(400, "작성한 게시글이 존재하여 삭제할 수 없습니다."), BOARD_NAME_DUPLICATE(409, "이미 존재하는 게시판 이름입니다."), INVALID_PASSWORD(400, "비밀번호가 일치하지 않습니다."), - UNAUTHORIZED_USER(401, "로그인이 필요합니다."); + UNAUTHORIZED_USER(401, "로그인이 필요합니다."), + ACCESS_DENIED(404, "접근 권한이 없습니다."); private final int status; private final String message; diff --git a/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java b/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java new file mode 100644 index 00000000..198abdad --- /dev/null +++ b/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,64 @@ +package com.example.bcsd.global.interceptor; + +import com.example.bcsd.dto.resopnse.ArticleResponse; +import com.example.bcsd.dto.resopnse.MemberResponse; +import com.example.bcsd.global.exception.CustomException; +import com.example.bcsd.global.exception.ExceptionMessage; +import com.example.bcsd.service.ArticleService; +import com.example.bcsd.service.MemberService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +@Component +@RequiredArgsConstructor +public class AuthorizationInterceptor implements HandlerInterceptor { + private final ArticleService articleService; + private final MemberService memberService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String method = request.getMethod(); + String uri = request.getRequestURI(); + + if (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST")) + return true; + + HttpSession session = request.getSession(false); + Long loginUserId = (Long)session.getAttribute("SESSION_ID"); + + MemberResponse loginMember = memberService.getMemberById(loginUserId); + Long targetId = extractIdFromUri(uri); + + if (loginMember.role().equals("admin")) + return true; + + else if (uri.startsWith("/articles/")) { + ArticleResponse article = articleService.getArticleById(targetId); + + if (!article.authorId().equals(loginUserId)) + throw new CustomException(ExceptionMessage.ACCESS_DENIED); + + return true; + } + + else if (uri.startsWith("/members/")) { + MemberResponse member = memberService.getMemberById(targetId); + + if (!member.id().equals(loginUserId)) + throw new CustomException(ExceptionMessage.ACCESS_DENIED); + + return true; + } + + throw new CustomException(ExceptionMessage.ACCESS_DENIED); + } + + public Long extractIdFromUri(String uri) { + String[] segments = uri.split("/"); + return Long.parseLong(segments[segments.length - 1]); + } +} From 2b92f236bd74b1c3ee5c2f9b292736fc17d1b332 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 17:37:43 +0900 Subject: [PATCH 142/143] =?UTF-8?q?fix.=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=97=86=EC=9C=BC=EB=A9=B4=20/members=20?= =?UTF-8?q?=EB=A1=9C=20=EC=9E=90=EC=9B=90=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/interceptor/AuthorizationInterceptor.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java b/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java index 198abdad..77b65c9b 100644 --- a/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java +++ b/src/main/java/com/example/bcsd/global/interceptor/AuthorizationInterceptor.java @@ -24,7 +24,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons String method = request.getMethod(); String uri = request.getRequestURI(); - if (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST")) + if (method.equalsIgnoreCase("GET") || (method.equalsIgnoreCase("POST") && !uri.startsWith("/members"))) return true; HttpSession session = request.getSession(false); @@ -58,7 +58,11 @@ else if (uri.startsWith("/members/")) { } public Long extractIdFromUri(String uri) { - String[] segments = uri.split("/"); - return Long.parseLong(segments[segments.length - 1]); + try { + String[] segments = uri.split("/"); + return Long.parseLong(segments[segments.length - 1]); + } catch (NumberFormatException ex) { + return null; + } } } From 5b62582eff8474badf1d92129580b4d13a0013e6 Mon Sep 17 00:00:00 2001 From: Donghun <2dh2@naver.com> Date: Fri, 27 Jun 2025 17:39:56 +0900 Subject: [PATCH 143/143] =?UTF-8?q?fix.=20=EB=A9=A4=EB=B2=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=8B=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20role=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=EC=97=90=20=EB=94=94=ED=8F=B4=ED=8A=B8=20?= =?UTF-8?q?=EA=B0=92=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/dto/request/MemberRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java index 64a5511a..1a54ae12 100644 --- a/src/main/java/com/example/bcsd/dto/request/MemberRequest.java +++ b/src/main/java/com/example/bcsd/dto/request/MemberRequest.java @@ -30,6 +30,7 @@ public Member toEntity(String encodedPassword) { .name(name) .email(email) .password(encodedPassword) + .role("user") .build(); } }