From b1a531f8663f07cbcda0fece3eb4bc47f842f400 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 20:08:29 +0900 Subject: [PATCH 01/50] =?UTF-8?q?=EC=86=8C=EA=B0=9C=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20html=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/introduce.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/resources/templates/introduce.html diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html new file mode 100644 index 00000000..e149a394 --- /dev/null +++ b/src/main/resources/templates/introduce.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + From 26718ef7896910c017eb0433132d10884f949155 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 20:14:54 +0900 Subject: [PATCH 02/50] =?UTF-8?q?=EC=9E=90=EA=B8=B0=EC=86=8C=EA=B0=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/introduce.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html index e149a394..c82a7802 100644 --- a/src/main/resources/templates/introduce.html +++ b/src/main/resources/templates/introduce.html @@ -2,9 +2,9 @@ - Title + 자기소개 - +

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

From 64943ac5d2bae93305febc74d8eb47bb75909a24 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 20:23:52 +0900 Subject: [PATCH 03/50] =?UTF-8?q?refactor:static=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EB=A5=BC=20=EB=A7=8C=EB=93=A4=EA=B3=A0=20int?= =?UTF-8?q?roduce=20=ED=8C=8C=EC=9D=BC=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/{templates => static}/introduce.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/{templates => static}/introduce.html (100%) diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/static/introduce.html similarity index 100% rename from src/main/resources/templates/introduce.html rename to src/main/resources/static/introduce.html From dd42cc5e2685978983e8cf69194c4a103ef9275f Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 20:47:55 +0900 Subject: [PATCH 04/50] =?UTF-8?q?refactor:=EA=B9=83=ED=97=88=EB=B8=8C?= =?UTF-8?q?=EC=9D=98=20=EC=98=88=EC=8B=9C=EC=BD=94=EB=93=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=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/BcsdApplication.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/BcsdApplication.java b/src/main/java/com/example/bcsd/BcsdApplication.java index 6e3ecb1b..c1d8f85e 100644 --- a/src/main/java/com/example/bcsd/BcsdApplication.java +++ b/src/main/java/com/example/bcsd/BcsdApplication.java @@ -6,8 +6,8 @@ @SpringBootApplication public class BcsdApplication { - public static void main(String[] args) { - SpringApplication.run(BcsdApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(BcsdApplication.class, args); + } } From a77937f13e84ad73f38116352c24b306432c6c3f Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 21:08:29 +0900 Subject: [PATCH 05/50] =?UTF-8?q?fix:Responsebody=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/HelloController.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 9559e2f1..91039afe 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -1,16 +1,19 @@ package com.example.bcsd; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; + +import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { - @ResponseBody - @GetMapping("/hello") - public String hello() { - return "Hello World!!!!!"; + + @GetMapping("/introduce") + public String introduce(@RequestParam("name") String name, Model model) { + model.addAttribute("name", name); + return "introduce"; } @GetMapping("/hello2") From 0eae45b3e236e5dd955105141d97d5eed4e479e4 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 21:08:58 +0900 Subject: [PATCH 06/50] =?UTF-8?q?refactor:name=EC=97=90=20=EC=9B=90?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=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/resources/static/introduce.html | 10 ---------- src/main/resources/templates/introduce.html | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 src/main/resources/static/introduce.html create mode 100644 src/main/resources/templates/introduce.html diff --git a/src/main/resources/static/introduce.html b/src/main/resources/static/introduce.html deleted file mode 100644 index c82a7802..00000000 --- a/src/main/resources/static/introduce.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - 자기소개 - - -

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

- - diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html new file mode 100644 index 00000000..9382a97c --- /dev/null +++ b/src/main/resources/templates/introduce.html @@ -0,0 +1,10 @@ + + + + Getting Started: Serving Web Content + + + +

+ + From b624f9e1ebc5997c68dc8f21a029e0ca098d115d Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 21:10:49 +0900 Subject: [PATCH 07/50] =?UTF-8?q?refactor:=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20","=20=EB=A5=BC=20=EC=A0=9C=EA=B1=B0=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=98=88=EC=8B=9C=EB=8C=80=EB=A1=9C=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EB=90=98=EB=8F=84=EB=A1=9D=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/introduce.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html index 9382a97c..c8cf9f7d 100644 --- a/src/main/resources/templates/introduce.html +++ b/src/main/resources/templates/introduce.html @@ -5,6 +5,6 @@ -

+

From e7da805860d267b9ded078ec23e5299017f1089b Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 21:45:09 +0900 Subject: [PATCH 08/50] =?UTF-8?q?feat:json=EC=9C=BC=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EB=82=BC=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=84=A3=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20java=ED=8C=8C=EC=9D=BC=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 --- src/main/java/com/example/bcsd/Info.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Info.java diff --git a/src/main/java/com/example/bcsd/Info.java b/src/main/java/com/example/bcsd/Info.java new file mode 100644 index 00000000..092fbb25 --- /dev/null +++ b/src/main/java/com/example/bcsd/Info.java @@ -0,0 +1,23 @@ +package com.example.bcsd; + +public class Info { + private int age; + private String name; + + public Info(int age, String name) { + this.age = age; + this.name = name; + } + public int getAge() { + return age; + } + public void setAge(int age) { + this.age = age; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} From 85907c4dbb98341b77d3d3260167434d4faa2d5d Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Tue, 4 Nov 2025 21:46:14 +0900 Subject: [PATCH 09/50] =?UTF-8?q?fix:Responsebody=20=EB=A5=BC=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EB=84=A3=EA=B3=A0=20=EC=83=88=EB=A1=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=9C=20Info=20=ED=8C=8C=EC=9D=BC=20json=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=A0=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=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/HelloController.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 91039afe..3252c76e 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -3,17 +3,18 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { - - @GetMapping("/introduce") - public String introduce(@RequestParam("name") String name, Model model) { - model.addAttribute("name", name); - return "introduce"; + @ResponseBody + @GetMapping("/json") + public Info json() { + Info info = new Info(22,"김성은"); + return info; } @GetMapping("/hello2") From bd41897e98ee77ce393f6447f9daad01ef6dc460 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 16:35:37 +0900 Subject: [PATCH 10/50] =?UTF-8?q?refactor:=EA=B2=BD=EB=A1=9C=EB=A5=BC=20ar?= =?UTF-8?q?ticle=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B3=A0=20GET?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=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 --- src/main/java/com/example/bcsd/HelloController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 3252c76e..a65d73a9 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -5,13 +5,14 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; -@Controller +@RestController +@RequestMapping("/article") public class HelloController { @ResponseBody - @GetMapping("/json") + @GetMapping("/{id}") public Info json() { Info info = new Info(22,"김성은"); return info; From d0ef4bdf3dcd28af9f639d8661c3b07c62d0ab5c Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:10:36 +0900 Subject: [PATCH 11/50] =?UTF-8?q?refactor:=EA=B2=BD=EB=A1=9C=EB=A5=BC=20ar?= =?UTF-8?q?ticle=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/Article.java | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Article.java diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java new file mode 100644 index 00000000..39e947a0 --- /dev/null +++ b/src/main/java/com/example/bcsd/Article.java @@ -0,0 +1,24 @@ +package com.example.bcsd; + +public class Article { + private int id; + private String description; + + public Article(int id, String description) { + this.id = id; + this.description = description; + } + public int getId(){ + return id; + } + + public String getDescription(){ + return description; + } + public void setId(int id){ + this.id = id; + } + public void setDescription(String description){ + this.description = description; + } +} From da803f4557d5a5f575b7ae7b0df05dee78c22fd2 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:16:24 +0900 Subject: [PATCH 12/50] =?UTF-8?q?feat:=20map=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/HelloController.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index a65d73a9..2ec5bd67 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -1,5 +1,7 @@ package com.example.bcsd; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -7,6 +9,9 @@ import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.Map; + @RestController @RequestMapping("/article") public class HelloController { @@ -22,4 +27,15 @@ public Info json() { public String hello2() { return "hello"; } + + private Map articleMap = new HashMap<>(); + private int newId = 1; + + @PostMapping + public ResponseEntity

postArticle(@RequestBody Article article) { + article.setId(newId++); + articleMap.put(article.getId(), article); + + return new ResponseEntity<>(article,HttpStatus.CREATED); + } } From cbc4286a59b04756a133834f23956c743af5e7c7 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:31:59 +0900 Subject: [PATCH 13/50] =?UTF-8?q?feat:=20put=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/HelloController.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 2ec5bd67..0171258b 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -2,8 +2,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @@ -38,4 +36,19 @@ public ResponseEntity
postArticle(@RequestBody Article article) { return new ResponseEntity<>(article,HttpStatus.CREATED); } + @PutMapping("/{id}") + public ResponseEntity
putArticle( + @PathVariable int id, + @RequestBody Article updated + ) { + Article existing = articleMap.get(id); + + if (existing == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + existing.setDescription(updated.getDescription()); + return new ResponseEntity<>(existing, HttpStatus.OK); + } + } From 0f5453e8cf294e05d3d6999065bb2e74ce8eb03e Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:35:14 +0900 Subject: [PATCH 14/50] =?UTF-8?q?feat:=20delete=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=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/HelloController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 0171258b..8ea2f0b8 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -50,5 +50,14 @@ public ResponseEntity
putArticle( existing.setDescription(updated.getDescription()); return new ResponseEntity<>(existing, HttpStatus.OK); } + @DeleteMapping("/{id}") + public ResponseEntity deleteArticle(@PathVariable int id) { + Article removed = articleMap.remove(id); + + if(removed == null){ + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(HttpStatus.OK); + } } From a3afff3989fdfa68dd797c33eb3e135319de2397 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:39:22 +0900 Subject: [PATCH 15/50] =?UTF-8?q?fix:=20delete=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=83=9D=EC=84=B1=EC=97=90=EC=84=9C=20NO=5FCONTENT?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=88=EB=9D=BC=20OK=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=ED=95=B4=EB=86=A8=EB=8D=98=20=EA=B2=83?= =?UTF-8?q?=EC=9D=84=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/HelloController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 8ea2f0b8..135fb182 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -57,7 +57,7 @@ public ResponseEntity deleteArticle(@PathVariable int id) { if(removed == null){ return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<>(HttpStatus.OK); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } From 60d42316f9f2e8ce3ae1e95c66d320f89b64b2c7 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 9 Nov 2025 17:44:13 +0900 Subject: [PATCH 16/50] =?UTF-8?q?fix:=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=9A=94=EC=B2=AD=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EC=97=90=20=EB=8C=80=ED=95=9C=20not=5Ffound=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=EC=9D=B4=20=EB=B9=A0=EC=A0=B8=EC=9E=88?= =?UTF-8?q?=EC=97=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/HelloController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/bcsd/HelloController.java b/src/main/java/com/example/bcsd/HelloController.java index 135fb182..98b6432c 100644 --- a/src/main/java/com/example/bcsd/HelloController.java +++ b/src/main/java/com/example/bcsd/HelloController.java @@ -16,9 +16,13 @@ public class HelloController { @ResponseBody @GetMapping("/{id}") - public Info json() { - Info info = new Info(22,"김성은"); - return info; + public ResponseEntity
getArticle(@PathVariable int id) { + Article article = articleMap.get(id); + + if(article == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(article, HttpStatus.OK); } @GetMapping("/hello2") From c0ad65b76a88e8d36bd33b92b183a08ccc4bfd2a Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 16 Nov 2025 19:46:33 +0900 Subject: [PATCH 17/50] =?UTF-8?q?refactor:=20model=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EB=A7=8C=EB=93=A4=EA=B3=A0=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 --- src/main/java/com/example/bcsd/Article.java | 24 ------------------- .../java/com/example/bcsd/model/Article.java | 15 ++++++++++++ 2 files changed, 15 insertions(+), 24 deletions(-) delete mode 100644 src/main/java/com/example/bcsd/Article.java create mode 100644 src/main/java/com/example/bcsd/model/Article.java diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java deleted file mode 100644 index 39e947a0..00000000 --- a/src/main/java/com/example/bcsd/Article.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.bcsd; - -public class Article { - private int id; - private String description; - - public Article(int id, String description) { - this.id = id; - this.description = description; - } - public int getId(){ - return id; - } - - public String getDescription(){ - return description; - } - public void setId(int id){ - this.id = id; - } - public void setDescription(String description){ - this.description = description; - } -} 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..1eaa4caf --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -0,0 +1,15 @@ +package com.example.bcsd.model; + +public class Article { + private Long id; + private String authorID; + private String boardID; + private String title; + private String description; + private String createDay; + private String updateDay; + + + + +} From 1d241576053288e44a789ea848abf043b6739a17 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 16 Nov 2025 19:47:43 +0900 Subject: [PATCH 18/50] =?UTF-8?q?feat:=20Board=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/Board.java | 19 +++++++++++++++++++ 1 file changed, 19 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..0271b289 --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -0,0 +1,19 @@ +package com.example.bcsd.model; + +public class Board { + private Long id; + private String BoardTitle; + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getBoardTitle() { + return BoardTitle; + } + public void setBoardTitle(String boardTitle) { + BoardTitle = boardTitle; + } +} From 506ad173d0ee63605cb72d497da21c66832b9f75 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sun, 16 Nov 2025 19:47:56 +0900 Subject: [PATCH 19/50] =?UTF-8?q?feat:=20Member=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/Member.java | 38 +++++++++++++++++++ 1 file changed, 38 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..1ac7b661 --- /dev/null +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -0,0 +1,38 @@ +package com.example.bcsd.model; + +public class Member { + private Long id; + private String name; + private String email; + private String password; + + public Member(Long id, String name, String email, String password) { + this.id = id; + this.name = name; + this.email = email; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } +} From e86ebd9157385f0d1b82970c0b226e379322d019 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 20:50:14 +0900 Subject: [PATCH 20/50] =?UTF-8?q?feat:=20=EB=A6=AC=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Repository/ArticleRepository.java | 54 ++++++++++++++++ .../bcsd/Repository/BoardRepository.java | 61 ++++++++++++++++++ .../bcsd/Repository/MemberRepository.java | 60 ++++++++++++++++++ .../java/com/example/bcsd/model/Article.java | 63 +++++++++++++++++-- 4 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/example/bcsd/Repository/ArticleRepository.java create mode 100644 src/main/java/com/example/bcsd/Repository/BoardRepository.java create mode 100644 src/main/java/com/example/bcsd/Repository/MemberRepository.java 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..69479e0a --- /dev/null +++ b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java @@ -0,0 +1,54 @@ +package com.example.bcsd.Repository; + +import java.util.List; +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicLong; + +import com.example.bcsd.model.Article; +import org.springframework.stereotype.Repository; + +@Repository +public class ArticleRepository { + private List
articles = new ArrayList<>(); + private AtomicLong counter = new AtomicLong(0); + + public List
findAll() { + return articles; + } + public Article findById(Long id) { + for (Article article : articles) { + if (article.getId().equals(id)) { + return article; + } + } + return null; + } + public Article findByTitle(String title) { + for (Article article : articles) { + if (article.getTitle().equals(title)) { + return article; + } + } + return null; + } + public void save(Article article) { + if(article.getId() == null) { + article.setId(counter.incrementAndGet()); + } + articles.add(article); + } + public void update(Article article) { + for(int i = 0; i boards = new ArrayList<>(); + private final AtomicLong counter = new AtomicLong(0); + + public List findAll() { + return boards; + } + + public Board findById(Long id) { + for (Board board : boards) { + if (board.getId().equals(id)) { + return board; + } + } + return null; + } + + public Board findByTitle(String title) { + for (Board board : boards) { + if (board.getBoardTitle().equals(title)) { + return board; + } + } + return null; + } + + public void save(Board board) { + + if (board.getId() == null) { + board.setId(counter.incrementAndGet()); + } + boards.add(board); + } + + public void update(Board board) { + for (int i = 0; i < boards.size(); i++) { + if (boards.get(i).getId().equals(board.getId())) { + boards.set(i, board); + return; + } + } + } + + public void delete(Long id) { + Board board = findById(id); + if (board != null) { + boards.remove(board); + } + } +} 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..5d8d5116 --- /dev/null +++ b/src/main/java/com/example/bcsd/Repository/MemberRepository.java @@ -0,0 +1,60 @@ +package com.example.bcsd.Repository; + +import com.example.bcsd.model.Member; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +@Repository +public class MemberRepository { + + private final List members = new ArrayList<>(); + private final AtomicLong counter = new AtomicLong(0); + + public List findAll() { + return members; + } + + public Member findById(Long id) { + for (Member m : members) { + if (m.getId().equals(id)) { + return m; + } + } + return null; + } + + public Member findByEmail(String email) { + for (Member m : members) { + if (m.getEmail().equals(email)) { + return m; + } + } + return null; + } + + public void save(Member member) { + if (member.getId() == null) { + member.setId(counter.incrementAndGet()); + } + members.add(member); + } + + public void update(Member member) { + for (int i = 0; i < members.size(); i++) { + if (members.get(i).getId().equals(member.getId())) { + members.set(i, member); + return; + } + } + } + + public void delete(Long id) { + Member m = findById(id); + if (m != null) { + members.remove(m); + } + } +} diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 1eaa4caf..aeed5a01 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,15 +1,66 @@ package com.example.bcsd.model; +import java.time.LocalDateTime; public class Article { private Long id; - private String authorID; - private String boardID; + private Long authorID; + private Long boardID; private String title; private String description; - private String createDay; - private String updateDay; - - + private LocalDateTime createDay; + private LocalDateTime updateDay; + public Article(Long id, Long authorID, Long boardID, String title, + String description) { + this.id = id; + this.authorID = authorID; + this.boardID = boardID; + this.title = title; + this.description = description; + this.createDay = LocalDateTime.now(); + this.updateDay = LocalDateTime.now(); + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public Long getAuthorID() { + return authorID; + } + public void setAuthorID(Long authorID) { + this.authorID = authorID; +} +public Long getBoardID() { + return boardID; +} +public void setBoardID(Long boardID) { + this.boardID = boardID; +} +public String getTitle() { + return title; +} +public void setTitle(String title) { + this.title = title; } +public String getDescription() { + return description; +} +public void setDescription(String description) { + this.description = description; +} +public LocalDateTime getCreateDay() { + return createDay; +} +public void setCreateDay(LocalDateTime createDay) { + this.createDay = createDay; +} +public LocalDateTime getUpdateDay() { + return updateDay; +} +public void setUpdateDay(LocalDateTime updateDay) { + this.updateDay = updateDay; +} +} From 276a303dd4dc00c9b85092aff7bccb8885556bec Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 21:00:24 +0900 Subject: [PATCH 21/50] =?UTF-8?q?feat:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/Service/ArticleService.java | 44 +++++++++++++++++ .../example/bcsd/Service/BoardService.java | 46 ++++++++++++++++++ .../example/bcsd/Service/MemberService.java | 48 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Service/ArticleService.java create mode 100644 src/main/java/com/example/bcsd/Service/BoardService.java create mode 100644 src/main/java/com/example/bcsd/Service/MemberService.java 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..2fade427 --- /dev/null +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -0,0 +1,44 @@ +package com.example.bcsd.Service; + +import java.util.List; + +import com.example.bcsd.Repository.ArticleRepository; +import com.example.bcsd.model.Article; +import org.springframework.stereotype.Service; + +@Service +public class ArticleService { + private final ArticleRepository articleRepository; + + public ArticleService(ArticleRepository articleRepository) { + this.articleRepository = articleRepository; + } + public Article createArticle(Article article) { + articleRepository.save(article); + return article; + } + public List
getAllArticles() { + return articleRepository.findAll(); + } + + public Article getArticleById(Long id) { + return articleRepository.findById(id); + } + + public Article updateArticle(Article article) { + Article existingArticle = articleRepository.findById(article.getId()); + if (existingArticle == null) { + return null; + } + existingArticle.setTitle(article.getTitle()); + existingArticle.setDescription(article.getDescription()); + existingArticle.setCreateDay(article.getCreateDay()); + existingArticle.setUpdateDay(article.getUpdateDay()); + existingArticle.setBoardID(article.getBoardID()); + return existingArticle; + } + + public void deleteArticleById(Long id) { + articleRepository.delete(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..54370892 --- /dev/null +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -0,0 +1,46 @@ +package com.example.bcsd.Service; + +import com.example.bcsd.Repository.BoardRepository; +import com.example.bcsd.model.Board; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BoardService { + + private final BoardRepository boardRepository; + + public BoardService(BoardRepository boardRepository) { + this.boardRepository = boardRepository; + } + + public Board createBoard(Board board) { + boardRepository.save(board); + return board; + } + + public List getAllBoards() { + return boardRepository.findAll(); + } + + public Board getBoardById(Long id) { + return boardRepository.findById(id); + } + + public Board updateBoard(Board board) { + Board existing = boardRepository.findById(board.getId()); + if (existing == null) { + return null; + } + + existing.setBoardTitle(board.getBoardTitle()); + boardRepository.update(existing); + + return existing; + } + + public void deleteBoardById(Long id) { + boardRepository.delete(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..06c92bd9 --- /dev/null +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -0,0 +1,48 @@ +package com.example.bcsd.Service; + +import com.example.bcsd.Repository.MemberRepository; +import com.example.bcsd.model.Member; +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 Member createMember(Member member) { + memberRepository.save(member); + return member; + } + + public List getAllMembers() { + return memberRepository.findAll(); + } + + public Member getMemberById(Long id) { + return memberRepository.findById(id); + } + + public Member updateMember(Member member) { + Member existing = memberRepository.findById(member.getId()); + if (existing == null) { + return null; + } + + existing.setName(member.getName()); + existing.setEmail(member.getEmail()); + existing.setPassword(member.getPassword()); + + memberRepository.update(existing); + return existing; + } + + public void deleteMember(Long id) { + memberRepository.delete(id); + } +} From b8f0a76081ab7b050965c690a27bb764080855d5 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 21:00:37 +0900 Subject: [PATCH 22/50] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/ArticleController.java | 42 ++++++++++++++++++ .../bcsd/Controller/BoardController.java | 44 +++++++++++++++++++ .../bcsd/Controller/MemberController.java | 44 +++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Controller/ArticleController.java create mode 100644 src/main/java/com/example/bcsd/Controller/BoardController.java create mode 100644 src/main/java/com/example/bcsd/Controller/MemberController.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..39d263d3 --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/ArticleController.java @@ -0,0 +1,42 @@ +package com.example.bcsd.Controller; + +import com.example.bcsd.Service.ArticleService; +import com.example.bcsd.model.Article; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/articles") +public class ArticleController { + + private final ArticleService articleService; + + public ArticleController(ArticleService articleService) { + this.articleService = articleService; + } + @PostMapping + public Article createArticle(@RequestBody Article article) { + return articleService.createArticle(article); + } + @GetMapping + public List
getAllArticles() { + return articleService.getAllArticles(); + } + @GetMapping("/{id}") + public Article getArticleById(@PathVariable long id) { + return articleService.getArticleById(id); + } + @PutMapping("/{id}") + public Article updateArticle(@PathVariable long id, @RequestBody Article article) { + article.setId(id); + return articleService.updateArticle(article); + } + @DeleteMapping("/{id}") + public void deleteArticleById(@PathVariable long id) { + articleService.deleteArticleById(id); + } + +} 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..3efef5a2 --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/BoardController.java @@ -0,0 +1,44 @@ +package com.example.bcsd.Controller; + +import com.example.bcsd.Service.BoardService; +import com.example.bcsd.model.Board; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/boards") +public class BoardController { + + private final BoardService boardService; + + public BoardController(BoardService boardService) { + this.boardService = boardService; + } + + @PostMapping + public Board createBoard(@RequestBody Board board) { + return boardService.createBoard(board); + } + + @GetMapping + public List getAllBoards() { + return boardService.getAllBoards(); + } + + @GetMapping("/{id}") + public Board getBoardById(@PathVariable Long id) { + return boardService.getBoardById(id); + } + + @PutMapping("/{id}") + public Board updateBoard(@PathVariable Long id, @RequestBody Board board) { + board.setId(id); + return boardService.updateBoard(board); + } + + @DeleteMapping("/{id}") + public void deleteBoard(@PathVariable Long id) { + boardService.deleteBoardById(id); + } +} 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..66280822 --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/MemberController.java @@ -0,0 +1,44 @@ +package com.example.bcsd.Controller; + +import com.example.bcsd.Service.MemberService; +import com.example.bcsd.model.Member; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/members") +public class MemberController { + + private final MemberService memberService; + + public MemberController(MemberService memberService) { + this.memberService = memberService; + } + + @PostMapping + public Member createMember(@RequestBody Member member) { + return memberService.createMember(member); + } + + @GetMapping + public List getAllMembers() { + return memberService.getAllMembers(); + } + + @GetMapping("/{id}") + public Member getMemberById(@PathVariable Long id) { + return memberService.getMemberById(id); + } + + @PutMapping("/{id}") + public Member updateMember(@PathVariable Long id, @RequestBody Member member) { + member.setId(id); + return memberService.updateMember(member); + } + + @DeleteMapping("/{id}") + public void deleteMember(@PathVariable Long id) { + memberService.deleteMember(id); + } +} From 03928743643116d659bed305394bc08a6b50b28e Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 21:01:21 +0900 Subject: [PATCH 23/50] =?UTF-8?q?refactor:=20get,set=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=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 --- src/main/java/com/example/bcsd/model/Member.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index 1ac7b661..792ffb8b 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -10,6 +10,7 @@ public Member(Long id, String name, String email, String password) { this.id = id; this.name = name; this.email = email; + this.password = password; } public Long getId() { return id; From 8c45cc50cb9f69aeafca0930202065e9c3423f04 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 21:01:46 +0900 Subject: [PATCH 24/50] =?UTF-8?q?feat:=20post=20html=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/posts.html | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/resources/templates/posts.html diff --git a/src/main/resources/templates/posts.html b/src/main/resources/templates/posts.html new file mode 100644 index 00000000..b295750e --- /dev/null +++ b/src/main/resources/templates/posts.html @@ -0,0 +1,33 @@ + + + + + 자유게시판 + + + + +

자유게시판

+ +
+ +
제목
+ +
+ + | + 날짜 +
+ +
+
+ + + From 1775590c761fea73fa187239e0656be4ec856092 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 17 Nov 2025 21:02:06 +0900 Subject: [PATCH 25/50] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/PostViewController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) 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..8b257115 --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/PostViewController.java @@ -0,0 +1,26 @@ +package com.example.bcsd.Controller; + +import com.example.bcsd.Service.ArticleService; +import com.example.bcsd.Service.MemberService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class PostViewController { + + private final ArticleService articleService; + private final MemberService memberService; + + public PostViewController(ArticleService articleService, MemberService memberService) { + this.articleService = articleService; + this.memberService = memberService; + } + + @GetMapping("/posts") + public String posts(Model model) { + model.addAttribute("articles", articleService.getAllArticles()); + model.addAttribute("members", memberService.getAllMembers()); + return "posts"; // templates/posts.html + } +} From 047ea4e339fbe9fb1bbecfe6e8a10257328e81e1 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Sat, 22 Nov 2025 00:45:08 +0900 Subject: [PATCH 26/50] =?UTF-8?q?feat:=20sql=EA=B2=BD=EB=A1=9C=20=EC=B0=BE?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=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, 2 insertions(+) diff --git a/build.gradle b/build.gradle index db3ebcf1..3d0018e9 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'mysql:mysql-connector-java:8.0.33' + } tasks.named('test') { From b10898db004b7324b85529b34d6c8a828c6802a7 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 16:16:31 +0900 Subject: [PATCH 27/50] =?UTF-8?q?refactor:=20jdbc=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20DB=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/ArticleController.java | 40 +++++---- .../bcsd/Controller/BoardController.java | 34 ++++---- .../bcsd/Controller/MemberController.java | 32 ++++--- .../bcsd/Repository/ArticleRepository.java | 87 +++++++++++-------- .../bcsd/Repository/BoardRepository.java | 63 ++++++-------- .../bcsd/Repository/MemberRepository.java | 71 +++++++-------- .../example/bcsd/Service/ArticleService.java | 34 ++++---- .../example/bcsd/Service/BoardService.java | 24 ++--- .../example/bcsd/Service/MemberService.java | 24 ++--- .../java/com/example/bcsd/model/Article.java | 79 +++++++---------- .../java/com/example/bcsd/model/Board.java | 17 ++-- .../java/com/example/bcsd/model/Member.java | 38 +++----- 12 files changed, 258 insertions(+), 285 deletions(-) diff --git a/src/main/java/com/example/bcsd/Controller/ArticleController.java b/src/main/java/com/example/bcsd/Controller/ArticleController.java index 39d263d3..8d0f354a 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.Service.ArticleService; import com.example.bcsd.model.Article; - -import org.springframework.beans.factory.annotation.Autowired; +import com.example.bcsd.Service.ArticleService; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -11,32 +10,39 @@ @RestController @RequestMapping("/articles") public class ArticleController { - private final ArticleService articleService; public ArticleController(ArticleService articleService) { this.articleService = articleService; } - @PostMapping - public Article createArticle(@RequestBody Article article) { - return articleService.createArticle(article); - } + @GetMapping - public List
getAllArticles() { - return articleService.getAllArticles(); + public ResponseEntity> getAllArticles() { + return ResponseEntity.ok(articleService.getAllArticles()); } + @GetMapping("/{id}") - public Article getArticleById(@PathVariable long id) { - return articleService.getArticleById(id); + public ResponseEntity
getArticleById(@PathVariable Long id) { + Article article = articleService.getArticleById(id); + return ResponseEntity.ok(article); + } + + @PostMapping + public ResponseEntity createArticle(@RequestBody Article article) { + articleService.createArticle(article); + return ResponseEntity.ok().build(); } + @PutMapping("/{id}") - public Article updateArticle(@PathVariable long id, @RequestBody Article article) { + public ResponseEntity updateArticle(@PathVariable Long id, @RequestBody Article article) { article.setId(id); - return articleService.updateArticle(article); + articleService.updateArticle(article); + return ResponseEntity.ok().build(); } + @DeleteMapping("/{id}") - public void deleteArticleById(@PathVariable long id) { - articleService.deleteArticleById(id); + public ResponseEntity deleteArticle(@PathVariable Long id) { + articleService.deleteArticle(id); + return ResponseEntity.ok().build(); } - } diff --git a/src/main/java/com/example/bcsd/Controller/BoardController.java b/src/main/java/com/example/bcsd/Controller/BoardController.java index 3efef5a2..a24a3d06 100644 --- a/src/main/java/com/example/bcsd/Controller/BoardController.java +++ b/src/main/java/com/example/bcsd/Controller/BoardController.java @@ -1,7 +1,8 @@ package com.example.bcsd.Controller; -import com.example.bcsd.Service.BoardService; import com.example.bcsd.model.Board; +import com.example.bcsd.Service.BoardService; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -9,36 +10,39 @@ @RestController @RequestMapping("/boards") public class BoardController { - private final BoardService boardService; public BoardController(BoardService boardService) { this.boardService = boardService; } - @PostMapping - public Board createBoard(@RequestBody Board board) { - return boardService.createBoard(board); - } - @GetMapping - public List getAllBoards() { - return boardService.getAllBoards(); + public ResponseEntity> getAllBoards() { + return ResponseEntity.ok(boardService.getAllBoards()); } @GetMapping("/{id}") - public Board getBoardById(@PathVariable Long id) { - return boardService.getBoardById(id); + public ResponseEntity getBoardById(@PathVariable Long id) { + Board board = boardService.getBoardById(id); + return ResponseEntity.ok(board); + } + + @PostMapping + public ResponseEntity createBoard(@RequestBody Board board) { + boardService.createBoard(board); + return ResponseEntity.ok().build(); } @PutMapping("/{id}") - public Board updateBoard(@PathVariable Long id, @RequestBody Board board) { + public ResponseEntity updateBoard(@PathVariable Long id, @RequestBody Board board) { board.setId(id); - return boardService.updateBoard(board); + boardService.updateBoard(board); + return ResponseEntity.ok().build(); } @DeleteMapping("/{id}") - public void deleteBoard(@PathVariable Long id) { - boardService.deleteBoardById(id); + public ResponseEntity deleteBoard(@PathVariable Long id) { + boardService.deleteBoard(id); + return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/example/bcsd/Controller/MemberController.java b/src/main/java/com/example/bcsd/Controller/MemberController.java index 66280822..dd9469d0 100644 --- a/src/main/java/com/example/bcsd/Controller/MemberController.java +++ b/src/main/java/com/example/bcsd/Controller/MemberController.java @@ -1,7 +1,8 @@ package com.example.bcsd.Controller; -import com.example.bcsd.Service.MemberService; import com.example.bcsd.model.Member; +import com.example.bcsd.Service.MemberService; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -9,36 +10,39 @@ @RestController @RequestMapping("/members") public class MemberController { - private final MemberService memberService; public MemberController(MemberService memberService) { this.memberService = memberService; } - @PostMapping - public Member createMember(@RequestBody Member member) { - return memberService.createMember(member); - } - @GetMapping - public List getAllMembers() { - return memberService.getAllMembers(); + public ResponseEntity> getAllMembers() { + return ResponseEntity.ok(memberService.getAllMembers()); } @GetMapping("/{id}") - public Member getMemberById(@PathVariable Long id) { - return memberService.getMemberById(id); + public ResponseEntity getMemberById(@PathVariable Long id) { + Member member = memberService.getMemberById(id); + return ResponseEntity.ok(member); + } + + @PostMapping + public ResponseEntity createMember(@RequestBody Member member) { + memberService.createMember(member); + return ResponseEntity.ok().build(); } @PutMapping("/{id}") - public Member updateMember(@PathVariable Long id, @RequestBody Member member) { + public ResponseEntity updateMember(@PathVariable Long id, @RequestBody Member member) { member.setId(id); - return memberService.updateMember(member); + memberService.updateMember(member); + return ResponseEntity.ok().build(); } @DeleteMapping("/{id}") - public void deleteMember(@PathVariable Long id) { + public ResponseEntity deleteMember(@PathVariable Long id) { memberService.deleteMember(id); + return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java index 69479e0a..26927311 100644 --- a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java @@ -1,54 +1,71 @@ package com.example.bcsd.Repository; -import java.util.List; -import java.util.ArrayList; -import java.util.concurrent.atomic.AtomicLong; - import com.example.bcsd.model.Article; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + @Repository public class ArticleRepository { - private List
articles = new ArrayList<>(); - private AtomicLong counter = new AtomicLong(0); + private final JdbcTemplate jdbcTemplate; - public List
findAll() { - return articles; + public ArticleRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } - public Article findById(Long id) { - for (Article article : articles) { - if (article.getId().equals(id)) { - return article; - } + + private final RowMapper
articleRowMapper = new RowMapper
() { + @Override + public Article mapRow(ResultSet rs, int rowNum) throws SQLException { + Article article = new Article(); + article.setId(rs.getLong("id")); + article.setAuthorID(rs.getLong("author_id")); + article.setBoardID(rs.getLong("board_id")); + article.setTitle(rs.getString("title")); + article.setContent(rs.getString("content")); + article.setCreatedDate(rs.getTimestamp("created_date").toLocalDateTime()); + article.setModifiedDate(rs.getTimestamp("modified_date").toLocalDateTime()); + return article; } - return null; + }; + + public List
findAll() { + String sql = "SELECT * FROM article"; + return jdbcTemplate.query(sql, articleRowMapper); } - public Article findByTitle(String title) { - for (Article article : articles) { - if (article.getTitle().equals(title)) { - return article; - } - } - return null; + + public Article findById(Long id) { + String sql = "SELECT * FROM article WHERE id = ?"; + return jdbcTemplate.queryForObject(sql, articleRowMapper, id); } + public void save(Article article) { - if(article.getId() == null) { - article.setId(counter.incrementAndGet()); - } - articles.add(article); + String sql = "INSERT INTO article (author_id, board_id, title, content, created_date, modified_date) VALUES (?, ?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + article.getAuthorID(), + article.getBoardID(), + article.getTitle(), + article.getContent(), + article.getCreatedDate(), + article.getModifiedDate()); } + public void update(Article article) { - for(int i = 0; i boards = new ArrayList<>(); - private final AtomicLong counter = new AtomicLong(0); - - public List findAll() { - return boards; + public BoardRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } - public Board findById(Long id) { - for (Board board : boards) { - if (board.getId().equals(id)) { - return board; - } + private final RowMapper boardRowMapper = new RowMapper() { + @Override + public Board mapRow(ResultSet rs, int rowNum) throws SQLException { + Board board = new Board(); + board.setId(rs.getLong("id")); + board.setName(rs.getString("name")); + return board; } - return null; + }; + + public List findAll() { + String sql = "SELECT * FROM board"; + return jdbcTemplate.query(sql, boardRowMapper); } - public Board findByTitle(String title) { - for (Board board : boards) { - if (board.getBoardTitle().equals(title)) { - return board; - } - } - return null; + public Board findById(Long id) { + String sql = "SELECT * FROM board WHERE id = ?"; + return jdbcTemplate.queryForObject(sql, boardRowMapper, id); } public void save(Board board) { - - if (board.getId() == null) { - board.setId(counter.incrementAndGet()); - } - boards.add(board); + String sql = "INSERT INTO board (name) VALUES (?)"; + jdbcTemplate.update(sql, board.getName()); } public void update(Board board) { - for (int i = 0; i < boards.size(); i++) { - if (boards.get(i).getId().equals(board.getId())) { - boards.set(i, board); - return; - } - } + String sql = "UPDATE board SET name = ? WHERE id = ?"; + jdbcTemplate.update(sql, board.getName(), board.getId()); } public void delete(Long id) { - Board board = findById(id); - if (board != null) { - boards.remove(board); - } + String sql = "DELETE FROM board WHERE id = ?"; + jdbcTemplate.update(sql, id); } } diff --git a/src/main/java/com/example/bcsd/Repository/MemberRepository.java b/src/main/java/com/example/bcsd/Repository/MemberRepository.java index 5d8d5116..651c5d4b 100644 --- a/src/main/java/com/example/bcsd/Repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/Repository/MemberRepository.java @@ -1,60 +1,63 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Member; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import java.util.ArrayList; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.List; -import java.util.concurrent.atomic.AtomicLong; @Repository public class MemberRepository { + private final JdbcTemplate jdbcTemplate; - private final List members = new ArrayList<>(); - private final AtomicLong counter = new AtomicLong(0); - - public List findAll() { - return members; + public MemberRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } - public Member findById(Long id) { - for (Member m : members) { - if (m.getId().equals(id)) { - return m; - } + private final RowMapper memberRowMapper = new RowMapper() { + @Override + public Member mapRow(ResultSet rs, int rowNum) throws SQLException { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + member.setEmail(rs.getString("email")); + member.setPassword(rs.getString("password")); + return member; } - return null; + }; + + public List findAll() { + String sql = "SELECT * FROM member"; + return jdbcTemplate.query(sql, memberRowMapper); } - public Member findByEmail(String email) { - for (Member m : members) { - if (m.getEmail().equals(email)) { - return m; - } - } - return null; + public Member findById(Long id) { + String sql = "SELECT * FROM member WHERE id = ?"; + return jdbcTemplate.queryForObject(sql, memberRowMapper, id); } public void save(Member member) { - if (member.getId() == null) { - member.setId(counter.incrementAndGet()); - } - members.add(member); + String sql = "INSERT INTO member (name, email, password) VALUES (?, ?, ?)"; + jdbcTemplate.update(sql, + member.getName(), + member.getEmail(), + member.getPassword()); } public void update(Member member) { - for (int i = 0; i < members.size(); i++) { - if (members.get(i).getId().equals(member.getId())) { - members.set(i, member); - return; - } - } + String sql = "UPDATE member SET name = ?, email = ?, password = ? WHERE id = ?"; + jdbcTemplate.update(sql, + member.getName(), + member.getEmail(), + member.getPassword(), + member.getId()); } public void delete(Long id) { - Member m = findById(id); - if (m != null) { - members.remove(m); - } + String sql = "DELETE FROM member WHERE id = ?"; + jdbcTemplate.update(sql, id); } } diff --git a/src/main/java/com/example/bcsd/Service/ArticleService.java b/src/main/java/com/example/bcsd/Service/ArticleService.java index 2fade427..a515a02b 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -1,11 +1,12 @@ package com.example.bcsd.Service; -import java.util.List; - -import com.example.bcsd.Repository.ArticleRepository; import com.example.bcsd.model.Article; +import com.example.bcsd.Repository.ArticleRepository; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; + @Service public class ArticleService { private final ArticleRepository articleRepository; @@ -13,10 +14,7 @@ public class ArticleService { public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } - public Article createArticle(Article article) { - articleRepository.save(article); - return article; - } + public List
getAllArticles() { return articleRepository.findAll(); } @@ -25,20 +23,18 @@ public Article getArticleById(Long id) { return articleRepository.findById(id); } - public Article updateArticle(Article article) { - Article existingArticle = articleRepository.findById(article.getId()); - if (existingArticle == null) { - return null; - } - existingArticle.setTitle(article.getTitle()); - existingArticle.setDescription(article.getDescription()); - existingArticle.setCreateDay(article.getCreateDay()); - existingArticle.setUpdateDay(article.getUpdateDay()); - existingArticle.setBoardID(article.getBoardID()); - return existingArticle; + public void createArticle(Article article) { + article.setCreatedDate(LocalDateTime.now()); + article.setModifiedDate(LocalDateTime.now()); + articleRepository.save(article); + } + + public void updateArticle(Article article) { + article.setModifiedDate(LocalDateTime.now()); + articleRepository.update(article); } - public void deleteArticleById(Long id) { + public void deleteArticle(Long id) { articleRepository.delete(id); } } diff --git a/src/main/java/com/example/bcsd/Service/BoardService.java b/src/main/java/com/example/bcsd/Service/BoardService.java index 54370892..7d370435 100644 --- a/src/main/java/com/example/bcsd/Service/BoardService.java +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -1,25 +1,19 @@ package com.example.bcsd.Service; -import com.example.bcsd.Repository.BoardRepository; import com.example.bcsd.model.Board; +import com.example.bcsd.Repository.BoardRepository; import org.springframework.stereotype.Service; import java.util.List; @Service public class BoardService { - private final BoardRepository boardRepository; public BoardService(BoardRepository boardRepository) { this.boardRepository = boardRepository; } - public Board createBoard(Board board) { - boardRepository.save(board); - return board; - } - public List getAllBoards() { return boardRepository.findAll(); } @@ -28,19 +22,15 @@ public Board getBoardById(Long id) { return boardRepository.findById(id); } - public Board updateBoard(Board board) { - Board existing = boardRepository.findById(board.getId()); - if (existing == null) { - return null; - } - - existing.setBoardTitle(board.getBoardTitle()); - boardRepository.update(existing); + public void createBoard(Board board) { + boardRepository.save(board); + } - return existing; + public void updateBoard(Board board) { + boardRepository.update(board); } - public void deleteBoardById(Long id) { + public void deleteBoard(Long id) { boardRepository.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 06c92bd9..f657e0ee 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -1,25 +1,19 @@ package com.example.bcsd.Service; -import com.example.bcsd.Repository.MemberRepository; 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 Member createMember(Member member) { - memberRepository.save(member); - return member; - } - public List getAllMembers() { return memberRepository.findAll(); } @@ -28,18 +22,12 @@ public Member getMemberById(Long id) { return memberRepository.findById(id); } - public Member updateMember(Member member) { - Member existing = memberRepository.findById(member.getId()); - if (existing == null) { - return null; - } - - existing.setName(member.getName()); - existing.setEmail(member.getEmail()); - existing.setPassword(member.getPassword()); + public void createMember(Member member) { + memberRepository.save(member); + } - memberRepository.update(existing); - return existing; + public void updateMember(Member member) { + memberRepository.update(member); } public void deleteMember(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 aeed5a01..1f89b2c5 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -6,61 +6,40 @@ public class Article { private Long authorID; private Long boardID; private String title; - private String description; - private LocalDateTime createDay; - private LocalDateTime updateDay; + private String content; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; - public Article(Long id, Long authorID, Long boardID, String title, - String description) { + public Article() {} + + public Article(Long id, Long authorID, Long boardID, String title, String content) { this.id = id; this.authorID = authorID; this.boardID = boardID; this.title = title; - this.description = description; - this.createDay = LocalDateTime.now(); - this.updateDay = LocalDateTime.now(); - } - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; + this.content = content; + this.createdDate = LocalDateTime.now(); + this.modifiedDate = LocalDateTime.now(); } - public Long getAuthorID() { - return authorID; - } - public void setAuthorID(Long authorID) { - this.authorID = authorID; -} -public Long getBoardID() { - return boardID; -} -public void setBoardID(Long boardID) { - this.boardID = boardID; -} -public String getTitle() { - return title; -} -public void setTitle(String title) { - this.title = title; -} -public String getDescription() { - return description; -} -public void setDescription(String description) { - this.description = description; -} -public LocalDateTime getCreateDay() { - return createDay; -} -public void setCreateDay(LocalDateTime createDay) { - this.createDay = createDay; -} -public LocalDateTime getUpdateDay() { - return updateDay; -} -public void setUpdateDay(LocalDateTime updateDay) { - this.updateDay = updateDay; -} + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Long getAuthorID() { return authorID; } + public void setAuthorID(Long authorID) { this.authorID = authorID; } + + public Long getBoardID() { return boardID; } + public void setBoardID(Long boardID) { this.boardID = boardID; } + + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + + public LocalDateTime getCreatedDate() { return createdDate; } + public void setCreatedDate(LocalDateTime createdDate) { this.createdDate = createdDate; } + + public LocalDateTime getModifiedDate() { return modifiedDate; } + public void setModifiedDate(LocalDateTime modifiedDate) { this.modifiedDate = modifiedDate; } } diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 0271b289..41a56d5f 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -2,7 +2,14 @@ public class Board { private Long id; - private String BoardTitle; + private String name; + + public Board() {} + + public Board(Long id, String name) { + this.id = id; + this.name = name; + } public Long getId() { return id; @@ -10,10 +17,6 @@ public Long getId() { public void setId(Long id) { this.id = id; } - public String getBoardTitle() { - return BoardTitle; - } - public void setBoardTitle(String boardTitle) { - BoardTitle = boardTitle; - } + public String getName() { return name; } + public void setName(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 792ffb8b..f00f3b50 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -6,34 +6,24 @@ public class Member { private String email; private String password; + public Member() {} + public Member(Long id, String name, String email, String password) { this.id = id; this.name = name; this.email = email; this.password = password; } - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } } From 5c0681934f5c39c12c1c8d3f11c34f3abd7011ef Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 16:17:10 +0900 Subject: [PATCH 28/50] =?UTF-8?q?refactor:sql=20DB=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=20implementation=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 --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 3d0018e9..33e72682 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,8 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'mysql:mysql-connector-java:8.0.33' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + } From 3195137d577d41365c4546351bed6c0f07d4893d Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 16:36:49 +0900 Subject: [PATCH 29/50] =?UTF-8?q?refactor:Transactional=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/Service/ArticleService.java | 7 ++++--- src/main/java/com/example/bcsd/Service/BoardService.java | 7 ++++--- src/main/java/com/example/bcsd/Service/MemberService.java | 7 ++++--- 3 files changed, 12 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 a515a02b..fef93bb1 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -3,6 +3,7 @@ import com.example.bcsd.model.Article; import com.example.bcsd.Repository.ArticleRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; @@ -22,18 +23,18 @@ public List
getAllArticles() { public Article getArticleById(Long id) { return articleRepository.findById(id); } - + @Transactional public void createArticle(Article article) { article.setCreatedDate(LocalDateTime.now()); article.setModifiedDate(LocalDateTime.now()); articleRepository.save(article); } - + @Transactional public void updateArticle(Article article) { article.setModifiedDate(LocalDateTime.now()); articleRepository.update(article); } - + @Transactional public void deleteArticle(Long id) { articleRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/Service/BoardService.java b/src/main/java/com/example/bcsd/Service/BoardService.java index 7d370435..dc9c19a0 100644 --- a/src/main/java/com/example/bcsd/Service/BoardService.java +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -3,6 +3,7 @@ import com.example.bcsd.model.Board; import com.example.bcsd.Repository.BoardRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -21,15 +22,15 @@ public List getAllBoards() { public Board getBoardById(Long id) { return boardRepository.findById(id); } - + @Transactional public void createBoard(Board board) { boardRepository.save(board); } - + @Transactional public void updateBoard(Board board) { boardRepository.update(board); } - + @Transactional public void deleteBoard(Long id) { boardRepository.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 f657e0ee..d666c181 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -3,6 +3,7 @@ import com.example.bcsd.model.Member; import com.example.bcsd.Repository.MemberRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -21,15 +22,15 @@ public List getAllMembers() { public Member getMemberById(Long id) { return memberRepository.findById(id); } - + @Transactional public void createMember(Member member) { memberRepository.save(member); } - + @Transactional public void updateMember(Member member) { memberRepository.update(member); } - + @Transactional public void deleteMember(Long id) { memberRepository.delete(id); } From 2d2f147a70d74a4e72eb3392f31977aba20a481f Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 17:03:10 +0900 Subject: [PATCH 30/50] =?UTF-8?q?refactor:HTML=EB=B7=B0=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=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/Repository/ArticleRepository.java | 6 ++++++ .../java/com/example/bcsd/Service/ArticleService.java | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java index 26927311..436977a2 100644 --- a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java @@ -68,4 +68,10 @@ public void delete(Long id) { String sql = "DELETE FROM article WHERE id = ?"; jdbcTemplate.update(sql, id); } + + public List
findByBoardId(Long boardId) { + String sql = "SELECT * FROM article WHERE board_id = ?"; + return jdbcTemplate.query(sql, articleRowMapper, boardId); + } + } diff --git a/src/main/java/com/example/bcsd/Service/ArticleService.java b/src/main/java/com/example/bcsd/Service/ArticleService.java index fef93bb1..64ea17df 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -23,19 +23,28 @@ public List
getAllArticles() { public Article getArticleById(Long id) { return articleRepository.findById(id); } + @Transactional public void createArticle(Article article) { article.setCreatedDate(LocalDateTime.now()); article.setModifiedDate(LocalDateTime.now()); articleRepository.save(article); } + @Transactional public void updateArticle(Article article) { article.setModifiedDate(LocalDateTime.now()); articleRepository.update(article); } + @Transactional public void deleteArticle(Long id) { articleRepository.delete(id); } + + @Transactional + public List
getArticlesByBoardId(Long boardId) { + return articleRepository.findByBoardId(boardId); + } + } From 822ab75d2b18e9209b4f077a8833f6b4ebe486c5 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 18:48:20 +0900 Subject: [PATCH 31/50] =?UTF-8?q?refactor:JDBC=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/Controller/PostViewController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/bcsd/Controller/PostViewController.java b/src/main/java/com/example/bcsd/Controller/PostViewController.java index 8b257115..1dc7b462 100644 --- a/src/main/java/com/example/bcsd/Controller/PostViewController.java +++ b/src/main/java/com/example/bcsd/Controller/PostViewController.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; @Controller public class PostViewController { @@ -18,9 +19,10 @@ public PostViewController(ArticleService articleService, MemberService memberSer } @GetMapping("/posts") - public String posts(Model model) { + public String posts(@RequestParam(required = false) Long boardId, Model model) { model.addAttribute("articles", articleService.getAllArticles()); model.addAttribute("members", memberService.getAllMembers()); - return "posts"; // templates/posts.html + model.addAttribute("boardId", articleService.getArticlesByBoardId(boardId)); + return "posts"; } } From ef325f58ae08266628048988d01dd38c83d86369 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 18:48:46 +0900 Subject: [PATCH 32/50] =?UTF-8?q?refactor:=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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/Controller/ArticleController.java | 7 +++++++ src/main/java/com/example/bcsd/model/Article.java | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/example/bcsd/Controller/ArticleController.java b/src/main/java/com/example/bcsd/Controller/ArticleController.java index 8d0f354a..7cf2b1fd 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/Controller/ArticleController.java @@ -45,4 +45,11 @@ public ResponseEntity deleteArticle(@PathVariable Long id) { articleService.deleteArticle(id); return ResponseEntity.ok().build(); } + + @GetMapping(params = "boardId") + public ResponseEntity> getArticlesByBoardId(@RequestParam Long boardId) { + List
articles = articleService.getArticlesByBoardId(boardId); + return ResponseEntity.ok(articles); + } + } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 1f89b2c5..277cce63 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,5 +1,11 @@ package com.example.bcsd.model; +import com.example.bcsd.Service.ArticleService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + import java.time.LocalDateTime; +import java.util.List; public class Article { private Long id; From c3564b0c4803e0c3e7ef25d373afcf2b0dcef877 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 24 Nov 2025 18:49:22 +0900 Subject: [PATCH 33/50] =?UTF-8?q?refactor:=EB=B3=80=EC=88=98=EB=AA=85=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/resources/templates/posts.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/templates/posts.html b/src/main/resources/templates/posts.html index b295750e..3a9a496e 100644 --- a/src/main/resources/templates/posts.html +++ b/src/main/resources/templates/posts.html @@ -23,10 +23,10 @@

자유게시판

| - 날짜 + 날짜
-
+
From bac3d9a946389d89f0a85dd464930cfeaeeb356a Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 1 Dec 2025 17:49:55 +0900 Subject: [PATCH 34/50] =?UTF-8?q?feat:=EC=98=88=EC=99=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=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/ArticleCreateException.java | 7 +++++++ .../example/bcsd/Exception/ArticleNotFoundException.java | 7 +++++++ .../com/example/bcsd/Exception/ArticleUpdateException.java | 7 +++++++ .../com/example/bcsd/Exception/BoardDeleteException.java | 7 +++++++ .../com/example/bcsd/Exception/BoardNotFoundException.java | 7 +++++++ .../com/example/bcsd/Exception/EmailConflictException.java | 7 +++++++ .../com/example/bcsd/Exception/InvalidInputException.java | 7 +++++++ .../com/example/bcsd/Exception/MemberDeleteException.java | 7 +++++++ .../example/bcsd/Exception/MemberNotFoundException.java | 7 +++++++ 9 files changed, 63 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Exception/ArticleCreateException.java create mode 100644 src/main/java/com/example/bcsd/Exception/ArticleNotFoundException.java create mode 100644 src/main/java/com/example/bcsd/Exception/ArticleUpdateException.java create mode 100644 src/main/java/com/example/bcsd/Exception/BoardDeleteException.java create mode 100644 src/main/java/com/example/bcsd/Exception/BoardNotFoundException.java create mode 100644 src/main/java/com/example/bcsd/Exception/EmailConflictException.java create mode 100644 src/main/java/com/example/bcsd/Exception/InvalidInputException.java create mode 100644 src/main/java/com/example/bcsd/Exception/MemberDeleteException.java create mode 100644 src/main/java/com/example/bcsd/Exception/MemberNotFoundException.java diff --git a/src/main/java/com/example/bcsd/Exception/ArticleCreateException.java b/src/main/java/com/example/bcsd/Exception/ArticleCreateException.java new file mode 100644 index 00000000..0125b1db --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/ArticleCreateException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class ArticleCreateException extends RuntimeException { + public ArticleCreateException(Long authorId, Long boardId) { + super("게시물 생성 중 잘못된 참조입니다."); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/ArticleNotFoundException.java b/src/main/java/com/example/bcsd/Exception/ArticleNotFoundException.java new file mode 100644 index 00000000..7cbc65ae --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/ArticleNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class ArticleNotFoundException extends RuntimeException { + public ArticleNotFoundException(Long id) { + super("해당 게시글을 찾을 수 없습니다."); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/ArticleUpdateException.java b/src/main/java/com/example/bcsd/Exception/ArticleUpdateException.java new file mode 100644 index 00000000..0ca13452 --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/ArticleUpdateException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class ArticleUpdateException extends RuntimeException { + public ArticleUpdateException(Long authorId, Long boardId) { + super("참조가 불가능합니다"); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/BoardDeleteException.java b/src/main/java/com/example/bcsd/Exception/BoardDeleteException.java new file mode 100644 index 00000000..acac4453 --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/BoardDeleteException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class BoardDeleteException extends RuntimeException { + public BoardDeleteException(Long boardId) { + super("게시판에 게시물이 존재하여 삭제할 수 없습니다."); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/BoardNotFoundException.java b/src/main/java/com/example/bcsd/Exception/BoardNotFoundException.java new file mode 100644 index 00000000..56d585bd --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/BoardNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class BoardNotFoundException extends RuntimeException { + public BoardNotFoundException(Long id) { + super("해당 게시판을 찾을 수 없습니다."); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/EmailConflictException.java b/src/main/java/com/example/bcsd/Exception/EmailConflictException.java new file mode 100644 index 00000000..ceb80db3 --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/EmailConflictException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class EmailConflictException extends RuntimeException { + public EmailConflictException(String email) { + super("이미 존재하는 이메일입니다: " + email); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/InvalidInputException.java b/src/main/java/com/example/bcsd/Exception/InvalidInputException.java new file mode 100644 index 00000000..4d19909b --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/InvalidInputException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class InvalidInputException extends RuntimeException { + public InvalidInputException(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/MemberDeleteException.java b/src/main/java/com/example/bcsd/Exception/MemberDeleteException.java new file mode 100644 index 00000000..78a3d4bb --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/MemberDeleteException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class MemberDeleteException extends RuntimeException { + public MemberDeleteException(Long memberId) { + super("사용자가 작성한 게시물이 존재하여 삭제할 수 없습니다."); + } +} diff --git a/src/main/java/com/example/bcsd/Exception/MemberNotFoundException.java b/src/main/java/com/example/bcsd/Exception/MemberNotFoundException.java new file mode 100644 index 00000000..0467a805 --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/MemberNotFoundException.java @@ -0,0 +1,7 @@ +package com.example.bcsd.Exception; + +public class MemberNotFoundException extends RuntimeException { + public MemberNotFoundException(Long id) { + super("해당 사용자를 찾을 수 없습니다."); + } +} From c5cd8c0248d8d6c3f129c28805e9c61c7148de89 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 1 Dec 2025 17:50:26 +0900 Subject: [PATCH 35/50] =?UTF-8?q?refactor:=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=82=B4=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/Service/ArticleService.java | 52 +++++++++++++++++-- .../example/bcsd/Service/BoardService.java | 30 +++++++++-- .../example/bcsd/Service/MemberService.java | 39 ++++++++++++-- 3 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/bcsd/Service/ArticleService.java b/src/main/java/com/example/bcsd/Service/ArticleService.java index 64ea17df..b837358a 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -1,7 +1,14 @@ package com.example.bcsd.Service; -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 com.example.bcsd.model.Article; +import com.example.bcsd.Exception.ArticleNotFoundException; +import com.example.bcsd.Exception.ArticleUpdateException; +import com.example.bcsd.Exception.ArticleCreateException; +import com.example.bcsd.Exception.InvalidInputException; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,9 +18,15 @@ @Service public class ArticleService { private final ArticleRepository articleRepository; + private final MemberRepository memberRepository; + private final BoardRepository boardRepository; - public ArticleService(ArticleRepository articleRepository) { + public ArticleService(ArticleRepository articleRepository, + MemberRepository memberRepository, + BoardRepository boardRepository) { this.articleRepository = articleRepository; + this.memberRepository = memberRepository; + this.boardRepository = boardRepository; } public List
getAllArticles() { @@ -21,11 +34,29 @@ public List
getAllArticles() { } public Article getArticleById(Long id) { - return articleRepository.findById(id); + try { + return articleRepository.findById(id); + } catch (EmptyResultDataAccessException e) { + throw new ArticleNotFoundException(id); + } } @Transactional public void createArticle(Article article) { + if (article == null || article.getAuthorID() == null || article.getBoardID() == null + || article.getTitle() == null || article.getContent() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } + try { + memberRepository.findById(article.getAuthorID()); + } catch (EmptyResultDataAccessException e) { + throw new ArticleCreateException(article.getAuthorID(), article.getBoardID()); + } + try { + boardRepository.findById(article.getBoardID()); + } catch (EmptyResultDataAccessException e) { + throw new ArticleCreateException(article.getAuthorID(), article.getBoardID()); + } article.setCreatedDate(LocalDateTime.now()); article.setModifiedDate(LocalDateTime.now()); articleRepository.save(article); @@ -33,6 +64,20 @@ public void createArticle(Article article) { @Transactional public void updateArticle(Article article) { + if (article == null || article.getId() == null || article.getAuthorID() == null + || article.getBoardID() == null || article.getTitle() == null || article.getContent() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } + try { + memberRepository.findById(article.getAuthorID()); + } catch (EmptyResultDataAccessException e) { + throw new ArticleUpdateException(article.getAuthorID(), article.getBoardID()); + } + try { + boardRepository.findById(article.getBoardID()); + } catch (EmptyResultDataAccessException e) { + throw new ArticleUpdateException(article.getAuthorID(), article.getBoardID()); + } article.setModifiedDate(LocalDateTime.now()); articleRepository.update(article); } @@ -46,5 +91,4 @@ public void deleteArticle(Long id) { public List
getArticlesByBoardId(Long boardId) { return articleRepository.findByBoardId(boardId); } - } diff --git a/src/main/java/com/example/bcsd/Service/BoardService.java b/src/main/java/com/example/bcsd/Service/BoardService.java index dc9c19a0..4c9596ff 100644 --- a/src/main/java/com/example/bcsd/Service/BoardService.java +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -1,7 +1,12 @@ package com.example.bcsd.Service; -import com.example.bcsd.model.Board; +import com.example.bcsd.Repository.ArticleRepository; import com.example.bcsd.Repository.BoardRepository; +import com.example.bcsd.model.Board; +import com.example.bcsd.Exception.BoardNotFoundException; +import com.example.bcsd.Exception.InvalidInputException; +import com.example.bcsd.Exception.BoardDeleteException; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -10,9 +15,11 @@ @Service public class BoardService { private final BoardRepository boardRepository; + private final ArticleRepository articleRepository; - public BoardService(BoardRepository boardRepository) { + public BoardService(BoardRepository boardRepository, ArticleRepository articleRepository) { this.boardRepository = boardRepository; + this.articleRepository = articleRepository; } public List getAllBoards() { @@ -20,18 +27,35 @@ public List getAllBoards() { } public Board getBoardById(Long id) { - return boardRepository.findById(id); + try { + return boardRepository.findById(id); + } catch (EmptyResultDataAccessException e) { + throw new BoardNotFoundException(id); + } } + @Transactional public void createBoard(Board board) { + if (board == null || board.getName() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } boardRepository.save(board); } + @Transactional public void updateBoard(Board board) { + if (board == null || board.getId() == null || board.getName() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } boardRepository.update(board); } + @Transactional public void deleteBoard(Long id) { + List articles = articleRepository.findByBoardId(id); + if (!articles.isEmpty()) { + throw new BoardDeleteException(id); + } boardRepository.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 d666c181..0a55baf8 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -1,18 +1,27 @@ package com.example.bcsd.Service; -import com.example.bcsd.model.Member; import com.example.bcsd.Repository.MemberRepository; +import com.example.bcsd.Repository.ArticleRepository; +import com.example.bcsd.model.Member; +import com.example.bcsd.Exception.MemberNotFoundException; +import com.example.bcsd.Exception.EmailConflictException; +import com.example.bcsd.Exception.InvalidInputException; +import com.example.bcsd.Exception.MemberDeleteException; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; @Service public class MemberService { private final MemberRepository memberRepository; + private final ArticleRepository articleRepository; - public MemberService(MemberRepository memberRepository) { + public MemberService(MemberRepository memberRepository, ArticleRepository articleRepository) { this.memberRepository = memberRepository; + this.articleRepository = articleRepository; } public List getAllMembers() { @@ -20,18 +29,42 @@ public List getAllMembers() { } public Member getMemberById(Long id) { - return memberRepository.findById(id); + try { + return memberRepository.findById(id); + } catch (EmptyResultDataAccessException e) { + throw new MemberNotFoundException(id); + } } + @Transactional public void createMember(Member member) { + if (member == null || member.getName() == null || member.getEmail() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } memberRepository.save(member); } + @Transactional public void updateMember(Member member) { + if (member == null || member.getId() == null || member.getEmail() == null) { + throw new InvalidInputException("null값이 존재합니다"); + } + List all = memberRepository.findAll(); + boolean conflict = all.stream() + .anyMatch(m -> !Objects.equals(m.getId(), member.getId()) + && Objects.equals(m.getEmail(), member.getEmail())); + if (conflict) { + throw new EmailConflictException(member.getEmail()); + } memberRepository.update(member); } + @Transactional public void deleteMember(Long id) { + List articles = articleRepository.findByBoardId(id); + if (!articles.isEmpty()) { + throw new MemberDeleteException(id); + } memberRepository.delete(id); } } From 4cfe6df718e0311c81e274b9a33d1942a4d22927 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 1 Dec 2025 17:50:51 +0900 Subject: [PATCH 36/50] =?UTF-8?q?feat:=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Exception/GlobalExceptionHandler.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Exception/GlobalExceptionHandler.java 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..7a9c5af7 --- /dev/null +++ b/src/main/java/com/example/bcsd/Exception/GlobalExceptionHandler.java @@ -0,0 +1,93 @@ +package com.example.bcsd.Exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.HashMap; +import java.util.Map; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(ArticleNotFoundException.class) + public ResponseEntity> handleArticleNotFound(ArticleNotFoundException ex) { + Map body = new HashMap<>(); + body.put("status", 404); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(body); + } + + @ExceptionHandler(BoardNotFoundException.class) + public ResponseEntity> handleBoardNotFound(BoardNotFoundException ex) { + Map body = new HashMap<>(); + body.put("status", 404); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(body); + } + + @ExceptionHandler(MemberNotFoundException.class) + public ResponseEntity> handleMemberNotFound(MemberNotFoundException ex) { + Map body = new HashMap<>(); + body.put("status", 404); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(body); + } + + @ExceptionHandler(EmailConflictException.class) + public ResponseEntity> handleEmailConflict(EmailConflictException ex) { + Map body = new HashMap<>(); + body.put("status", 409); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.CONFLICT).body(body); + } + + @ExceptionHandler(ArticleUpdateException.class) + public ResponseEntity> handleArticleUpdate(ArticleUpdateException ex) { + Map body = new HashMap<>(); + body.put("status", 400); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(body); + } + + @ExceptionHandler(InvalidInputException.class) + public ResponseEntity> handleInvalidInput(InvalidInputException ex) { + Map body = new HashMap<>(); + body.put("status", 400); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(body); + } + + @ExceptionHandler(ArticleCreateException.class) + public ResponseEntity> handleArticleCreate(ArticleCreateException ex) { + Map body = new HashMap<>(); + body.put("status", 400); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(body); + } + + @ExceptionHandler(MemberDeleteException.class) + public ResponseEntity> handleMemberDelete(MemberDeleteException ex) { + Map body = new HashMap<>(); + body.put("status", 400); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(body); + } + + @ExceptionHandler(BoardDeleteException.class) + public ResponseEntity> handleBoardDelete(BoardDeleteException ex) { + Map body = new HashMap<>(); + body.put("status", 400); + body.put("message", ex.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(body); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity> handleGeneral(Exception ex) { + Map body = new HashMap<>(); + body.put("status", 500); + body.put("message", "서버 오류가 발생했습니다."); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(body); + } +} From 4c82e78b64fede14332347dea206fd581ffc955c Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 22 Dec 2025 21:20:58 +0900 Subject: [PATCH 37/50] =?UTF-8?q?refactor:jpa=EA=B5=AC=EC=A1=B0=EB=A1=9C?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 28 +++---- .../bcsd/Controller/ArticleController.java | 29 +++---- .../bcsd/Controller/BoardController.java | 23 +++--- .../bcsd/Controller/MemberController.java | 32 +++++--- .../bcsd/Controller/PostViewController.java | 9 ++- .../bcsd/Repository/ArticleRepository.java | 70 +++++----------- .../bcsd/Repository/BoardRepository.java | 47 ++++------- .../bcsd/Repository/MemberRepository.java | 65 ++++++--------- .../example/bcsd/Service/ArticleService.java | 79 +++++-------------- .../example/bcsd/Service/BoardService.java | 49 ++++-------- .../example/bcsd/Service/MemberService.java | 64 ++++++--------- .../java/com/example/bcsd/model/Article.java | 65 ++++++++------- .../java/com/example/bcsd/model/Board.java | 27 +++++-- .../java/com/example/bcsd/model/Member.java | 50 +++++++++--- 14 files changed, 277 insertions(+), 360 deletions(-) diff --git a/build.gradle b/build.gradle index 33e72682..69e0dc59 100644 --- a/build.gradle +++ b/build.gradle @@ -1,33 +1,31 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.4.5' - id 'io.spring.dependency-management' version '1.1.7' + id 'org.springframework.boot' version '3.2.0' + id 'io.spring.dependency-management' version '1.1.4' + id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'mysql:mysql-connector-java:8.0.33' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - - + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/src/main/java/com/example/bcsd/Controller/ArticleController.java b/src/main/java/com/example/bcsd/Controller/ArticleController.java index 7cf2b1fd..3fc56b66 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/Controller/ArticleController.java @@ -18,26 +18,30 @@ public ArticleController(ArticleService articleService) { @GetMapping public ResponseEntity> getAllArticles() { - return ResponseEntity.ok(articleService.getAllArticles()); + return ResponseEntity.ok(articleService.findAllArticles()); } @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { - Article article = articleService.getArticleById(id); + Article article = articleService.findArticle(id); return ResponseEntity.ok(article); } @PostMapping - public ResponseEntity createArticle(@RequestBody Article article) { - articleService.createArticle(article); - return ResponseEntity.ok().build(); + public ResponseEntity
createArticle(@RequestBody Article article) { + Article saved = articleService.createArticle( + article.getAuthorId(), + article.getBoardId(), + article.getTitle(), + article.getContent() + ); + return ResponseEntity.ok(saved); } @PutMapping("/{id}") - public ResponseEntity updateArticle(@PathVariable Long id, @RequestBody Article article) { - article.setId(id); - articleService.updateArticle(article); - return ResponseEntity.ok().build(); + public ResponseEntity
updateArticle(@PathVariable Long id, @RequestBody Article article) { + Article updated = articleService.updateArticle(id, article.getTitle(), article.getContent()); + return ResponseEntity.ok(updated); } @DeleteMapping("/{id}") @@ -45,11 +49,4 @@ public ResponseEntity deleteArticle(@PathVariable Long id) { articleService.deleteArticle(id); return ResponseEntity.ok().build(); } - - @GetMapping(params = "boardId") - public ResponseEntity> getArticlesByBoardId(@RequestParam Long boardId) { - List
articles = articleService.getArticlesByBoardId(boardId); - return ResponseEntity.ok(articles); - } - } diff --git a/src/main/java/com/example/bcsd/Controller/BoardController.java b/src/main/java/com/example/bcsd/Controller/BoardController.java index a24a3d06..179ec6d3 100644 --- a/src/main/java/com/example/bcsd/Controller/BoardController.java +++ b/src/main/java/com/example/bcsd/Controller/BoardController.java @@ -1,7 +1,7 @@ package com.example.bcsd.Controller; -import com.example.bcsd.model.Board; import com.example.bcsd.Service.BoardService; +import com.example.bcsd.model.Board; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -10,6 +10,7 @@ @RestController @RequestMapping("/boards") public class BoardController { + private final BoardService boardService; public BoardController(BoardService boardService) { @@ -18,26 +19,24 @@ public BoardController(BoardService boardService) { @GetMapping public ResponseEntity> getAllBoards() { - return ResponseEntity.ok(boardService.getAllBoards()); + return ResponseEntity.ok(boardService.findAllBoards()); } @GetMapping("/{id}") - public ResponseEntity getBoardById(@PathVariable Long id) { - Board board = boardService.getBoardById(id); - return ResponseEntity.ok(board); + public ResponseEntity getBoard(@PathVariable Long id) { + return ResponseEntity.ok(boardService.findBoard(id)); } @PostMapping - public ResponseEntity createBoard(@RequestBody Board board) { - boardService.createBoard(board); - return ResponseEntity.ok().build(); + public ResponseEntity createBoard(@RequestBody Board board) { + Board saved = boardService.createBoard(board.getName()); + return ResponseEntity.ok(saved); } @PutMapping("/{id}") - public ResponseEntity updateBoard(@PathVariable Long id, @RequestBody Board board) { - board.setId(id); - boardService.updateBoard(board); - return ResponseEntity.ok().build(); + public ResponseEntity updateBoard(@PathVariable Long id, @RequestBody Board board) { + Board updated = boardService.updateBoard(id, board.getName()); + return ResponseEntity.ok(updated); } @DeleteMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/Controller/MemberController.java b/src/main/java/com/example/bcsd/Controller/MemberController.java index dd9469d0..43b94b7c 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.model.Member; import com.example.bcsd.Service.MemberService; +import com.example.bcsd.model.Member; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -10,6 +10,7 @@ @RestController @RequestMapping("/members") public class MemberController { + private final MemberService memberService; public MemberController(MemberService memberService) { @@ -18,26 +19,33 @@ public MemberController(MemberService memberService) { @GetMapping public ResponseEntity> getAllMembers() { - return ResponseEntity.ok(memberService.getAllMembers()); + return ResponseEntity.ok(memberService.findAllMembers()); } @GetMapping("/{id}") - public ResponseEntity getMemberById(@PathVariable Long id) { - Member member = memberService.getMemberById(id); - return ResponseEntity.ok(member); + public ResponseEntity getMember(@PathVariable Long id) { + return ResponseEntity.ok(memberService.findMember(id)); } @PostMapping - public ResponseEntity createMember(@RequestBody Member member) { - memberService.createMember(member); - return ResponseEntity.ok().build(); + public ResponseEntity createMember(@RequestBody Member member) { + Member saved = memberService.createMember( + member.getName(), + member.getEmail(), + member.getPassword() + ); + return ResponseEntity.ok(saved); } @PutMapping("/{id}") - public ResponseEntity updateMember(@PathVariable Long id, @RequestBody Member member) { - member.setId(id); - memberService.updateMember(member); - return ResponseEntity.ok().build(); + public ResponseEntity updateMember(@PathVariable Long id, @RequestBody Member member) { + Member updated = memberService.updateMember( + id, + member.getName(), + member.getEmail(), + member.getPassword() + ); + return ResponseEntity.ok(updated); } @DeleteMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/Controller/PostViewController.java b/src/main/java/com/example/bcsd/Controller/PostViewController.java index 1dc7b462..b9eadbb9 100644 --- a/src/main/java/com/example/bcsd/Controller/PostViewController.java +++ b/src/main/java/com/example/bcsd/Controller/PostViewController.java @@ -20,9 +20,12 @@ public PostViewController(ArticleService articleService, MemberService memberSer @GetMapping("/posts") public String posts(@RequestParam(required = false) Long boardId, Model model) { - model.addAttribute("articles", articleService.getAllArticles()); - model.addAttribute("members", memberService.getAllMembers()); - model.addAttribute("boardId", articleService.getArticlesByBoardId(boardId)); + model.addAttribute("articles", articleService.findAllArticles()); + model.addAttribute("members", memberService.findAllMembers()); + if (boardId != null) { + model.addAttribute("articlesByBoard", articleService.getArticlesByBoardId(boardId)); + } return "posts"; } + } diff --git a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java index 436977a2..5374b36a 100644 --- a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java @@ -1,77 +1,45 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Article; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository public class ArticleRepository { - private final JdbcTemplate jdbcTemplate; - public ArticleRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private final RowMapper
articleRowMapper = new RowMapper
() { - @Override - public Article mapRow(ResultSet rs, int rowNum) throws SQLException { - Article article = new Article(); - article.setId(rs.getLong("id")); - article.setAuthorID(rs.getLong("author_id")); - article.setBoardID(rs.getLong("board_id")); - article.setTitle(rs.getString("title")); - article.setContent(rs.getString("content")); - article.setCreatedDate(rs.getTimestamp("created_date").toLocalDateTime()); - article.setModifiedDate(rs.getTimestamp("modified_date").toLocalDateTime()); - return article; - } - }; + @PersistenceContext + private EntityManager em; - public List
findAll() { - String sql = "SELECT * FROM article"; - return jdbcTemplate.query(sql, articleRowMapper); + public Article findById(Long id) { + return em.find(Article.class, id); } - public Article findById(Long id) { - String sql = "SELECT * FROM article WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, articleRowMapper, id); + public List
findAll() { + return em.createQuery("SELECT a FROM Article a", Article.class) + .getResultList(); } public void save(Article article) { - String sql = "INSERT INTO article (author_id, board_id, title, content, created_date, modified_date) VALUES (?, ?, ?, ?, ?, ?)"; - jdbcTemplate.update(sql, - article.getAuthorID(), - article.getBoardID(), - article.getTitle(), - article.getContent(), - article.getCreatedDate(), - article.getModifiedDate()); + em.persist(article); } - public void update(Article article) { - String sql = "UPDATE article SET author_id = ?, board_id = ?, title = ?, content = ?, modified_date = ? WHERE id = ?"; - jdbcTemplate.update(sql, - article.getAuthorID(), - article.getBoardID(), - article.getTitle(), - article.getContent(), - article.getModifiedDate(), - article.getId()); + public Article update(Article article) { + return em.merge(article); } public void delete(Long id) { - String sql = "DELETE FROM article WHERE id = ?"; - jdbcTemplate.update(sql, id); + Article article = em.find(Article.class, id); + if (article != null) { + em.remove(article); + } } public List
findByBoardId(Long boardId) { - String sql = "SELECT * FROM article WHERE board_id = ?"; - return jdbcTemplate.query(sql, articleRowMapper, boardId); + return em.createQuery("SELECT a FROM Article a WHERE a.boardId = :boardId", Article.class) + .setParameter("boardId", boardId) + .getResultList(); } - } diff --git a/src/main/java/com/example/bcsd/Repository/BoardRepository.java b/src/main/java/com/example/bcsd/Repository/BoardRepository.java index 21734b34..0fde27d2 100644 --- a/src/main/java/com/example/bcsd/Repository/BoardRepository.java +++ b/src/main/java/com/example/bcsd/Repository/BoardRepository.java @@ -1,54 +1,39 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Board; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository public class BoardRepository { - private final JdbcTemplate jdbcTemplate; - public BoardRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private final RowMapper boardRowMapper = new RowMapper() { - @Override - public Board mapRow(ResultSet rs, int rowNum) throws SQLException { - Board board = new Board(); - board.setId(rs.getLong("id")); - board.setName(rs.getString("name")); - return board; - } - }; + @PersistenceContext + private EntityManager em; - public List findAll() { - String sql = "SELECT * FROM board"; - return jdbcTemplate.query(sql, boardRowMapper); + public void save(Board board) { + em.persist(board); } public Board findById(Long id) { - String sql = "SELECT * FROM board WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, boardRowMapper, id); + return em.find(Board.class, id); } - public void save(Board board) { - String sql = "INSERT INTO board (name) VALUES (?)"; - jdbcTemplate.update(sql, board.getName()); + public List findAll() { + return em.createQuery("SELECT b FROM Board b", Board.class) + .getResultList(); } - public void update(Board board) { - String sql = "UPDATE board SET name = ? WHERE id = ?"; - jdbcTemplate.update(sql, board.getName(), board.getId()); + public Board update(Board board) { + return em.merge(board); } public void delete(Long id) { - String sql = "DELETE FROM board WHERE id = ?"; - jdbcTemplate.update(sql, id); + Board board = em.find(Board.class, id); + if (board != null) { + em.remove(board); + } } } diff --git a/src/main/java/com/example/bcsd/Repository/MemberRepository.java b/src/main/java/com/example/bcsd/Repository/MemberRepository.java index 651c5d4b..ec216249 100644 --- a/src/main/java/com/example/bcsd/Repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/Repository/MemberRepository.java @@ -1,63 +1,48 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Member; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository public class MemberRepository { - private final JdbcTemplate jdbcTemplate; - public MemberRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - private final RowMapper memberRowMapper = new RowMapper() { - @Override - public Member mapRow(ResultSet rs, int rowNum) throws SQLException { - Member member = new Member(); - member.setId(rs.getLong("id")); - member.setName(rs.getString("name")); - member.setEmail(rs.getString("email")); - member.setPassword(rs.getString("password")); - return member; - } - }; + @PersistenceContext + private EntityManager em; - public List findAll() { - String sql = "SELECT * FROM member"; - return jdbcTemplate.query(sql, memberRowMapper); + public void save(Member member) { + em.persist(member); } public Member findById(Long id) { - String sql = "SELECT * FROM member WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, memberRowMapper, id); + return em.find(Member.class, id); } - public void save(Member member) { - String sql = "INSERT INTO member (name, email, password) VALUES (?, ?, ?)"; - jdbcTemplate.update(sql, - member.getName(), - member.getEmail(), - member.getPassword()); + public List findAll() { + return em.createQuery("SELECT m FROM Member m", Member.class) + .getResultList(); } - public void update(Member member) { - String sql = "UPDATE member SET name = ?, email = ?, password = ? WHERE id = ?"; - jdbcTemplate.update(sql, - member.getName(), - member.getEmail(), - member.getPassword(), - member.getId()); + public Member update(Member member) { + return em.merge(member); } public void delete(Long id) { - String sql = "DELETE FROM member WHERE id = ?"; - jdbcTemplate.update(sql, id); + Member member = em.find(Member.class, id); + if (member != null) { + em.remove(member); + } + } + + public Member findByEmail(String email) { + List result = em.createQuery( + "SELECT m FROM Member m WHERE m.email = :email", Member.class) + .setParameter("email", email) + .getResultList(); + + return result.isEmpty() ? null : result.get(0); } } diff --git a/src/main/java/com/example/bcsd/Service/ArticleService.java b/src/main/java/com/example/bcsd/Service/ArticleService.java index b837358a..49f231bd 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -1,93 +1,50 @@ package com.example.bcsd.Service; import com.example.bcsd.Repository.ArticleRepository; -import com.example.bcsd.Repository.BoardRepository; -import com.example.bcsd.Repository.MemberRepository; import com.example.bcsd.model.Article; -import com.example.bcsd.Exception.ArticleNotFoundException; -import com.example.bcsd.Exception.ArticleUpdateException; -import com.example.bcsd.Exception.ArticleCreateException; -import com.example.bcsd.Exception.InvalidInputException; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; import java.util.List; @Service +@Transactional public class ArticleService { + private final ArticleRepository articleRepository; - private final MemberRepository memberRepository; - private final BoardRepository boardRepository; - public ArticleService(ArticleRepository articleRepository, - MemberRepository memberRepository, - BoardRepository boardRepository) { + public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; - this.memberRepository = memberRepository; - this.boardRepository = boardRepository; } - public List
getAllArticles() { - return articleRepository.findAll(); + public Article createArticle(Long authorId, Long boardId, String title, String content) { + Article article = new Article(authorId, boardId, title, content); + articleRepository.save(article); + return article; } - public Article getArticleById(Long id) { - try { - return articleRepository.findById(id); - } catch (EmptyResultDataAccessException e) { - throw new ArticleNotFoundException(id); - } + public Article findArticle(Long id) { + return articleRepository.findById(id); } - @Transactional - public void createArticle(Article article) { - if (article == null || article.getAuthorID() == null || article.getBoardID() == null - || article.getTitle() == null || article.getContent() == null) { - throw new InvalidInputException("null값이 존재합니다"); - } - try { - memberRepository.findById(article.getAuthorID()); - } catch (EmptyResultDataAccessException e) { - throw new ArticleCreateException(article.getAuthorID(), article.getBoardID()); - } - try { - boardRepository.findById(article.getBoardID()); - } catch (EmptyResultDataAccessException e) { - throw new ArticleCreateException(article.getAuthorID(), article.getBoardID()); - } - article.setCreatedDate(LocalDateTime.now()); - article.setModifiedDate(LocalDateTime.now()); - articleRepository.save(article); + public List
findAllArticles() { + return articleRepository.findAll(); } - @Transactional - public void updateArticle(Article article) { - if (article == null || article.getId() == null || article.getAuthorID() == null - || article.getBoardID() == null || article.getTitle() == null || article.getContent() == null) { - throw new InvalidInputException("null값이 존재합니다"); - } - try { - memberRepository.findById(article.getAuthorID()); - } catch (EmptyResultDataAccessException e) { - throw new ArticleUpdateException(article.getAuthorID(), article.getBoardID()); - } - try { - boardRepository.findById(article.getBoardID()); - } catch (EmptyResultDataAccessException e) { - throw new ArticleUpdateException(article.getAuthorID(), article.getBoardID()); + public Article updateArticle(Long id, String title, String content) { + Article article = articleRepository.findById(id); + if (article == null) { + throw new RuntimeException("게시물을 찾을 수 없습니다. id=" + id); } - article.setModifiedDate(LocalDateTime.now()); - articleRepository.update(article); + article.setTitle(title); + article.setContent(content); + return articleRepository.update(article); } - @Transactional public void deleteArticle(Long id) { articleRepository.delete(id); } - @Transactional public List
getArticlesByBoardId(Long boardId) { return articleRepository.findByBoardId(boardId); } diff --git a/src/main/java/com/example/bcsd/Service/BoardService.java b/src/main/java/com/example/bcsd/Service/BoardService.java index 4c9596ff..6b74c69a 100644 --- a/src/main/java/com/example/bcsd/Service/BoardService.java +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -1,61 +1,46 @@ package com.example.bcsd.Service; -import com.example.bcsd.Repository.ArticleRepository; import com.example.bcsd.Repository.BoardRepository; import com.example.bcsd.model.Board; -import com.example.bcsd.Exception.BoardNotFoundException; -import com.example.bcsd.Exception.InvalidInputException; -import com.example.bcsd.Exception.BoardDeleteException; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service +@Transactional public class BoardService { + private final BoardRepository boardRepository; - private final ArticleRepository articleRepository; - public BoardService(BoardRepository boardRepository, ArticleRepository articleRepository) { + public BoardService(BoardRepository boardRepository) { this.boardRepository = boardRepository; - this.articleRepository = articleRepository; } - public List getAllBoards() { - return boardRepository.findAll(); + public Board createBoard(String name) { + Board board = new Board(name); + boardRepository.save(board); + return board; } - public Board getBoardById(Long id) { - try { - return boardRepository.findById(id); - } catch (EmptyResultDataAccessException e) { - throw new BoardNotFoundException(id); - } + public Board findBoard(Long id) { + return boardRepository.findById(id); } - @Transactional - public void createBoard(Board board) { - if (board == null || board.getName() == null) { - throw new InvalidInputException("null값이 존재합니다"); - } - boardRepository.save(board); + public List findAllBoards() { + return boardRepository.findAll(); } - @Transactional - public void updateBoard(Board board) { - if (board == null || board.getId() == null || board.getName() == null) { - throw new InvalidInputException("null값이 존재합니다"); + public Board updateBoard(Long id, String name) { + Board board = boardRepository.findById(id); + if (board == null) { + throw new RuntimeException("게시판을 찾을 수 없습니다. id=" + id); } - boardRepository.update(board); + board.setName(name); + return boardRepository.update(board); } - @Transactional public void deleteBoard(Long id) { - List articles = articleRepository.findByBoardId(id); - if (!articles.isEmpty()) { - throw new BoardDeleteException(id); - } boardRepository.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 0a55baf8..f025a283 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -1,70 +1,52 @@ package com.example.bcsd.Service; import com.example.bcsd.Repository.MemberRepository; -import com.example.bcsd.Repository.ArticleRepository; import com.example.bcsd.model.Member; -import com.example.bcsd.Exception.MemberNotFoundException; -import com.example.bcsd.Exception.EmailConflictException; -import com.example.bcsd.Exception.InvalidInputException; -import com.example.bcsd.Exception.MemberDeleteException; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; @Service +@Transactional public class MemberService { + private final MemberRepository memberRepository; - private final ArticleRepository articleRepository; - public MemberService(MemberRepository memberRepository, ArticleRepository articleRepository) { + public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; - this.articleRepository = articleRepository; } - public List getAllMembers() { - return memberRepository.findAll(); + public Member createMember(String name, String email, String password) { + Member member = new Member(name, email, password); + memberRepository.save(member); + return member; } - public Member getMemberById(Long id) { - try { - return memberRepository.findById(id); - } catch (EmptyResultDataAccessException e) { - throw new MemberNotFoundException(id); - } + public Member findMember(Long id) { + return memberRepository.findById(id); } - @Transactional - public void createMember(Member member) { - if (member == null || member.getName() == null || member.getEmail() == null) { - throw new InvalidInputException("null값이 존재합니다"); - } - memberRepository.save(member); + public List findAllMembers() { + return memberRepository.findAll(); } - @Transactional - public void updateMember(Member member) { - if (member == null || member.getId() == null || member.getEmail() == null) { - throw new InvalidInputException("null값이 존재합니다"); - } - List all = memberRepository.findAll(); - boolean conflict = all.stream() - .anyMatch(m -> !Objects.equals(m.getId(), member.getId()) - && Objects.equals(m.getEmail(), member.getEmail())); - if (conflict) { - throw new EmailConflictException(member.getEmail()); + public Member updateMember(Long id, String name, String email, String password) { + Member member = memberRepository.findById(id); + if (member == null) { + throw new RuntimeException("회원을 찾을 수 없습니다. id=" + id); } - memberRepository.update(member); + member.setName(name); + member.setEmail(email); + member.setPassword(password); + return memberRepository.update(member); } - @Transactional public void deleteMember(Long id) { - List articles = articleRepository.findByBoardId(id); - if (!articles.isEmpty()) { - throw new MemberDeleteException(id); - } memberRepository.delete(id); } + + public Member findByEmail(String email) { + return memberRepository.findByEmail(email); + } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 277cce63..952f6b49 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -1,51 +1,62 @@ package com.example.bcsd.model; -import com.example.bcsd.Service.ArticleService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import jakarta.persistence.*; import java.time.LocalDateTime; -import java.util.List; +@Entity +@Table(name = "article") public class Article { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Long authorID; - private Long boardID; + + @Column(name = "author_id", nullable = false) + private Long authorId; + + @Column(name = "board_id", nullable = false) + private Long boardId; + + @Column(nullable = false, length = 255) private String title; + + @Column(nullable = false, length = 2000) private String content; + + @Column(name = "created_date", updatable = false) private LocalDateTime createdDate; + + @Column(name = "modified_date") private LocalDateTime modifiedDate; - public Article() {} + protected Article() {} - public Article(Long id, Long authorID, Long boardID, String title, String content) { - this.id = id; - this.authorID = authorID; - this.boardID = boardID; + public Article(Long authorId, Long boardId, String title, String content) { + this.authorId = authorId; + this.boardId = boardId; this.title = title; this.content = content; + } + + @PrePersist + protected void onCreate() { this.createdDate = LocalDateTime.now(); this.modifiedDate = LocalDateTime.now(); } - public Long getId() { return id; } - public void setId(Long id) { this.id = id; } - - public Long getAuthorID() { return authorID; } - public void setAuthorID(Long authorID) { this.authorID = authorID; } - - public Long getBoardID() { return boardID; } - public void setBoardID(Long boardID) { this.boardID = boardID; } + @PreUpdate + protected void onUpdate() { + this.modifiedDate = LocalDateTime.now(); + } + public Long getId() { return id; } + public Long getAuthorId() { return authorId; } + public Long getBoardId() { return boardId; } public String getTitle() { return title; } - public void setTitle(String title) { this.title = title; } - public String getContent() { return content; } - public void setContent(String content) { this.content = content; } - public LocalDateTime getCreatedDate() { return createdDate; } - public void setCreatedDate(LocalDateTime createdDate) { this.createdDate = createdDate; } - public LocalDateTime getModifiedDate() { return modifiedDate; } - public void setModifiedDate(LocalDateTime modifiedDate) { this.modifiedDate = modifiedDate; } + + public void setTitle(String title) { this.title = title; } + public void setContent(String content) { this.content = content; } } diff --git a/src/main/java/com/example/bcsd/model/Board.java b/src/main/java/com/example/bcsd/model/Board.java index 41a56d5f..0cde8c86 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -1,22 +1,33 @@ package com.example.bcsd.model; +import jakarta.persistence.*; + +@Entity +@Table(name = "board") public class Board { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Column(nullable = false, length = 100) private String name; - public Board() {} + protected Board() {} - public Board(Long id, String name) { - this.id = id; + public Board(String name) { this.name = name; } - public Long getId() { + public Long getId() { return id; } - public void setId(Long id) { - this.id = id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; } - public String getName() { return name; } - public void setName(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 f00f3b50..aa3a49cb 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -1,29 +1,57 @@ package com.example.bcsd.model; +import jakarta.persistence.*; + +@Entity +@Table(name = "member") public class Member { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + + @Column(nullable = false, length = 50) private String name; + + @Column(nullable = false, unique = true, length = 100) private String email; + + @Column(nullable = false, length = 255) private String password; - public Member() {} + protected Member() {} - public Member(Long id, String name, String email, String password) { - this.id = id; + public Member(String name, String email, String password) { this.name = name; this.email = email; this.password = password; } - public Long getId() { return id; } - public void setId(Long id) { this.id = id; } + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } - public String getName() { return name; } - public void setName(String name) { this.name = name; } + public String getPassword() { + return password; + } - public String getEmail() { return email; } - public void setEmail(String email) { this.email = email; } + public void setName(String name) { + this.name = name; + } - public String getPassword() { return password; } - public void setPassword(String password) { this.password = password; } + public void setEmail(String email) { + this.email = email; + } + + public void setPassword(String password) { + this.password = password; + } } From 6431f5955dded21fbc79e8a260a6e041ce631191 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:13:51 +0900 Subject: [PATCH 38/50] =?UTF-8?q?refactor:Article=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=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/Board.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 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 0cde8c86..00c85dc3 100644 --- a/src/main/java/com/example/bcsd/model/Board.java +++ b/src/main/java/com/example/bcsd/model/Board.java @@ -1,6 +1,8 @@ package com.example.bcsd.model; import jakarta.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "board") @@ -13,6 +15,13 @@ public class Board { @Column(nullable = false, length = 100) private String name; + @OneToMany( + mappedBy = "board", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List
articles = new ArrayList<>(); + protected Board() {} public Board(String name) { @@ -27,7 +36,21 @@ public String getName() { return name; } - public void setName(String name) { + public List
getArticles() { + return articles; + } + + public void changeName(String name) { this.name = name; } + + public void addArticle(Article article) { + articles.add(article); + article.setBoard(this); + } + + public void removeArticle(Article article) { + articles.remove(article); + article.setBoard(null); + } } From 81e091546fa28bb7276fe13aeb1fe711263ad3a1 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:14:43 +0900 Subject: [PATCH 39/50] =?UTF-8?q?refactor:Board=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=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 --- .../bcsd/Controller/ArticleController.java | 31 ++++++---- .../bcsd/Repository/ArticleRepository.java | 41 ++----------- .../example/bcsd/Service/ArticleService.java | 41 ++++++++----- .../java/com/example/bcsd/model/Article.java | 58 ++++++++++++++----- 4 files changed, 95 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/example/bcsd/Controller/ArticleController.java b/src/main/java/com/example/bcsd/Controller/ArticleController.java index 3fc56b66..e8c7f389 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/Controller/ArticleController.java @@ -1,7 +1,7 @@ package com.example.bcsd.Controller; -import com.example.bcsd.model.Article; import com.example.bcsd.Service.ArticleService; +import com.example.bcsd.model.Article; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -10,6 +10,7 @@ @RestController @RequestMapping("/articles") public class ArticleController { + private final ArticleService articleService; public ArticleController(ArticleService articleService) { @@ -23,24 +24,30 @@ public ResponseEntity> getAllArticles() { @GetMapping("/{id}") public ResponseEntity
getArticleById(@PathVariable Long id) { - Article article = articleService.findArticle(id); - return ResponseEntity.ok(article); + return ResponseEntity.ok(articleService.findArticle(id)); } @PostMapping - public ResponseEntity
createArticle(@RequestBody Article article) { - Article saved = articleService.createArticle( - article.getAuthorId(), - article.getBoardId(), - article.getTitle(), - article.getContent() + public ResponseEntity
createArticle(@RequestBody ArticleCreateRequest request) { + Article article = articleService.createArticle( + request.getAuthorId(), + request.getBoardId(), + request.getTitle(), + request.getContent() ); - return ResponseEntity.ok(saved); + return ResponseEntity.ok(article); } @PutMapping("/{id}") - public ResponseEntity
updateArticle(@PathVariable Long id, @RequestBody Article article) { - Article updated = articleService.updateArticle(id, article.getTitle(), article.getContent()); + public ResponseEntity
updateArticle( + @PathVariable Long id, + @RequestBody ArticleUpdateRequest request + ) { + Article updated = articleService.updateArticle( + id, + request.getTitle(), + request.getContent() + ); return ResponseEntity.ok(updated); } diff --git a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java index 5374b36a..b481fd30 100644 --- a/src/main/java/com/example/bcsd/Repository/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/Repository/ArticleRepository.java @@ -1,45 +1,12 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Article; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; +import com.example.bcsd.model.Board; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -@Repository -public class ArticleRepository { +public interface ArticleRepository extends JpaRepository { - @PersistenceContext - private EntityManager em; - - public Article findById(Long id) { - return em.find(Article.class, id); - } - - public List
findAll() { - return em.createQuery("SELECT a FROM Article a", Article.class) - .getResultList(); - } - - public void save(Article article) { - em.persist(article); - } - - public Article update(Article article) { - return em.merge(article); - } - - public void delete(Long id) { - Article article = em.find(Article.class, id); - if (article != null) { - em.remove(article); - } - } - - public List
findByBoardId(Long boardId) { - return em.createQuery("SELECT a FROM Article a WHERE a.boardId = :boardId", Article.class) - .setParameter("boardId", boardId) - .getResultList(); - } + List
findByBoard(Board board); } diff --git a/src/main/java/com/example/bcsd/Service/ArticleService.java b/src/main/java/com/example/bcsd/Service/ArticleService.java index 49f231bd..535251cc 100644 --- a/src/main/java/com/example/bcsd/Service/ArticleService.java +++ b/src/main/java/com/example/bcsd/Service/ArticleService.java @@ -1,7 +1,9 @@ package com.example.bcsd.Service; import com.example.bcsd.Repository.ArticleRepository; +import com.example.bcsd.Repository.BoardRepository; import com.example.bcsd.model.Article; +import com.example.bcsd.model.Board; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,40 +14,53 @@ public class ArticleService { private final ArticleRepository articleRepository; + private final BoardRepository boardRepository; - public ArticleService(ArticleRepository articleRepository) { + public ArticleService(ArticleRepository articleRepository, BoardRepository boardRepository) { this.articleRepository = articleRepository; + this.boardRepository = boardRepository; } public Article createArticle(Long authorId, Long boardId, String title, String content) { - Article article = new Article(authorId, boardId, title, content); - articleRepository.save(article); + Board board = boardRepository.findById(boardId) + .orElseThrow(() -> new IllegalArgumentException("게시판을 찾을 수 없습니다. id=" + boardId)); + + Article article = new Article(authorId, title, content); + board.addArticle(article); + return article; } + @Transactional(readOnly = true) public Article findArticle(Long id) { - return articleRepository.findById(id); + return articleRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("게시물을 찾을 수 없습니다. id=" + id)); } + @Transactional(readOnly = true) public List
findAllArticles() { return articleRepository.findAll(); } public Article updateArticle(Long id, String title, String content) { - Article article = articleRepository.findById(id); - if (article == null) { - throw new RuntimeException("게시물을 찾을 수 없습니다. id=" + id); - } - article.setTitle(title); - article.setContent(content); - return articleRepository.update(article); + Article article = articleRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("게시물을 찾을 수 없습니다. id=" + id)); + + article.changeTitle(title); + article.changeContent(content); + + return article; } public void deleteArticle(Long id) { - articleRepository.delete(id); + articleRepository.deleteById(id); } + @Transactional(readOnly = true) public List
getArticlesByBoardId(Long boardId) { - return articleRepository.findByBoardId(boardId); + Board board = boardRepository.findById(boardId) + .orElseThrow(() -> new IllegalArgumentException("게시판을 찾을 수 없습니다. id=" + boardId)); + + return board.getArticles(); } } diff --git a/src/main/java/com/example/bcsd/model/Article.java b/src/main/java/com/example/bcsd/model/Article.java index 952f6b49..c403848b 100644 --- a/src/main/java/com/example/bcsd/model/Article.java +++ b/src/main/java/com/example/bcsd/model/Article.java @@ -14,8 +14,9 @@ public class Article { @Column(name = "author_id", nullable = false) private Long authorId; - @Column(name = "board_id", nullable = false) - private Long boardId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id", nullable = false) + private Board board; @Column(nullable = false, length = 255) private String title; @@ -29,11 +30,11 @@ public class Article { @Column(name = "modified_date") private LocalDateTime modifiedDate; - protected Article() {} + protected Article() { + } - public Article(Long authorId, Long boardId, String title, String content) { + public Article(Long authorId, String title, String content) { this.authorId = authorId; - this.boardId = boardId; this.title = title; this.content = content; } @@ -49,14 +50,43 @@ protected void onUpdate() { this.modifiedDate = LocalDateTime.now(); } - public Long getId() { return id; } - public Long getAuthorId() { return authorId; } - public Long getBoardId() { return boardId; } - public String getTitle() { return title; } - public String getContent() { return content; } - public LocalDateTime getCreatedDate() { return createdDate; } - public LocalDateTime getModifiedDate() { return modifiedDate; } + public Long getId() { + return id; + } + + public Long getAuthorId() { + return authorId; + } + + public Board getBoard() { + return board; + } - public void setTitle(String title) { this.title = title; } - public void setContent(String content) { this.content = content; } + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + public LocalDateTime getCreatedDate() { + return createdDate; + } + + public LocalDateTime getModifiedDate() { + return modifiedDate; + } + + void setBoard(Board board) { + this.board = board; + } + + public void changeTitle(String title) { + this.title = title; + } + + public void changeContent(String content) { + this.content = content; + } } From 15b8e3cf52cfa37dc2ff6679b77da6c388bb0ca2 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:16:29 +0900 Subject: [PATCH 40/50] =?UTF-8?q?feat:DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/ArticleCreateRequest.java | 25 +++++++++++++++++++ .../bcsd/Controller/ArticleUpdateRequest.java | 15 +++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java create mode 100644 src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java diff --git a/src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java new file mode 100644 index 00000000..bcd3912e --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java @@ -0,0 +1,25 @@ +package com.example.bcsd.Controller; + +public class ArticleCreateRequest { + + private Long authorId; + private Long boardId; + private String title; + private String content; + + public Long getAuthorId() { + return authorId; + } + + public Long getBoardId() { + return boardId; + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } +} diff --git a/src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java new file mode 100644 index 00000000..3106ba35 --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java @@ -0,0 +1,15 @@ +package com.example.bcsd.Controller; + +public class ArticleUpdateRequest { + + private String title; + private String content; + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } +} From 4001ebc87215530e1d3a1e2622543ecae8da732f Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:35:48 +0900 Subject: [PATCH 41/50] =?UTF-8?q?feat:DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/{Controller => dto}/ArticleCreateRequest.java | 2 +- .../bcsd/{Controller => dto}/ArticleUpdateRequest.java | 2 +- .../java/com/example/bcsd/dto/BoardCreateRequest.java | 10 ++++++++++ .../java/com/example/bcsd/dto/BoardUpdateRequest.java | 10 ++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) rename src/main/java/com/example/bcsd/{Controller => dto}/ArticleCreateRequest.java (91%) rename src/main/java/com/example/bcsd/{Controller => dto}/ArticleUpdateRequest.java (85%) create mode 100644 src/main/java/com/example/bcsd/dto/BoardCreateRequest.java create mode 100644 src/main/java/com/example/bcsd/dto/BoardUpdateRequest.java diff --git a/src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java b/src/main/java/com/example/bcsd/dto/ArticleCreateRequest.java similarity index 91% rename from src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java rename to src/main/java/com/example/bcsd/dto/ArticleCreateRequest.java index bcd3912e..839a7987 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/ArticleCreateRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.Controller; +package com.example.bcsd.dto; public class ArticleCreateRequest { diff --git a/src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java b/src/main/java/com/example/bcsd/dto/ArticleUpdateRequest.java similarity index 85% rename from src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java rename to src/main/java/com/example/bcsd/dto/ArticleUpdateRequest.java index 3106ba35..e2f76e3d 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleUpdateRequest.java +++ b/src/main/java/com/example/bcsd/dto/ArticleUpdateRequest.java @@ -1,4 +1,4 @@ -package com.example.bcsd.Controller; +package com.example.bcsd.dto; public class ArticleUpdateRequest { diff --git a/src/main/java/com/example/bcsd/dto/BoardCreateRequest.java b/src/main/java/com/example/bcsd/dto/BoardCreateRequest.java new file mode 100644 index 00000000..50b2ed41 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/BoardCreateRequest.java @@ -0,0 +1,10 @@ +package com.example.bcsd.dto; + +public class BoardCreateRequest { + + private String name; + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/example/bcsd/dto/BoardUpdateRequest.java b/src/main/java/com/example/bcsd/dto/BoardUpdateRequest.java new file mode 100644 index 00000000..c7cd108e --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/BoardUpdateRequest.java @@ -0,0 +1,10 @@ +package com.example.bcsd.dto; + +public class BoardUpdateRequest { + + private String name; + + public String getName() { + return name; + } +} From 7d21d68c17d80baa93683ed314f44f73ec5adef6 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:50:49 +0900 Subject: [PATCH 42/50] =?UTF-8?q?feat:DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/dto/MemberCreateRequest.java | 20 +++++++++++++++++++ .../example/bcsd/dto/MemberUpdateRequest.java | 15 ++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/com/example/bcsd/dto/MemberCreateRequest.java create mode 100644 src/main/java/com/example/bcsd/dto/MemberUpdateRequest.java diff --git a/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java b/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java new file mode 100644 index 00000000..a627918f --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java @@ -0,0 +1,20 @@ +package com.example.bcsd.dto; + +public class MemberCreateRequest { + + private String name; + private String email; + private String password; + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } +} diff --git a/src/main/java/com/example/bcsd/dto/MemberUpdateRequest.java b/src/main/java/com/example/bcsd/dto/MemberUpdateRequest.java new file mode 100644 index 00000000..787c0c6f --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/MemberUpdateRequest.java @@ -0,0 +1,15 @@ +package com.example.bcsd.dto; + +public class MemberUpdateRequest { + + private String name; + private String password; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } +} From d64bcbda1130138be096d6b70a113bcca69a8fcf Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:53:02 +0900 Subject: [PATCH 43/50] =?UTF-8?q?refactor:=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/ArticleController.java | 2 ++ .../bcsd/Controller/BoardController.java | 13 +++++++---- .../bcsd/Controller/MemberController.java | 22 ++++++++++++------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/bcsd/Controller/ArticleController.java b/src/main/java/com/example/bcsd/Controller/ArticleController.java index e8c7f389..6aaa071a 100644 --- a/src/main/java/com/example/bcsd/Controller/ArticleController.java +++ b/src/main/java/com/example/bcsd/Controller/ArticleController.java @@ -1,6 +1,8 @@ package com.example.bcsd.Controller; import com.example.bcsd.Service.ArticleService; +import com.example.bcsd.dto.ArticleCreateRequest; +import com.example.bcsd.dto.ArticleUpdateRequest; import com.example.bcsd.model.Article; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/example/bcsd/Controller/BoardController.java b/src/main/java/com/example/bcsd/Controller/BoardController.java index 179ec6d3..47d9def5 100644 --- a/src/main/java/com/example/bcsd/Controller/BoardController.java +++ b/src/main/java/com/example/bcsd/Controller/BoardController.java @@ -2,6 +2,8 @@ import com.example.bcsd.Service.BoardService; import com.example.bcsd.model.Board; +import com.example.bcsd.dto.BoardCreateRequest; +import com.example.bcsd.dto.BoardUpdateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -28,14 +30,17 @@ public ResponseEntity getBoard(@PathVariable Long id) { } @PostMapping - public ResponseEntity createBoard(@RequestBody Board board) { - Board saved = boardService.createBoard(board.getName()); + public ResponseEntity createBoard(@RequestBody BoardCreateRequest request) { + Board saved = boardService.createBoard(request.getName()); return ResponseEntity.ok(saved); } @PutMapping("/{id}") - public ResponseEntity updateBoard(@PathVariable Long id, @RequestBody Board board) { - Board updated = boardService.updateBoard(id, board.getName()); + public ResponseEntity updateBoard( + @PathVariable Long id, + @RequestBody BoardUpdateRequest request + ) { + Board updated = boardService.updateBoard(id, request.getName()); return ResponseEntity.ok(updated); } diff --git a/src/main/java/com/example/bcsd/Controller/MemberController.java b/src/main/java/com/example/bcsd/Controller/MemberController.java index 43b94b7c..795eef20 100644 --- a/src/main/java/com/example/bcsd/Controller/MemberController.java +++ b/src/main/java/com/example/bcsd/Controller/MemberController.java @@ -2,6 +2,8 @@ import com.example.bcsd.Service.MemberService; import com.example.bcsd.model.Member; +import com.example.bcsd.dto.MemberCreateRequest; +import com.example.bcsd.dto.MemberUpdateRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -28,22 +30,26 @@ public ResponseEntity getMember(@PathVariable Long id) { } @PostMapping - public ResponseEntity createMember(@RequestBody Member member) { + public ResponseEntity createMember( + @RequestBody MemberCreateRequest request + ) { Member saved = memberService.createMember( - member.getName(), - member.getEmail(), - member.getPassword() + request.getName(), + request.getEmail(), + request.getPassword() ); return ResponseEntity.ok(saved); } @PutMapping("/{id}") - public ResponseEntity updateMember(@PathVariable Long id, @RequestBody Member member) { + public ResponseEntity updateMember( + @PathVariable Long id, + @RequestBody MemberUpdateRequest request + ) { Member updated = memberService.updateMember( id, - member.getName(), - member.getEmail(), - member.getPassword() + request.getName(), + request.getPassword() ); return ResponseEntity.ok(updated); } From 774d20c5857c6b341d43a1410c98fc345f782429 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:53:30 +0900 Subject: [PATCH 44/50] =?UTF-8?q?refactor:=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=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 --- .../example/bcsd/Service/BoardService.java | 19 ++++++----- .../example/bcsd/Service/MemberService.java | 32 +++++++++++-------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/example/bcsd/Service/BoardService.java b/src/main/java/com/example/bcsd/Service/BoardService.java index 6b74c69a..0e9545cb 100644 --- a/src/main/java/com/example/bcsd/Service/BoardService.java +++ b/src/main/java/com/example/bcsd/Service/BoardService.java @@ -19,28 +19,27 @@ public BoardService(BoardRepository boardRepository) { public Board createBoard(String name) { Board board = new Board(name); - boardRepository.save(board); - return board; + return boardRepository.save(board); } + @Transactional(readOnly = true) public Board findBoard(Long id) { - return boardRepository.findById(id); + return boardRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("게시판을 찾을 수 없습니다. id=" + id)); } + @Transactional(readOnly = true) public List findAllBoards() { return boardRepository.findAll(); } public Board updateBoard(Long id, String name) { - Board board = boardRepository.findById(id); - if (board == null) { - throw new RuntimeException("게시판을 찾을 수 없습니다. id=" + id); - } - board.setName(name); - return boardRepository.update(board); + Board board = findBoard(id); + board.changeName(name); + return board; } public void deleteBoard(Long id) { - boardRepository.delete(id); + boardRepository.deleteById(id); } } diff --git a/src/main/java/com/example/bcsd/Service/MemberService.java b/src/main/java/com/example/bcsd/Service/MemberService.java index f025a283..9e46010e 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -19,34 +19,38 @@ public MemberService(MemberRepository memberRepository) { public Member createMember(String name, String email, String password) { Member member = new Member(name, email, password); - memberRepository.save(member); - return member; + return memberRepository.save(member); } + @Transactional(readOnly = true) public Member findMember(Long id) { - return memberRepository.findById(id); + return memberRepository.findById(id) + .orElseThrow(() -> + new IllegalArgumentException("회원을 찾을 수 없습니다. id=" + id) + ); } + @Transactional(readOnly = true) public List findAllMembers() { return memberRepository.findAll(); } - public Member updateMember(Long id, String name, String email, String password) { - Member member = memberRepository.findById(id); - if (member == null) { - throw new RuntimeException("회원을 찾을 수 없습니다. id=" + id); - } - member.setName(name); - member.setEmail(email); - member.setPassword(password); - return memberRepository.update(member); + public Member updateMember(Long id, String name, String password) { + Member member = findMember(id); + member.changeName(name); + member.changePassword(password); + return member; } public void deleteMember(Long id) { - memberRepository.delete(id); + memberRepository.deleteById(id); } + @Transactional(readOnly = true) public Member findByEmail(String email) { - return memberRepository.findByEmail(email); + return memberRepository.findByEmail(email) + .orElseThrow(() -> + new IllegalArgumentException("회원을 찾을 수 없습니다. email=" + email) + ); } } From 06dffa098dbab97df980e46a77094387a7210685 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:54:22 +0900 Subject: [PATCH 45/50] =?UTF-8?q?refactor:=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Repository/BoardRepository.java | 36 +-------------- .../bcsd/Repository/MemberRepository.java | 45 ++----------------- 2 files changed, 6 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/example/bcsd/Repository/BoardRepository.java b/src/main/java/com/example/bcsd/Repository/BoardRepository.java index 0fde27d2..8d665fa0 100644 --- a/src/main/java/com/example/bcsd/Repository/BoardRepository.java +++ b/src/main/java/com/example/bcsd/Repository/BoardRepository.java @@ -1,39 +1,7 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Board; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; - -@Repository -public class BoardRepository { - - @PersistenceContext - private EntityManager em; - - public void save(Board board) { - em.persist(board); - } - - public Board findById(Long id) { - return em.find(Board.class, id); - } - - public List findAll() { - return em.createQuery("SELECT b FROM Board b", Board.class) - .getResultList(); - } - - public Board update(Board board) { - return em.merge(board); - } - - public void delete(Long id) { - Board board = em.find(Board.class, id); - if (board != null) { - em.remove(board); - } - } +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 ec216249..c9a89102 100644 --- a/src/main/java/com/example/bcsd/Repository/MemberRepository.java +++ b/src/main/java/com/example/bcsd/Repository/MemberRepository.java @@ -1,48 +1,11 @@ package com.example.bcsd.Repository; import com.example.bcsd.model.Member; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; +import java.util.Optional; -@Repository -public class MemberRepository { +public interface MemberRepository extends JpaRepository { - @PersistenceContext - private EntityManager em; - - public void save(Member member) { - em.persist(member); - } - - public Member findById(Long id) { - return em.find(Member.class, id); - } - - public List findAll() { - return em.createQuery("SELECT m FROM Member m", Member.class) - .getResultList(); - } - - public Member update(Member member) { - return em.merge(member); - } - - public void delete(Long id) { - Member member = em.find(Member.class, id); - if (member != null) { - em.remove(member); - } - } - - public Member findByEmail(String email) { - List result = em.createQuery( - "SELECT m FROM Member m WHERE m.email = :email", Member.class) - .setParameter("email", email) - .getResultList(); - - return result.isEmpty() ? null : result.get(0); - } + Optional findByEmail(String email); } From 0ac28f59f2a9eff1af5942e81b9e3ffe76f71af6 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 29 Dec 2025 20:54:53 +0900 Subject: [PATCH 46/50] =?UTF-8?q?fix:=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=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 --- src/main/java/com/example/bcsd/model/Member.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index aa3a49cb..edcec0cc 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -19,7 +19,8 @@ public class Member { @Column(nullable = false, length = 255) private String password; - protected Member() {} + protected Member() { + } public Member(String name, String email, String password) { this.name = name; @@ -43,15 +44,15 @@ public String getPassword() { return password; } - public void setName(String name) { + public void changeName(String name) { this.name = name; } - public void setEmail(String email) { + public void changeEmail(String email) { this.email = email; } - public void setPassword(String password) { - this.password = password; + public void changePassword(String encodedPassword) { + this.password = encodedPassword; } } From a9c4c92bf274bf739cc650e405a46ff8b2500220 Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 5 Jan 2026 20:20:03 +0900 Subject: [PATCH 47/50] =?UTF-8?q?feat:=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=8B=B4=EB=8B=B9=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/LoginController.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/com/example/bcsd/Controller/LoginController.java diff --git a/src/main/java/com/example/bcsd/Controller/LoginController.java b/src/main/java/com/example/bcsd/Controller/LoginController.java new file mode 100644 index 00000000..53e00a0b --- /dev/null +++ b/src/main/java/com/example/bcsd/Controller/LoginController.java @@ -0,0 +1,31 @@ +package com.example.bcsd.Controller; + +import com.example.bcsd.Service.MemberService; +import com.example.bcsd.dto.MemberLoginRequest; +import com.example.bcsd.model.Member; +import jakarta.servlet.http.HttpSession; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/login") +public class LoginController { + + private final MemberService memberService; + + public LoginController(MemberService memberService) { + this.memberService = memberService; + } + + @PostMapping + public ResponseEntity login( + @RequestBody MemberLoginRequest request, + HttpSession session + ) { + Member member = memberService.login(request); + + session.setAttribute("LOGIN_MEMBER_ID", member.getId()); + + return ResponseEntity.ok(member); + } +} From cf75e0bf9fe3824a13138d5ec8dfe90a9faf607c Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 5 Jan 2026 20:20:20 +0900 Subject: [PATCH 48/50] =?UTF-8?q?feat:=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20dto=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/LoginRequest.java | 23 +++++++++++++++++++ .../example/bcsd/dto/MemberLoginRequest.java | 22 ++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/com/example/bcsd/dto/LoginRequest.java create mode 100644 src/main/java/com/example/bcsd/dto/MemberLoginRequest.java diff --git a/src/main/java/com/example/bcsd/dto/LoginRequest.java b/src/main/java/com/example/bcsd/dto/LoginRequest.java new file mode 100644 index 00000000..501bfdc9 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/LoginRequest.java @@ -0,0 +1,23 @@ +package com.example.bcsd.dto; + +public class LoginRequest { + + private String email; + private String password; + + public LoginRequest() { + } + + public LoginRequest(String email, String password) { + this.email = email; + this.password = password; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } +} diff --git a/src/main/java/com/example/bcsd/dto/MemberLoginRequest.java b/src/main/java/com/example/bcsd/dto/MemberLoginRequest.java new file mode 100644 index 00000000..2ecd4e56 --- /dev/null +++ b/src/main/java/com/example/bcsd/dto/MemberLoginRequest.java @@ -0,0 +1,22 @@ +package com.example.bcsd.dto; + +public class MemberLoginRequest { + + private String email; + private String password; + + public MemberLoginRequest() {} + + public MemberLoginRequest(String email, String password) { + this.email = email; + this.password = password; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } +} From 706ea3f6a4f4695eb03d1ac262376a7ae300802b Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 5 Jan 2026 20:20:43 +0900 Subject: [PATCH 49/50] =?UTF-8?q?refactor:=EC=84=B8=EC=85=98=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EB=B0=A9=EC=8B=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/Controller/MemberController.java | 49 +++++++++------- .../example/bcsd/Service/MemberService.java | 57 ++++++++++++------- .../java/com/example/bcsd/model/Member.java | 6 ++ 3 files changed, 70 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/example/bcsd/Controller/MemberController.java b/src/main/java/com/example/bcsd/Controller/MemberController.java index 795eef20..c1e51520 100644 --- a/src/main/java/com/example/bcsd/Controller/MemberController.java +++ b/src/main/java/com/example/bcsd/Controller/MemberController.java @@ -1,9 +1,11 @@ package com.example.bcsd.Controller; import com.example.bcsd.Service.MemberService; -import com.example.bcsd.model.Member; import com.example.bcsd.dto.MemberCreateRequest; +import com.example.bcsd.dto.MemberLoginRequest; import com.example.bcsd.dto.MemberUpdateRequest; +import com.example.bcsd.model.Member; +import jakarta.servlet.http.HttpSession; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,49 +16,54 @@ public class MemberController { private final MemberService memberService; + private static final String LOGIN_MEMBER_ID = "LOGIN_MEMBER_ID"; public MemberController(MemberService memberService) { this.memberService = memberService; } @GetMapping - public ResponseEntity> getAllMembers() { + public ResponseEntity> findAll() { return ResponseEntity.ok(memberService.findAllMembers()); } @GetMapping("/{id}") - public ResponseEntity getMember(@PathVariable Long id) { + public ResponseEntity findOne(@PathVariable Long id) { return ResponseEntity.ok(memberService.findMember(id)); } @PostMapping - public ResponseEntity createMember( - @RequestBody MemberCreateRequest request - ) { - Member saved = memberService.createMember( - request.getName(), - request.getEmail(), - request.getPassword() - ); - return ResponseEntity.ok(saved); + public ResponseEntity create(@RequestBody MemberCreateRequest request) { + return ResponseEntity.ok(memberService.createMember(request)); } @PutMapping("/{id}") - public ResponseEntity updateMember( + public ResponseEntity update( @PathVariable Long id, @RequestBody MemberUpdateRequest request ) { - Member updated = memberService.updateMember( - id, - request.getName(), - request.getPassword() - ); - return ResponseEntity.ok(updated); + return ResponseEntity.ok(memberService.updateMember(id, request)); } @DeleteMapping("/{id}") - public ResponseEntity deleteMember(@PathVariable Long id) { + public ResponseEntity delete(@PathVariable Long id) { memberService.deleteMember(id); - return ResponseEntity.ok().build(); + return ResponseEntity.noContent().build(); + } + + @PostMapping("/login") + public ResponseEntity login( + @RequestBody MemberLoginRequest request, + HttpSession session + ) { + Member member = memberService.login(request); + session.setAttribute(LOGIN_MEMBER_ID, member.getId()); + return ResponseEntity.ok(member); + } + + @PostMapping("/logout") + public ResponseEntity logout(HttpSession session) { + session.invalidate(); + return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/com/example/bcsd/Service/MemberService.java b/src/main/java/com/example/bcsd/Service/MemberService.java index 9e46010e..ced9f6ba 100644 --- a/src/main/java/com/example/bcsd/Service/MemberService.java +++ b/src/main/java/com/example/bcsd/Service/MemberService.java @@ -1,14 +1,15 @@ package com.example.bcsd.Service; import com.example.bcsd.Repository.MemberRepository; +import com.example.bcsd.dto.MemberCreateRequest; +import com.example.bcsd.dto.MemberLoginRequest; +import com.example.bcsd.dto.MemberUpdateRequest; import com.example.bcsd.model.Member; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service -@Transactional public class MemberService { private final MemberRepository memberRepository; @@ -17,28 +18,28 @@ public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } - public Member createMember(String name, String email, String password) { - Member member = new Member(name, email, password); - return memberRepository.save(member); + public List findAllMembers() { + return memberRepository.findAll(); } - @Transactional(readOnly = true) public Member findMember(Long id) { return memberRepository.findById(id) - .orElseThrow(() -> - new IllegalArgumentException("회원을 찾을 수 없습니다. id=" + id) - ); + .orElseThrow(() -> new IllegalArgumentException("Member not found")); } - @Transactional(readOnly = true) - public List findAllMembers() { - return memberRepository.findAll(); + public Member createMember(MemberCreateRequest request) { + Member member = new Member( + request.getName(), + request.getEmail(), + request.getPassword() + ); + return memberRepository.save(member); } - public Member updateMember(Long id, String name, String password) { + public Member updateMember(Long id, MemberUpdateRequest request) { Member member = findMember(id); - member.changeName(name); - member.changePassword(password); + member.changeName(request.getName()); + member.changePassword(request.getPassword()); return member; } @@ -46,11 +47,25 @@ public void deleteMember(Long id) { memberRepository.deleteById(id); } - @Transactional(readOnly = true) - public Member findByEmail(String email) { - return memberRepository.findByEmail(email) - .orElseThrow(() -> - new IllegalArgumentException("회원을 찾을 수 없습니다. email=" + email) - ); + public Member login(MemberLoginRequest request) { + Member member = memberRepository.findByEmail(request.getEmail()) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다.")); + + if (!member.getPassword().equals(request.getPassword())) { + throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); + } + + return member; + } + + public Member login(String email, String password) { + Member member = memberRepository.findByEmail(email) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다.")); + + if (!member.getPassword().equals(password)) { + throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); + } + + return member; } } diff --git a/src/main/java/com/example/bcsd/model/Member.java b/src/main/java/com/example/bcsd/model/Member.java index edcec0cc..b513fdc5 100644 --- a/src/main/java/com/example/bcsd/model/Member.java +++ b/src/main/java/com/example/bcsd/model/Member.java @@ -55,4 +55,10 @@ public void changeEmail(String email) { public void changePassword(String encodedPassword) { this.password = encodedPassword; } + + public void update(String name, String password) { + this.name = name; + this.password = password; + } + } From 464544e5ccea7bad1c90bde7a8d0765b3af3a64f Mon Sep 17 00:00:00 2001 From: pizzaa0930 Date: Mon, 5 Jan 2026 20:20:59 +0900 Subject: [PATCH 50/50] =?UTF-8?q?feat:=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85?= =?UTF-8?q?=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/MemberCreateRequest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java b/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java index a627918f..90c7b66c 100644 --- a/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java +++ b/src/main/java/com/example/bcsd/dto/MemberCreateRequest.java @@ -1,11 +1,21 @@ package com.example.bcsd.dto; +import com.example.bcsd.model.Member; + public class MemberCreateRequest { private String name; private String email; private String password; + public MemberCreateRequest() {} + + public MemberCreateRequest(String name, String email, String password) { + this.name = name; + this.email = email; + this.password = password; + } + public String getName() { return name; } @@ -17,4 +27,8 @@ public String getEmail() { public String getPassword() { return password; } + + public Member toEntity() { + return new Member(name, email, password); + } }