From 649e8e5de4018ad1b7bff3e02472c57f066d10a1 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 5 May 2025 09:47:34 +0900 Subject: [PATCH 01/29] =?UTF-8?q?feat:=20/introduce=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/IntroduceController.java | 15 +++++++++++++++ src/main/resources/templates/introduce.html | 9 +++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/com/example/bcsd/IntroduceController.java create mode 100644 src/main/resources/templates/introduce.html diff --git a/src/main/java/com/example/bcsd/IntroduceController.java b/src/main/java/com/example/bcsd/IntroduceController.java new file mode 100644 index 00000000..bbd2b642 --- /dev/null +++ b/src/main/java/com/example/bcsd/IntroduceController.java @@ -0,0 +1,15 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class IntroduceController { + + @GetMapping("/introduce") + public String introduce() { + return "introduce"; + } + +} diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html new file mode 100644 index 00000000..32bce740 --- /dev/null +++ b/src/main/resources/templates/introduce.html @@ -0,0 +1,9 @@ + + + + + + +

안녕하세요 저의 이름은 이하원 입니다.

+ + \ No newline at end of file From ecbd0e5a13fac840d7658d6bcf81811f6396d882 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 5 May 2025 10:00:47 +0900 Subject: [PATCH 02/29] =?UTF-8?q?feat=20:=20/introduce=3Fname=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/IntroduceController.java | 7 +++++-- src/main/resources/templates/introduce.html | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/bcsd/IntroduceController.java b/src/main/java/com/example/bcsd/IntroduceController.java index bbd2b642..e9277e97 100644 --- a/src/main/java/com/example/bcsd/IntroduceController.java +++ b/src/main/java/com/example/bcsd/IntroduceController.java @@ -1,14 +1,17 @@ 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 IntroduceController { @GetMapping("/introduce") - public String introduce() { + public String introduce(@RequestParam(name="name", required=false, defaultValue="이하원") String name, Model model) { + model.addAttribute("name", name); return "introduce"; } diff --git a/src/main/resources/templates/introduce.html b/src/main/resources/templates/introduce.html index 32bce740..8e6ed584 100644 --- a/src/main/resources/templates/introduce.html +++ b/src/main/resources/templates/introduce.html @@ -1,9 +1,9 @@ - + - + -

안녕하세요 저의 이름은 이하원 입니다.

+

\ No newline at end of file From 2daa92fb23e7176c92a3f6a4372dfce7b64cd4a9 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 5 May 2025 10:45:52 +0900 Subject: [PATCH 03/29] =?UTF-8?q?feat=20:=20/json=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/JsonController.java | 21 +++++++++++++++++++ src/main/resources/templates/json.html | 9 ++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/com/example/bcsd/JsonController.java create mode 100644 src/main/resources/templates/json.html diff --git a/src/main/java/com/example/bcsd/JsonController.java b/src/main/java/com/example/bcsd/JsonController.java new file mode 100644 index 00000000..57a82395 --- /dev/null +++ b/src/main/java/com/example/bcsd/JsonController.java @@ -0,0 +1,21 @@ +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.RequestParam; + + +@Controller +public class JsonController { + + @GetMapping("/json") + public String json(@RequestParam(name="age", required=false, defaultValue="23") int age, + @RequestParam(name = "name", required = false, defaultValue = "이하원") String name, + Model model) { + model.addAttribute("age", age); + model.addAttribute("name", name); + return "json"; + } + +} diff --git a/src/main/resources/templates/json.html b/src/main/resources/templates/json.html new file mode 100644 index 00000000..c4c698b8 --- /dev/null +++ b/src/main/resources/templates/json.html @@ -0,0 +1,9 @@ + + + + + + +

+ + \ No newline at end of file From 03c41c7af405f08abf4bf694003a9e94edf155fc Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 5 May 2025 12:17:16 +0900 Subject: [PATCH 04/29] =?UTF-8?q?refactor=20:=20/json=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=9D=84=20RestController=EB=A5=BC=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=B4=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 --- .../java/com/example/bcsd/JsonController.java | 21 ++++++++----------- src/main/resources/templates/json.html | 9 -------- 2 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 src/main/resources/templates/json.html diff --git a/src/main/java/com/example/bcsd/JsonController.java b/src/main/java/com/example/bcsd/JsonController.java index 57a82395..676ced1d 100644 --- a/src/main/java/com/example/bcsd/JsonController.java +++ b/src/main/java/com/example/bcsd/JsonController.java @@ -1,21 +1,18 @@ 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.RequestParam; +import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.Map; -@Controller +@RestController public class JsonController { @GetMapping("/json") - public String json(@RequestParam(name="age", required=false, defaultValue="23") int age, - @RequestParam(name = "name", required = false, defaultValue = "이하원") String name, - Model model) { - model.addAttribute("age", age); - model.addAttribute("name", name); - return "json"; + public Map json() { + Map map = new HashMap<>(); + map.put("age", 26); + map.put("name", "허준기"); + return map; } - } diff --git a/src/main/resources/templates/json.html b/src/main/resources/templates/json.html deleted file mode 100644 index c4c698b8..00000000 --- a/src/main/resources/templates/json.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - -

- - \ No newline at end of file From 4212b5f0d0caa76d117dde987d0b4f1957cd3c66 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 5 May 2025 14:36:56 +0900 Subject: [PATCH 05/29] =?UTF-8?q?feat=20:=20CRUD=20API=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleController.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/main/java/com/example/bcsd/ArticleController.java diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java new file mode 100644 index 00000000..514607ad --- /dev/null +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -0,0 +1,77 @@ +package com.example.bcsd; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/article") +public class ArticleController { + + private final Map articles = new HashMap<>(); + private long articleId = 1; + + @PostMapping + public ResponseEntity> create(@RequestBody Map article) { + String content = article.get("content"); + Map response = new HashMap<>(); + if (content != null) { + long id = articleId++; + articles.put(id, content); + response.put("message", "Article created"); + response.put("id", id); + return new ResponseEntity<>(response, HttpStatus.CREATED); + } else { + response.put("message", "Content is missing"); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + } + + @GetMapping("/{id}") + public ResponseEntity> getArticle(@PathVariable Long id) { + String article = articles.get(id); + Map response = new HashMap<>(); + if (article != null) { + response.put("content", article); + return new ResponseEntity<>(response, HttpStatus.OK); + } else { + response.put("message", "Article not found"); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + } + + @PutMapping("/{id}") + public ResponseEntity> update(@PathVariable Long id, @RequestBody Map article) { + String content = article.get("content"); + Map response = new HashMap<>(); + if (articles.containsKey(id)) { + if (content != null) { + articles.put(id, content); + response.put("message", "Article updated"); + return new ResponseEntity<>(response, HttpStatus.OK); + } else { + response.put("message", "Content is missing"); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + } else { + response.put("message", "Article not found"); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + } + + @DeleteMapping("/{id}") + public ResponseEntity> delete(@PathVariable Long id) { + Map response = new HashMap<>(); + if (articles.containsKey(id)) { + articles.remove(id); + response.put("message", "Article deleted"); + return new ResponseEntity<>(response, HttpStatus.NO_CONTENT); + } else { + response.put("message", "Article not found"); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + } +} \ No newline at end of file From 3317b28b0fa762aa094045d64bf44cefce7d0a38 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 12 May 2025 23:28:46 +0900 Subject: [PATCH 06/29] =?UTF-8?q?feat=20:=206=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/Article.java | 93 +++++++++++++++ .../com/example/bcsd/ArticleController.java | 109 ++++++++++-------- .../com/example/bcsd/ArticleRepository.java | 52 +++++++++ .../java/com/example/bcsd/ArticleService.java | 48 ++++++++ .../com/example/bcsd/BcsdApplication.java | 13 ++- src/main/java/com/example/bcsd/Board.java | 41 +++++++ .../com/example/bcsd/BoardRepository.java | 35 ++++++ .../java/com/example/bcsd/BoardService.java | 34 ++++++ src/main/java/com/example/bcsd/Member.java | 73 ++++++++++++ .../com/example/bcsd/MemberRepository.java | 31 +++++ .../java/com/example/bcsd/MemberService.java | 28 +++++ .../java/com/example/bcsd/PostController.java | 36 ++++++ src/main/resources/templates/posts.html | 18 +++ 13 files changed, 558 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/example/bcsd/Article.java create mode 100644 src/main/java/com/example/bcsd/ArticleRepository.java create mode 100644 src/main/java/com/example/bcsd/ArticleService.java create mode 100644 src/main/java/com/example/bcsd/Board.java create mode 100644 src/main/java/com/example/bcsd/BoardRepository.java create mode 100644 src/main/java/com/example/bcsd/BoardService.java create mode 100644 src/main/java/com/example/bcsd/Member.java create mode 100644 src/main/java/com/example/bcsd/MemberRepository.java create mode 100644 src/main/java/com/example/bcsd/MemberService.java create mode 100644 src/main/java/com/example/bcsd/PostController.java create mode 100644 src/main/resources/templates/posts.html 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..2e4561c2 --- /dev/null +++ b/src/main/java/com/example/bcsd/Article.java @@ -0,0 +1,93 @@ +package com.example.bcsd; + +public class Article { + private final long id; + private final long userId; + private final long boardId; + private final String postDate; + private String title; + private String content; + private String putDate; + + private Article(Builder builder) { + id = builder.id; + userId = builder.userId; + boardId = builder.boardId; + postDate = builder.postDate; + title = builder.title; + content = builder.content; + putDate = builder.putDate; + } + + public long getId() { + return id; + } + + public long getUserId() { + return userId; + } + + public long getBoardId() { + return boardId; + } + + public String getPostDate() { + return postDate; + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } + + public String getPutDate() { + return putDate; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setContent(String content) { + this.content = content; + } + + public void setPutDate(String putDate) { + this.putDate = putDate; + } + + public static class Builder { + private final long id; + private final long userId; + private final long boardId; + private final String postDate; + private String title; + private String content; + private String putDate = ""; + + public Builder(long id, long uId, long bId, String pD) { + this.id = id; + this.userId = uId; + this.boardId = bId; + this.postDate = pD; + this.putDate = pD; + } + + public Builder title(String val) { + title = val; + return this; + } + + public Builder content(String val) { + content = val; + return this; + } + + public Article build() { + return new Article(this); + } + } +} diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 514607ad..46e969c7 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -3,75 +3,82 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; +import java.util.List; import java.util.Map; @RestController -@RequestMapping("/article") +@RequestMapping("/articles") public class ArticleController { + private final ArticleService articleService; + private final MemberService memberService; + private final BoardService boardService; - private final Map articles = new HashMap<>(); - private long articleId = 1; + public ArticleController(ArticleService articleService, + MemberService memberService, + BoardService boardService) { + this.articleService = articleService; + this.memberService = memberService; + this.boardService = boardService; + } @PostMapping - public ResponseEntity> create(@RequestBody Map article) { - String content = article.get("content"); - Map response = new HashMap<>(); - if (content != null) { - long id = articleId++; - articles.put(id, content); - response.put("message", "Article created"); - response.put("id", id); - return new ResponseEntity<>(response, HttpStatus.CREATED); - } else { - response.put("message", "Content is missing"); - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + public ResponseEntity
post(@RequestBody Map article) { + long userId = Long.parseLong(article.get("userId")); + long boardId = Long.parseLong(article.get("boardId")); + + if (!memberService.validId(userId) || !boardService.validId(boardId)) { + return ResponseEntity.badRequest().build(); } + + String title = article.get("title"); + String content = article.get("content"); + + Article created = articleService.save(userId, boardId, title, content); + return ResponseEntity.status(HttpStatus.CREATED).body(created); } @GetMapping("/{id}") - public ResponseEntity> getArticle(@PathVariable Long id) { - String article = articles.get(id); - Map response = new HashMap<>(); - if (article != null) { - response.put("content", article); - return new ResponseEntity<>(response, HttpStatus.OK); - } else { - response.put("message", "Article not found"); - return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + public ResponseEntity
get(@PathVariable long id) { + if (!articleService.validArticle(id)) { + return ResponseEntity.notFound().build(); } + Article article = articleService.findById(id); + return ResponseEntity.ok(article); } @PutMapping("/{id}") - public ResponseEntity> update(@PathVariable Long id, @RequestBody Map article) { - String content = article.get("content"); - Map response = new HashMap<>(); - if (articles.containsKey(id)) { - if (content != null) { - articles.put(id, content); - response.put("message", "Article updated"); - return new ResponseEntity<>(response, HttpStatus.OK); - } else { - response.put("message", "Content is missing"); - return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); - } - } else { - response.put("message", "Article not found"); - return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + public ResponseEntity
put(@PathVariable long id, + @RequestBody Map article) { + if (!articleService.validArticle(id)) { + return ResponseEntity.notFound().build(); + } + String password = article.get("password"); + if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ + return ResponseEntity.badRequest().build(); } + String title = article.get("title"); + String content = article.get("content"); + Article updated = articleService.update(id, title, content); + return ResponseEntity.ok(updated); } @DeleteMapping("/{id}") - public ResponseEntity> delete(@PathVariable Long id) { - Map response = new HashMap<>(); - if (articles.containsKey(id)) { - articles.remove(id); - response.put("message", "Article deleted"); - return new ResponseEntity<>(response, HttpStatus.NO_CONTENT); - } else { - response.put("message", "Article not found"); - return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + public ResponseEntity delete(@PathVariable long id, + @RequestBody Map article) { + if (!articleService.validArticle(id)) { + return ResponseEntity.notFound().build(); } + String password = article.get("password"); + if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ + return ResponseEntity.badRequest().build(); + } + articleService.delete(id); + return ResponseEntity.noContent().build(); + } + + @GetMapping + public ResponseEntity> getAll() { + List
articles = articleService.findAll(); + return ResponseEntity.ok(articles); } -} \ No newline at end of file +} diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java new file mode 100644 index 00000000..226cb977 --- /dev/null +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -0,0 +1,52 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class ArticleRepository { + private final Map articleMap = new HashMap<>(); + private long articleId = 1; + + public Article save(long userId, long boardId, String postDate, String title, String content) { + long id = articleId++; + Article article = new Article.Builder(id, userId, boardId, postDate) + .title(title) + .content(content) + .build(); + articleMap.put(id, article); + return article; + } + + public boolean delete(long id) { + return articleMap.remove(id) != null; + } + + public List
findByBoardId(long boardId) { + List
result = new ArrayList<>(); + for (Article a : articleMap.values()) { + if (a.getBoardId() == boardId) { + result.add(a); + } + } + return result; + } + + public Article findById(long id) { + return articleMap.get(id); + } + + public void update(long id, String newTitle, String newContent, String newPutDate) { + Article article = articleMap.get(id); + article.setTitle(newTitle); + article.setContent(newContent); + article.setPutDate(newPutDate); + } + + public List
findAll() { + return new ArrayList<>(articleMap.values()); + } +} diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java new file mode 100644 index 00000000..8652c384 --- /dev/null +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -0,0 +1,48 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +public class ArticleService { + private final ArticleRepository articleRepository; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + + public ArticleService(ArticleRepository articleRepository) { + this.articleRepository = articleRepository; + } + + public Article save(long userId, long boardId, String title, String content) { + String now = LocalDateTime.now().format(formatter); + return articleRepository.save(userId, boardId, now, title, content); + } + + public Article findById(long id) { + return articleRepository.findById(id); + } + + public List
findByBoardId(long boardId) { + return articleRepository.findByBoardId(boardId); + } + + public boolean validArticle(long id) { + return articleRepository.findById(id) != null; + } + + public Article update(long id, String title, String content) { + String now = LocalDateTime.now().format(formatter); + articleRepository.update(id, title, content, now); + return articleRepository.findById(id); + } + + public boolean delete(long id) { + return articleRepository.delete(id); + } + + public List
findAll() { + return articleRepository.findAll(); + } +} diff --git a/src/main/java/com/example/bcsd/BcsdApplication.java b/src/main/java/com/example/bcsd/BcsdApplication.java index 6e3ecb1b..96cc4995 100644 --- a/src/main/java/com/example/bcsd/BcsdApplication.java +++ b/src/main/java/com/example/bcsd/BcsdApplication.java @@ -2,12 +2,21 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; @SpringBootApplication public class BcsdApplication { public static void main(String[] args) { - SpringApplication.run(BcsdApplication.class, args); - } + ApplicationContext ctx = SpringApplication.run(BcsdApplication.class, args); + MemberService memberService = ctx.getBean(MemberService.class); + BoardService boardService = ctx.getBean(BoardService.class); + + memberService.save("회원1", "member1@example.com", "password1"); + memberService.save("회원2", "member2@example.com", "password2"); + memberService.save("회원3", "member3@example.com", "password3"); + boardService.save("게시판1"); + boardService.save("게시판2"); + } } diff --git a/src/main/java/com/example/bcsd/Board.java b/src/main/java/com/example/bcsd/Board.java new file mode 100644 index 00000000..5b551f16 --- /dev/null +++ b/src/main/java/com/example/bcsd/Board.java @@ -0,0 +1,41 @@ +package com.example.bcsd; + +public class Board { + private final long id; + private String name; + + private Board(Builder builder) { + id = builder.id; + name = builder.name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static class Builder { + private final long id; + private String name = ""; + + public Builder(long id) { + this.id = id; + } + + public Builder name(String val) { + name = val; + return this; + } + + public Board build() { + return new Board(this); + } + } +} diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java new file mode 100644 index 00000000..e86c3fe4 --- /dev/null +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -0,0 +1,35 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class BoardRepository { + private final Map boardMap = new HashMap<>(); + private long boardId = 1; + + public Board save(String name) { + long id = boardId++; + Board board = new Board.Builder(id) + .name(name) + .build(); + boardMap.put(id, board); + return board; + } + + public boolean delete(long id) { + return boardMap.remove(id) != null; + } + + public Board findById(long id){ + return boardMap.get(id); + } + + public List findAll() { + return new ArrayList<>(boardMap.values()); + } +} diff --git a/src/main/java/com/example/bcsd/BoardService.java b/src/main/java/com/example/bcsd/BoardService.java new file mode 100644 index 00000000..75c2c961 --- /dev/null +++ b/src/main/java/com/example/bcsd/BoardService.java @@ -0,0 +1,34 @@ +package com.example.bcsd; + +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 save(String name) { + return boardRepository.save(name); + } + + public boolean delete(long id) { + return boardRepository.delete(id); + } + + public Board findById(long id) { + return boardRepository.findById(id); + } + + public boolean validId(long id) { + return boardRepository.findById(id) != null; + } + + public List findAll() { + return boardRepository.findAll(); + } +} diff --git a/src/main/java/com/example/bcsd/Member.java b/src/main/java/com/example/bcsd/Member.java new file mode 100644 index 00000000..db9e0bfe --- /dev/null +++ b/src/main/java/com/example/bcsd/Member.java @@ -0,0 +1,73 @@ +package com.example.bcsd; + +public class Member { + private final long id; + private String name; + private String email; + private String password; + + private Member(Builder builder) { + id = builder.id; + name = builder.name; + email = builder.email; + password = builder.password; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } + + public void setName(String name) { + this.name = name; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setPassword(String password) { + this.password = password; + } + + public static class Builder { + private final long id; + private String name = ""; + private String email = ""; + private String password = ""; + + public Builder(long id) { + this.id = id; + } + + public Builder name(String val) { + name = val; + return this; + } + + public Builder email(String val) { + email = val; + return this; + } + + public Builder password(String val) { + password = val; + return this; + } + + public Member build() { + return new Member(this); + } + } +} diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java new file mode 100644 index 00000000..862d7307 --- /dev/null +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -0,0 +1,31 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; + +@Repository +public class MemberRepository { + private final Map memberMap = new HashMap<>(); + private long memberId = 1; + + public Member save(String name, String email, String password) { + long id = memberId++; + Member member = new Member.Builder(id) + .name(name) + .email(email) + .password(password) + .build(); + memberMap.put(id, member); + return member; + } + + public boolean delete(long id) { + return memberMap.remove(id) != null; + } + + public Member findById(long id) { + return memberMap.get(id); + } +} diff --git a/src/main/java/com/example/bcsd/MemberService.java b/src/main/java/com/example/bcsd/MemberService.java new file mode 100644 index 00000000..2bc51698 --- /dev/null +++ b/src/main/java/com/example/bcsd/MemberService.java @@ -0,0 +1,28 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Service; + +@Service +public class MemberService { + private final MemberRepository memberRepository; + + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public Member save(String name, String email, String password) { + return memberRepository.save(name, email, password); + } + + public boolean delete(long id) { + return memberRepository.delete(id); + } + + public Member findById(long id) { + return memberRepository.findById(id); + } + + public boolean validId(long id) { + return memberRepository.findById(id) != null; + } +} diff --git a/src/main/java/com/example/bcsd/PostController.java b/src/main/java/com/example/bcsd/PostController.java new file mode 100644 index 00000000..beb14abb --- /dev/null +++ b/src/main/java/com/example/bcsd/PostController.java @@ -0,0 +1,36 @@ +package com.example.bcsd; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +public class PostController { + private final BoardService boardService; + private final ArticleService articleService; + + public PostController(BoardService boardService, + ArticleService articleService) { + this.boardService = boardService; + this.articleService = articleService; + } + + @GetMapping("/posts") + public String viewPosts(Model model) { + List boards = boardService.findAll(); + Map> articlesMap = new HashMap<>(); + for (Board board : boards) { + articlesMap.put( + board.getId(), + articleService.findByBoardId(board.getId()) + ); + } + model.addAttribute("boards", boards); + model.addAttribute("articlesMap", articlesMap); + return "posts"; + } +} diff --git a/src/main/resources/templates/posts.html b/src/main/resources/templates/posts.html new file mode 100644 index 00000000..b5fae6bd --- /dev/null +++ b/src/main/resources/templates/posts.html @@ -0,0 +1,18 @@ + + + + + 게시글 목록 + + +
+

게시판 이름

+
+

제목

+ 작성자 | + 최종수정일 +
내용
+
+
+ + From bec4afd28d3b46d7c6e0da68dd753dfce025e5da Mon Sep 17 00:00:00 2001 From: NIF404 Date: Sun, 18 May 2025 23:24:46 +0900 Subject: [PATCH 07/29] =?UTF-8?q?feat=20:=20DB=EC=97=B0=EA=B2=B0=ED=9B=84?= =?UTF-8?q?=20=EC=A0=95=EC=83=81=20=EC=8B=A4=ED=96=89=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ src/main/java/com/example/bcsd/BcsdApplication.java | 4 ++-- src/main/java/com/example/bcsd/BoardRepository.java | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index db3ebcf1..6f2674b2 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 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'mysql:mysql-connector-java:8.0.33' } tasks.named('test') { diff --git a/src/main/java/com/example/bcsd/BcsdApplication.java b/src/main/java/com/example/bcsd/BcsdApplication.java index 96cc4995..bc342b3b 100644 --- a/src/main/java/com/example/bcsd/BcsdApplication.java +++ b/src/main/java/com/example/bcsd/BcsdApplication.java @@ -2,13 +2,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class BcsdApplication { public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BcsdApplication.class, args); + ConfigurableApplicationContext ctx = SpringApplication.run(BcsdApplication.class, args); MemberService memberService = ctx.getBean(MemberService.class); BoardService boardService = ctx.getBean(BoardService.class); diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java index e86c3fe4..9a31d45a 100644 --- a/src/main/java/com/example/bcsd/BoardRepository.java +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -1,14 +1,22 @@ package com.example.bcsd; import org.springframework.stereotype.Repository; +import org.springframework.jdbc.core.JdbcTemplate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + @Repository public class BoardRepository { + + private JdbcTemplate jdbcTemplate; + BoardRepository(JdbcTemplate jdbcTemplate){ + this.jdbcTemplate = jdbcTemplate; + } + private final Map boardMap = new HashMap<>(); private long boardId = 1; From 6faf3dcfd7844e9dc3381c9a1dfd25c484319104 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 00:39:55 +0900 Subject: [PATCH 08/29] =?UTF-8?q?feat=20:=20BoardRepository=20DB=EC=99=80?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/BoardRepository.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java index 9a31d45a..b6eb20d7 100644 --- a/src/main/java/com/example/bcsd/BoardRepository.java +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -1,8 +1,11 @@ package com.example.bcsd; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import org.springframework.jdbc.core.JdbcTemplate; +import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -17,27 +20,47 @@ public class BoardRepository { this.jdbcTemplate = jdbcTemplate; } - private final Map boardMap = new HashMap<>(); - private long boardId = 1; - public Board save(String name) { - long id = boardId++; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "insert into board (name) values (?)", + new String[]{"id"}); + ps.setString(1, name); + return ps; + }, keyHolder); + + Long id = keyHolder.getKey().longValue(); + Board board = new Board.Builder(id) .name(name) .build(); - boardMap.put(id, board); + return board; } public boolean delete(long id) { - return boardMap.remove(id) != null; + return jdbcTemplate.update("DELETE FROM board WHERE id = ?", id) != 0; } public Board findById(long id){ - return boardMap.get(id); + return jdbcTemplate.queryForObject( + "SELECT id, name FROM board WHERE id = ?", + (resultSet, rowNum) -> new Board.Builder + (resultSet.getLong("id")) + .name(resultSet.getString("name")) + .build(), + id + ); } public List findAll() { - return new ArrayList<>(boardMap.values()); + return jdbcTemplate.query( + "SELECT id, name FROM board", + (resultSet, rowNum) -> new Board.Builder + (resultSet.getLong("id")) + .name(resultSet.getString("name")) + .build() + ); } } From ece05fd7aa87442f588c88cc2472ce84d121bc1b Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 00:54:34 +0900 Subject: [PATCH 09/29] =?UTF-8?q?feat=20:=20MemberRepository=20DB=EC=99=80?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/BoardRepository.java | 6 +-- .../com/example/bcsd/MemberRepository.java | 40 ++++++++++++++++--- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java index b6eb20d7..5a5da8aa 100644 --- a/src/main/java/com/example/bcsd/BoardRepository.java +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -6,16 +6,12 @@ import org.springframework.jdbc.core.JdbcTemplate; import java.sql.PreparedStatement; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; - @Repository public class BoardRepository { - private JdbcTemplate jdbcTemplate; + BoardRepository(JdbcTemplate jdbcTemplate){ this.jdbcTemplate = jdbcTemplate; } diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java index 862d7307..d8ca0ef2 100644 --- a/src/main/java/com/example/bcsd/MemberRepository.java +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -1,31 +1,59 @@ package com.example.bcsd; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; @Repository public class MemberRepository { - private final Map memberMap = new HashMap<>(); - private long memberId = 1; + private JdbcTemplate jdbcTemplate; + + MemberRepository(JdbcTemplate jdbcTemplate){ + this.jdbcTemplate = jdbcTemplate; + } public Member save(String name, String email, String password) { - long id = memberId++; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "insert into board (name, email, password) values (?, ?, ?)", + new String[]{"id"}); + ps.setString(1, name); + ps.setString(2, email); + ps.setString(3, password); + return ps; + }, keyHolder); + + Long id = keyHolder.getKey().longValue(); + Member member = new Member.Builder(id) .name(name) .email(email) .password(password) .build(); - memberMap.put(id, member); + return member; } public boolean delete(long id) { - return memberMap.remove(id) != null; + return jdbcTemplate.update("DELETE FROM member WHERE id = ?", id) != 0; } public Member findById(long id) { - return memberMap.get(id); + return jdbcTemplate.queryForObject( + "SELECT id, name, email, password FROM board WHERE id = ?", + (resultSet, rowNum) -> new Member.Builder + (resultSet.getLong("id")) + .name(resultSet.getString("name")) + .email(resultSet.getString("email")) + .password(resultSet.getString("password")) + .build(), + id + ); } } From 00978ba3dde8976911a00cf21c32de22c4fc60d9 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 01:42:34 +0900 Subject: [PATCH 10/29] =?UTF-8?q?feat=20:=20ArticleRepository=20DB?= =?UTF-8?q?=EC=99=80=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleRepository.java | 89 ++++++++++++++----- .../com/example/bcsd/MemberRepository.java | 8 +- 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index 226cb977..f495bcdb 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -1,52 +1,99 @@ package com.example.bcsd; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import java.util.ArrayList; -import java.util.HashMap; + +import java.sql.PreparedStatement; import java.util.List; -import java.util.Map; @Repository public class ArticleRepository { - private final Map articleMap = new HashMap<>(); - private long articleId = 1; + private JdbcTemplate jdbcTemplate; + + ArticleRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } public Article save(long userId, long boardId, String postDate, String title, String content) { - long id = articleId++; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "insert into article (author_id, board_id, title, content, created_date, modified_date) " + + "values (?, ?, ?, ?, ?, ?)", + new String[]{"id"}); + ps.setLong(1, userId); + ps.setLong(2, boardId); + ps.setString(3, title); + ps.setString(4, content); + ps.setString(5, postDate); + ps.setString(6, postDate); + return ps; + }, keyHolder); + + Long id = keyHolder.getKey().longValue(); + Article article = new Article.Builder(id, userId, boardId, postDate) .title(title) .content(content) .build(); - articleMap.put(id, article); + return article; } public boolean delete(long id) { - return articleMap.remove(id) != null; + return jdbcTemplate.update("DELETE FROM article WHERE id = ?", id) != 0; } public List
findByBoardId(long boardId) { - List
result = new ArrayList<>(); - for (Article a : articleMap.values()) { - if (a.getBoardId() == boardId) { - result.add(a); - } - } - return result; + return jdbcTemplate.query( + "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE board_id = ?", + (resultSet, rowNum) -> new Article.Builder + (resultSet.getLong("id"), + resultSet.getLong("author_id"), + resultSet.getLong("board_id"), + resultSet.getString("modified_date")) + .title(resultSet.getString("title")) + .content(resultSet.getString("content")) + .build(), + boardId + ); } public Article findById(long id) { - return articleMap.get(id); + return jdbcTemplate.queryForObject( + "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE id = ?", + (resultSet, rowNum) -> new Article.Builder + (resultSet.getLong("id"), + resultSet.getLong("author_id"), + resultSet.getLong("board_id"), + resultSet.getString("modified_date")) + .title(resultSet.getString("title")) + .content(resultSet.getString("content")) + .build(), + id + ); } public void update(long id, String newTitle, String newContent, String newPutDate) { - Article article = articleMap.get(id); - article.setTitle(newTitle); - article.setContent(newContent); - article.setPutDate(newPutDate); + jdbcTemplate.update( + "UPDATE article SET title = ?, content = ?, modified_date = ? WHERE id = ?", + newTitle, newContent, newPutDate, id + ); } public List
findAll() { - return new ArrayList<>(articleMap.values()); + return jdbcTemplate.query( + "SELECT id, author_id, board_id, title, content, modified_date FROM article", + (resultSet, rowNum) -> new Article.Builder + (resultSet.getLong("id"), + resultSet.getLong("author_id"), + resultSet.getLong("board_id"), + resultSet.getString("modified_date")) + .title(resultSet.getString("title")) + .content(resultSet.getString("content")) + .build() + ); } } diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java index d8ca0ef2..beb8a6c2 100644 --- a/src/main/java/com/example/bcsd/MemberRepository.java +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -6,14 +6,12 @@ import org.springframework.stereotype.Repository; import java.sql.PreparedStatement; -import java.util.HashMap; -import java.util.Map; @Repository public class MemberRepository { private JdbcTemplate jdbcTemplate; - MemberRepository(JdbcTemplate jdbcTemplate){ + MemberRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @@ -21,7 +19,7 @@ public Member save(String name, String email, String password) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement( - "insert into board (name, email, password) values (?, ?, ?)", + "insert into member (name, email, password) values (?, ?, ?)", new String[]{"id"}); ps.setString(1, name); ps.setString(2, email); @@ -46,7 +44,7 @@ public boolean delete(long id) { public Member findById(long id) { return jdbcTemplate.queryForObject( - "SELECT id, name, email, password FROM board WHERE id = ?", + "SELECT id, name, email, password FROM member WHERE id = ?", (resultSet, rowNum) -> new Member.Builder (resultSet.getLong("id")) .name(resultSet.getString("name")) From 06d4b907147a16b1e61f18e20284ad9f64f30284 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 02:43:59 +0900 Subject: [PATCH 11/29] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=EA=B0=92=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=EA=B9=8C=EC=A7=80=20DB?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=ED=98=84=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/BcsdApplication.java | 12 +----------- src/main/java/com/example/bcsd/PostController.java | 3 +++ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/bcsd/BcsdApplication.java b/src/main/java/com/example/bcsd/BcsdApplication.java index bc342b3b..2db4d466 100644 --- a/src/main/java/com/example/bcsd/BcsdApplication.java +++ b/src/main/java/com/example/bcsd/BcsdApplication.java @@ -2,21 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class BcsdApplication { public static void main(String[] args) { - ConfigurableApplicationContext ctx = SpringApplication.run(BcsdApplication.class, args); - MemberService memberService = ctx.getBean(MemberService.class); - BoardService boardService = ctx.getBean(BoardService.class); - - memberService.save("회원1", "member1@example.com", "password1"); - memberService.save("회원2", "member2@example.com", "password2"); - memberService.save("회원3", "member3@example.com", "password3"); - - boardService.save("게시판1"); - boardService.save("게시판2"); + SpringApplication.run(BcsdApplication.class, args); } } diff --git a/src/main/java/com/example/bcsd/PostController.java b/src/main/java/com/example/bcsd/PostController.java index beb14abb..096aabaf 100644 --- a/src/main/java/com/example/bcsd/PostController.java +++ b/src/main/java/com/example/bcsd/PostController.java @@ -1,8 +1,10 @@ package com.example.bcsd; +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.PathVariable; import java.util.HashMap; import java.util.List; @@ -33,4 +35,5 @@ public String viewPosts(Model model) { model.addAttribute("articlesMap", articlesMap); return "posts"; } + } From d8a774882029560403eb9e08630b09c9e841bd9b Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 03:07:25 +0900 Subject: [PATCH 12/29] =?UTF-8?q?feat=20:=207=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleController.java | 10 ++++++-- .../java/com/example/bcsd/PostController.java | 24 +++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 46e969c7..ac10ec0e 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -2,7 +2,11 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -77,8 +81,10 @@ public ResponseEntity delete(@PathVariable long id, } @GetMapping - public ResponseEntity> getAll() { - List
articles = articleService.findAll(); + public ResponseEntity> getArticlesByBoardId(@RequestParam(name="boardId", required=true) + Long id, Model model) { + List
articles = articleService.findByBoardId(id); + return ResponseEntity.ok(articles); } } diff --git a/src/main/java/com/example/bcsd/PostController.java b/src/main/java/com/example/bcsd/PostController.java index 096aabaf..11c56d96 100644 --- a/src/main/java/com/example/bcsd/PostController.java +++ b/src/main/java/com/example/bcsd/PostController.java @@ -5,12 +5,16 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller + public class PostController { private final BoardService boardService; private final ArticleService articleService; @@ -22,18 +26,18 @@ public PostController(BoardService boardService, } @GetMapping("/posts") - public String viewPosts(Model model) { - List boards = boardService.findAll(); + public String viewOnePost(@RequestParam(name="boardId", required=true) + Long id, Model model) { + List board = new ArrayList<>(); // 리스트에 하나만 넣는 꼼수 + board.add(boardService.findById(id)); Map> articlesMap = new HashMap<>(); - for (Board board : boards) { - articlesMap.put( - board.getId(), - articleService.findByBoardId(board.getId()) - ); - } - model.addAttribute("boards", boards); + articlesMap.put( + id, + articleService.findByBoardId(id) + ); + + model.addAttribute("boards", board); model.addAttribute("articlesMap", articlesMap); return "posts"; } - } From be8ff9224a966cab33238cc7878d88831a211275 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 19 May 2025 18:54:14 +0900 Subject: [PATCH 13/29] =?UTF-8?q?feat=20:=20=ED=8A=B8=EB=9E=9C=EC=9E=AD?= =?UTF-8?q?=EC=85=94=EB=84=90=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/ArticleService.java | 5 +++++ src/main/java/com/example/bcsd/BoardService.java | 3 +++ src/main/java/com/example/bcsd/MemberService.java | 3 +++ 3 files changed, 11 insertions(+) diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java index 8652c384..ea5cb1ed 100644 --- a/src/main/java/com/example/bcsd/ArticleService.java +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -1,6 +1,8 @@ package com.example.bcsd; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -15,6 +17,7 @@ public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } + @Transactional public Article save(long userId, long boardId, String title, String content) { String now = LocalDateTime.now().format(formatter); return articleRepository.save(userId, boardId, now, title, content); @@ -32,12 +35,14 @@ public boolean validArticle(long id) { return articleRepository.findById(id) != null; } + @Transactional public Article update(long id, String title, String content) { String now = LocalDateTime.now().format(formatter); articleRepository.update(id, title, content, now); return articleRepository.findById(id); } + @Transactional public boolean delete(long id) { return articleRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/BoardService.java b/src/main/java/com/example/bcsd/BoardService.java index 75c2c961..6a7ba19a 100644 --- a/src/main/java/com/example/bcsd/BoardService.java +++ b/src/main/java/com/example/bcsd/BoardService.java @@ -1,6 +1,7 @@ package com.example.bcsd; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -12,10 +13,12 @@ public BoardService(BoardRepository boardRepository) { this.boardRepository = boardRepository; } + @Transactional public Board save(String name) { return boardRepository.save(name); } + @Transactional public boolean delete(long id) { return boardRepository.delete(id); } diff --git a/src/main/java/com/example/bcsd/MemberService.java b/src/main/java/com/example/bcsd/MemberService.java index 2bc51698..8eae2ab2 100644 --- a/src/main/java/com/example/bcsd/MemberService.java +++ b/src/main/java/com/example/bcsd/MemberService.java @@ -1,6 +1,7 @@ package com.example.bcsd; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service public class MemberService { @@ -10,10 +11,12 @@ public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } + @Transactional public Member save(String name, String email, String password) { return memberRepository.save(name, email, password); } + @Transactional public boolean delete(long id) { return memberRepository.delete(id); } From d29cc8f2fc53742392917da9df924198617a6b1f Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 11:46:46 +0900 Subject: [PATCH 14/29] =?UTF-8?q?feat=20:=20=EC=82=AD=EC=A0=9C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/DBExceptionHandler.java | 9 +++++++++ .../com/example/bcsd/DBTableNotEmptyException.java | 13 +++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/com/example/bcsd/DBExceptionHandler.java create mode 100644 src/main/java/com/example/bcsd/DBTableNotEmptyException.java diff --git a/src/main/java/com/example/bcsd/DBExceptionHandler.java b/src/main/java/com/example/bcsd/DBExceptionHandler.java new file mode 100644 index 00000000..264255d1 --- /dev/null +++ b/src/main/java/com/example/bcsd/DBExceptionHandler.java @@ -0,0 +1,9 @@ +package com.example.bcsd; + +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class DBExceptionHandler { + + +} diff --git a/src/main/java/com/example/bcsd/DBTableNotEmptyException.java b/src/main/java/com/example/bcsd/DBTableNotEmptyException.java new file mode 100644 index 00000000..de86a4e4 --- /dev/null +++ b/src/main/java/com/example/bcsd/DBTableNotEmptyException.java @@ -0,0 +1,13 @@ +package com.example.bcsd; + +public class DBTableNotEmptyException extends RuntimeException { + private final int statusCode = 400; + + public DBTableNotEmptyException(String message) { + super(message); + } + + public int getStatusCode() { + return statusCode; + } +} From aeecbacaaaff1b081546305059340ed4faa8773d Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 11:50:10 +0900 Subject: [PATCH 15/29] =?UTF-8?q?feat=20:=20=EC=83=9D=EC=84=B1=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bcsd/DBInvalidCreationRequestException.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java diff --git a/src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java b/src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java new file mode 100644 index 00000000..509dcc60 --- /dev/null +++ b/src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java @@ -0,0 +1,14 @@ +package com.example.bcsd; + +public class DBInvalidCreationRequestException extends RuntimeException +{ + private final int statusCode = 400; + + public DBInvalidCreationRequestException(String message) { + super(message); + } + + public int getStatusCode() { + return statusCode; + } +} From c6d1c96c6c69696b3644f574aa37166812f6cd05 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 20:32:43 +0900 Subject: [PATCH 16/29] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=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 --- ...NotEmptyException.java => EntityHasArticleException.java} | 4 ++-- ...Exception.java => ReferencedEntityNotFoundException.java} | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) rename src/main/java/com/example/bcsd/{DBTableNotEmptyException.java => EntityHasArticleException.java} (57%) rename src/main/java/com/example/bcsd/{DBInvalidCreationRequestException.java => ReferencedEntityNotFoundException.java} (54%) diff --git a/src/main/java/com/example/bcsd/DBTableNotEmptyException.java b/src/main/java/com/example/bcsd/EntityHasArticleException.java similarity index 57% rename from src/main/java/com/example/bcsd/DBTableNotEmptyException.java rename to src/main/java/com/example/bcsd/EntityHasArticleException.java index de86a4e4..edfda7ca 100644 --- a/src/main/java/com/example/bcsd/DBTableNotEmptyException.java +++ b/src/main/java/com/example/bcsd/EntityHasArticleException.java @@ -1,9 +1,9 @@ package com.example.bcsd; -public class DBTableNotEmptyException extends RuntimeException { +public class EntityHasArticleException extends RuntimeException { private final int statusCode = 400; - public DBTableNotEmptyException(String message) { + public EntityHasArticleException(String message) { super(message); } diff --git a/src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java b/src/main/java/com/example/bcsd/ReferencedEntityNotFoundException.java similarity index 54% rename from src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java rename to src/main/java/com/example/bcsd/ReferencedEntityNotFoundException.java index 509dcc60..2300229d 100644 --- a/src/main/java/com/example/bcsd/DBInvalidCreationRequestException.java +++ b/src/main/java/com/example/bcsd/ReferencedEntityNotFoundException.java @@ -1,10 +1,9 @@ package com.example.bcsd; -public class DBInvalidCreationRequestException extends RuntimeException -{ +public class ReferencedEntityNotFoundException extends RuntimeException { private final int statusCode = 400; - public DBInvalidCreationRequestException(String message) { + public ReferencedEntityNotFoundException(String message) { super(message); } From 88826c73f2926006f6bd89762b3319f36d65c8a4 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 20:34:50 +0900 Subject: [PATCH 17/29] =?UTF-8?q?feat=20:=20NULL=EC=9D=B4=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=95=98=EB=8A=94=20=EC=83=9D=EC=84=B1=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/InvalidRequestBodyException.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/example/bcsd/InvalidRequestBodyException.java diff --git a/src/main/java/com/example/bcsd/InvalidRequestBodyException.java b/src/main/java/com/example/bcsd/InvalidRequestBodyException.java new file mode 100644 index 00000000..43f3b504 --- /dev/null +++ b/src/main/java/com/example/bcsd/InvalidRequestBodyException.java @@ -0,0 +1,13 @@ +package com.example.bcsd; + +public class InvalidRequestBodyException extends RuntimeException { + private final int statusCode = 400; + + public InvalidRequestBodyException(String message) { + super(message); + } + + public int getStatusCode() { + return statusCode; + } +} From 36d01a7db7cca606e46c85ac933579d8886cf8a0 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 20:38:10 +0900 Subject: [PATCH 18/29] =?UTF-8?q?feat=20:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/bcsd/EmailAlreadyExistsException.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/example/bcsd/EmailAlreadyExistsException.java diff --git a/src/main/java/com/example/bcsd/EmailAlreadyExistsException.java b/src/main/java/com/example/bcsd/EmailAlreadyExistsException.java new file mode 100644 index 00000000..958afb99 --- /dev/null +++ b/src/main/java/com/example/bcsd/EmailAlreadyExistsException.java @@ -0,0 +1,13 @@ +package com.example.bcsd; + +public class EmailAlreadyExistsException extends RuntimeException { + private final int statusCode = 409; + + public EmailAlreadyExistsException(String message) { + super(message); + } + + public int getStatusCode() { + return statusCode; + } +} From 6c916487fe10066720654b2cf01245f15a9870c2 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Thu, 22 May 2025 21:52:58 +0900 Subject: [PATCH 19/29] =?UTF-8?q?feat=20:=20=EC=A1=B0=ED=9A=8C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/bcsd/DBExceptionHandler.java | 11 +++++++++-- .../com/example/bcsd/EntityNotFoundException.java | 13 +++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/bcsd/EntityNotFoundException.java diff --git a/src/main/java/com/example/bcsd/DBExceptionHandler.java b/src/main/java/com/example/bcsd/DBExceptionHandler.java index 264255d1..35902436 100644 --- a/src/main/java/com/example/bcsd/DBExceptionHandler.java +++ b/src/main/java/com/example/bcsd/DBExceptionHandler.java @@ -1,9 +1,16 @@ package com.example.bcsd; -import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.http.ResponseEntity; +import org.springframework.web.ErrorResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; -@RestControllerAdvice +@ControllerAdvice public class DBExceptionHandler { + @ExceptionHandler(EmailAlreadyExistsException.class) + public ResponseEntity handleEmailAlreadyExistsException(EmailAlreadyExistsException e){ + return ResponseEntity<>(e.) + } } diff --git a/src/main/java/com/example/bcsd/EntityNotFoundException.java b/src/main/java/com/example/bcsd/EntityNotFoundException.java new file mode 100644 index 00000000..41825190 --- /dev/null +++ b/src/main/java/com/example/bcsd/EntityNotFoundException.java @@ -0,0 +1,13 @@ +package com.example.bcsd; + +public class EntityNotFoundException extends RuntimeException { + private final int statusCode = 404; + + public EntityNotFoundException(String message) { + super(message); + } + + public int getStatusCode() { + return statusCode; + } +} From 7fe8b9b78a58b44ac0b5c2512ca173b6eeff5257 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 01:26:13 +0900 Subject: [PATCH 20/29] =?UTF-8?q?feat=20:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=ED=97=A8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/DBExceptionHandler.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/DBExceptionHandler.java b/src/main/java/com/example/bcsd/DBExceptionHandler.java index 35902436..7cd11b1f 100644 --- a/src/main/java/com/example/bcsd/DBExceptionHandler.java +++ b/src/main/java/com/example/bcsd/DBExceptionHandler.java @@ -2,15 +2,34 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.ErrorResponse; -import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; -@ControllerAdvice +@RestControllerAdvice public class DBExceptionHandler { @ExceptionHandler(EmailAlreadyExistsException.class) - public ResponseEntity handleEmailAlreadyExistsException(EmailAlreadyExistsException e){ - return ResponseEntity<>(e.) + public ResponseEntity handleEmailAlreadyExistsException(EmailAlreadyExistsException e){ + return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } + @ExceptionHandler(EntityHasArticleException.class) + public ResponseEntity handleEntityHasArticleException(EntityHasArticleException e){ + return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); + } + + @ExceptionHandler(EntityNotFoundException.class) + public ResponseEntity handleEntityNotFoundException(EntityNotFoundException e){ + return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); + } + + @ExceptionHandler(InvalidRequestBodyException.class) + public ResponseEntity handleInvalidRequestBodyException(InvalidRequestBodyException e){ + return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); + } + + @ExceptionHandler(ReferencedEntityNotFoundException.class) + public ResponseEntity handleReferencedEntityNotFoundException(ReferencedEntityNotFoundException e){ + return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); + } } From 8d8ca6602ba6819eb4ac26146d05da07d56d215b Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 01:27:38 +0900 Subject: [PATCH 21/29] =?UTF-8?q?feat=20:=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=A9=B4=EC=84=9C=20=EC=93=B0=EC=9D=B4=EB=A9=B4=20?= =?UTF-8?q?=EC=95=88=EB=90=98=EB=8A=94=20=EA=B0=9D=EC=B2=B4=EC=9D=98=20SET?= =?UTF-8?q?TER=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/Article.java | 12 ------------ src/main/java/com/example/bcsd/Board.java | 4 ---- src/main/java/com/example/bcsd/Member.java | 12 ------------ 3 files changed, 28 deletions(-) diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java index 2e4561c2..11c01af8 100644 --- a/src/main/java/com/example/bcsd/Article.java +++ b/src/main/java/com/example/bcsd/Article.java @@ -47,18 +47,6 @@ public String getPutDate() { return putDate; } - public void setTitle(String title) { - this.title = title; - } - - public void setContent(String content) { - this.content = content; - } - - public void setPutDate(String putDate) { - this.putDate = putDate; - } - public static class Builder { private final long id; private final long userId; diff --git a/src/main/java/com/example/bcsd/Board.java b/src/main/java/com/example/bcsd/Board.java index 5b551f16..3978eb3b 100644 --- a/src/main/java/com/example/bcsd/Board.java +++ b/src/main/java/com/example/bcsd/Board.java @@ -17,10 +17,6 @@ public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - public static class Builder { private final long id; private String name = ""; diff --git a/src/main/java/com/example/bcsd/Member.java b/src/main/java/com/example/bcsd/Member.java index db9e0bfe..04d5b683 100644 --- a/src/main/java/com/example/bcsd/Member.java +++ b/src/main/java/com/example/bcsd/Member.java @@ -29,18 +29,6 @@ public String getPassword() { return password; } - public void setName(String name) { - this.name = name; - } - - public void setEmail(String email) { - this.email = email; - } - - public void setPassword(String password) { - this.password = password; - } - public static class Builder { private final long id; private String name = ""; From 86a3c3ef60b9dc2a604e2f74347028ba1865bf09 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 11:52:14 +0900 Subject: [PATCH 22/29] =?UTF-8?q?feat=20:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=9E=91=EB=8F=99=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/ArticleController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index ac10ec0e..8ee4b55f 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -43,11 +43,12 @@ public ResponseEntity
post(@RequestBody Map article) { @GetMapping("/{id}") public ResponseEntity
get(@PathVariable long id) { - if (!articleService.validArticle(id)) { - return ResponseEntity.notFound().build(); + try{ + Article article = articleService.findById(id); + return ResponseEntity.ok(article); + } catch (RuntimeException e) { + throw new EntityNotFoundException("게시물을 찾을 수 없습니다"); } - Article article = articleService.findById(id); - return ResponseEntity.ok(article); } @PutMapping("/{id}") From ece0f32f633224353346bb39382001a2bc48a10b Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 17:39:22 +0900 Subject: [PATCH 23/29] =?UTF-8?q?feat=20:=20board=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleController.java | 2 +- .../com/example/bcsd/BoardController.java | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/bcsd/BoardController.java diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 8ee4b55f..670d7c9d 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -83,7 +83,7 @@ public ResponseEntity delete(@PathVariable long id, @GetMapping public ResponseEntity> getArticlesByBoardId(@RequestParam(name="boardId", required=true) - Long id, Model model) { + Long id) { List
articles = articleService.findByBoardId(id); return ResponseEntity.ok(articles); diff --git a/src/main/java/com/example/bcsd/BoardController.java b/src/main/java/com/example/bcsd/BoardController.java new file mode 100644 index 00000000..1626eb84 --- /dev/null +++ b/src/main/java/com/example/bcsd/BoardController.java @@ -0,0 +1,52 @@ +package com.example.bcsd; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/board") +public class BoardController { + private final BoardService boardService; + private final ArticleService articleService; + + public BoardController(BoardService boardService, ArticleService articleService1) { + this.boardService = boardService; + this.articleService = articleService1; + } + + @PostMapping + public ResponseEntity post(@RequestBody Map article){ + String name = article.get("name"); + + if(name == null){ + throw new InvalidRequestBodyException("유효차지 않은 요청입니다."); + } + + Board created = boardService.save(name); + return ResponseEntity.status(HttpStatus.CREATED).body(created); + } + + @GetMapping("/{id}") + public ResponseEntity get(@PathVariable long id) { + try{ + Board board = boardService.findById(id); + return ResponseEntity.ok(board); + } catch (RuntimeException e) { + throw new EntityNotFoundException("게시판을 찾을 수 없습니다."); + } + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable long id) { + if(!articleService.findByBoardId(id).isEmpty()){ + throw new EntityHasArticleException("게시판에 게시글이 남아있어 삭제 불가"); + } + + boardService.delete(id); + return ResponseEntity.noContent().build(); + } +} From b1f6868c091be4400b84c5e3314c68a7dca74377 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 18:20:05 +0900 Subject: [PATCH 24/29] =?UTF-8?q?feat=20:=20member=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleRepository.java | 15 +++++ .../java/com/example/bcsd/ArticleService.java | 4 ++ .../com/example/bcsd/BoardController.java | 3 +- .../com/example/bcsd/MemberController.java | 66 +++++++++++++++++++ .../com/example/bcsd/MemberRepository.java | 9 +++ .../java/com/example/bcsd/MemberService.java | 8 +++ 6 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/bcsd/MemberController.java diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index f495bcdb..b113437d 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -61,6 +61,21 @@ public List
findByBoardId(long boardId) { ); } + public List
findByMemberId(long memberId) { + return jdbcTemplate.query( + "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE author_id = ?", + (resultSet, rowNum) -> new Article.Builder + (resultSet.getLong("id"), + resultSet.getLong("author_id"), + resultSet.getLong("board_id"), + resultSet.getString("modified_date")) + .title(resultSet.getString("title")) + .content(resultSet.getString("content")) + .build(), + memberId + ); + } + public Article findById(long id) { return jdbcTemplate.queryForObject( "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE id = ?", diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java index ea5cb1ed..7e4e01e0 100644 --- a/src/main/java/com/example/bcsd/ArticleService.java +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -31,6 +31,10 @@ public List
findByBoardId(long boardId) { return articleRepository.findByBoardId(boardId); } + public List
findByMemberId(long memberId){ + return articleRepository.findByMemberId(memberId); + } + public boolean validArticle(long id) { return articleRepository.findById(id) != null; } diff --git a/src/main/java/com/example/bcsd/BoardController.java b/src/main/java/com/example/bcsd/BoardController.java index 1626eb84..d1adb38c 100644 --- a/src/main/java/com/example/bcsd/BoardController.java +++ b/src/main/java/com/example/bcsd/BoardController.java @@ -1,6 +1,5 @@ package com.example.bcsd; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -23,7 +22,7 @@ public ResponseEntity post(@RequestBody Map article){ String name = article.get("name"); if(name == null){ - throw new InvalidRequestBodyException("유효차지 않은 요청입니다."); + throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); } Board created = boardService.save(name); diff --git a/src/main/java/com/example/bcsd/MemberController.java b/src/main/java/com/example/bcsd/MemberController.java new file mode 100644 index 00000000..2a99a88e --- /dev/null +++ b/src/main/java/com/example/bcsd/MemberController.java @@ -0,0 +1,66 @@ +package com.example.bcsd; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/member") +public class MemberController { + private final MemberService memberService; + private final ArticleService articleService; + + public MemberController(MemberService memberService, ArticleService articleService) { + this.memberService = memberService; + this.articleService = articleService; + } + + @PostMapping + public ResponseEntity post(@RequestBody Map article){ + String name = article.get("name"); + String email = article.get("email"); + String password = article.get("password"); + + if(name == null || email == null || password == null){ + throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); + } + + Member created = memberService.save(name, email, password); + return ResponseEntity.status(HttpStatus.CREATED).body(created); + } + + @GetMapping("/{id}") + public ResponseEntity get(@PathVariable long id) { + try{ + Member member = memberService.findById(id); + return ResponseEntity.ok(member); + } catch (RuntimeException e) { + throw new EntityNotFoundException("사용자를 찾을 수 없습니다."); + } + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable long id) { + if(!articleService.findByMemberId(id).isEmpty()){ + throw new EntityHasArticleException("작성한 게시글이 남아있어 삭제 불가"); + } + + memberService.delete(id); + return ResponseEntity.noContent().build(); + } + + @PutMapping("/{id}") + public ResponseEntity update(@PathVariable long id, + @RequestBody Map article){ + try { + String email = article.get("email"); + Member updated = memberService.update(id, email); + return ResponseEntity.ok(updated); + } + catch (RuntimeException e){ + throw new EmailAlreadyExistsException("중복 이메일 입니다."); + } + } +} diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java index beb8a6c2..16b5f5aa 100644 --- a/src/main/java/com/example/bcsd/MemberRepository.java +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -4,8 +4,10 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import java.sql.PreparedStatement; +import java.time.LocalDateTime; @Repository public class MemberRepository { @@ -54,4 +56,11 @@ public Member findById(long id) { id ); } + + public void update(long id, String email){ + jdbcTemplate.update( + "UPDATE member SET email = ? WHERE id = ?", + email, id + ); + } } diff --git a/src/main/java/com/example/bcsd/MemberService.java b/src/main/java/com/example/bcsd/MemberService.java index 8eae2ab2..c1418182 100644 --- a/src/main/java/com/example/bcsd/MemberService.java +++ b/src/main/java/com/example/bcsd/MemberService.java @@ -3,6 +3,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; + @Service public class MemberService { private final MemberRepository memberRepository; @@ -28,4 +30,10 @@ public Member findById(long id) { public boolean validId(long id) { return memberRepository.findById(id) != null; } + + @Transactional + public Member update(long id, String email) { + memberRepository.update(id, email); + return memberRepository.findById(id); + } } From 04136e7eb348aeda59228d6832abf96b93458e80 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 19:15:21 +0900 Subject: [PATCH 25/29] =?UTF-8?q?feat=20:=20article=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/bcsd/ArticleController.java | 38 +++++++++++++++---- .../com/example/bcsd/ArticleRepository.java | 17 +++++++-- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 670d7c9d..54900298 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -30,13 +30,21 @@ public ResponseEntity
post(@RequestBody Map article) { long userId = Long.parseLong(article.get("userId")); long boardId = Long.parseLong(article.get("boardId")); - if (!memberService.validId(userId) || !boardService.validId(boardId)) { - return ResponseEntity.badRequest().build(); + try { + memberService.validId(userId); + boardService.validId(boardId); + } + catch (RuntimeException e){ + throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); } String title = article.get("title"); String content = article.get("content"); + if(title == null || content == null){ + throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); + } + Article created = articleService.save(userId, boardId, title, content); return ResponseEntity.status(HttpStatus.CREATED).body(created); } @@ -54,13 +62,22 @@ public ResponseEntity
get(@PathVariable long id) { @PutMapping("/{id}") public ResponseEntity
put(@PathVariable long id, @RequestBody Map article) { - if (!articleService.validArticle(id)) { - return ResponseEntity.notFound().build(); + long userId = Long.parseLong(article.get("userId")); + long boardId = Long.parseLong(article.get("boardId")); + + try { + memberService.validId(userId); + boardService.validId(boardId); + } + catch (RuntimeException e){ + throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); } + String password = article.get("password"); if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ - return ResponseEntity.badRequest().build(); + throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } + String title = article.get("title"); String content = article.get("content"); Article updated = articleService.update(id, title, content); @@ -70,13 +87,18 @@ public ResponseEntity
put(@PathVariable long id, @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id, @RequestBody Map article) { - if (!articleService.validArticle(id)) { - return ResponseEntity.notFound().build(); + try{ + articleService.validArticle(id); } + catch (RuntimeException e){ + throw new InvalidRequestBodyException("유효한 게시물 ID가 아닙니다."); + } + String password = article.get("password"); if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ - return ResponseEntity.badRequest().build(); + throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } + articleService.delete(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index b113437d..bda66365 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -92,10 +92,19 @@ public Article findById(long id) { } public void update(long id, String newTitle, String newContent, String newPutDate) { - jdbcTemplate.update( - "UPDATE article SET title = ?, content = ?, modified_date = ? WHERE id = ?", - newTitle, newContent, newPutDate, id - ); + if(newTitle != null) { + jdbcTemplate.update( + "UPDATE article SET title = ?, modified_date = ? WHERE id = ?", + newTitle, newPutDate, id + ); + } + + if(newContent != null) { + jdbcTemplate.update( + "UPDATE article SET content = ?, modified_date = ? WHERE id = ?", + newContent, newPutDate, id + ); + } } public List
findAll() { From 0b957081e3620674dcbf284b6b4addfefbcf55bc Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 26 May 2025 19:38:52 +0900 Subject: [PATCH 26/29] =?UTF-8?q?feat=20:=207=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=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/Article.java | 30 +++++++++---------- .../com/example/bcsd/ArticleController.java | 3 +- .../com/example/bcsd/ArticleRepository.java | 14 ++++----- .../java/com/example/bcsd/ArticleService.java | 4 +++ .../com/example/bcsd/BoardController.java | 3 +- .../java/com/example/bcsd/BoardService.java | 2 ++ .../com/example/bcsd/MemberController.java | 3 +- .../java/com/example/bcsd/MemberService.java | 1 + 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java index 11c01af8..ca445d65 100644 --- a/src/main/java/com/example/bcsd/Article.java +++ b/src/main/java/com/example/bcsd/Article.java @@ -4,19 +4,19 @@ public class Article { private final long id; private final long userId; private final long boardId; - private final String postDate; + private final String createdAt; private String title; private String content; - private String putDate; + private String modifiedAt; private Article(Builder builder) { id = builder.id; userId = builder.userId; boardId = builder.boardId; - postDate = builder.postDate; + createdAt = builder.createdAt; title = builder.title; content = builder.content; - putDate = builder.putDate; + modifiedAt = builder.modifiedAt; } public long getId() { @@ -31,8 +31,8 @@ public long getBoardId() { return boardId; } - public String getPostDate() { - return postDate; + public String getCreatedAt() { + return createdAt; } public String getTitle() { @@ -43,25 +43,25 @@ public String getContent() { return content; } - public String getPutDate() { - return putDate; + public String getModifiedAt() { + return modifiedAt; } public static class Builder { private final long id; private final long userId; private final long boardId; - private final String postDate; + private final String createdAt; private String title; private String content; - private String putDate = ""; + private String modifiedAt = ""; - public Builder(long id, long uId, long bId, String pD) { + public Builder(long id, long userId, long boardId, String createdAt) { this.id = id; - this.userId = uId; - this.boardId = bId; - this.postDate = pD; - this.putDate = pD; + this.userId = userId; + this.boardId = boardId; + this.createdAt = createdAt; + this.modifiedAt = createdAt; } public Builder title(String val) { diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 54900298..f4da07a0 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -5,6 +5,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -46,7 +47,7 @@ public ResponseEntity
post(@RequestBody Map article) { } Article created = articleService.save(userId, boardId, title, content); - return ResponseEntity.status(HttpStatus.CREATED).body(created); + return ResponseEntity.created(URI.create("/articles/" + created.getId())).build(); } @GetMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index bda66365..83408e2b 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -16,7 +16,7 @@ public class ArticleRepository { this.jdbcTemplate = jdbcTemplate; } - public Article save(long userId, long boardId, String postDate, String title, String content) { + public Article save(long userId, long boardId, String createdAt, String title, String content) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement( @@ -27,14 +27,14 @@ public Article save(long userId, long boardId, String postDate, String title, St ps.setLong(2, boardId); ps.setString(3, title); ps.setString(4, content); - ps.setString(5, postDate); - ps.setString(6, postDate); + ps.setString(5, createdAt); + ps.setString(6, createdAt); return ps; }, keyHolder); Long id = keyHolder.getKey().longValue(); - Article article = new Article.Builder(id, userId, boardId, postDate) + Article article = new Article.Builder(id, userId, boardId, createdAt) .title(title) .content(content) .build(); @@ -91,18 +91,18 @@ public Article findById(long id) { ); } - public void update(long id, String newTitle, String newContent, String newPutDate) { + public void update(long id, String newTitle, String newContent, String modifiedAt) { if(newTitle != null) { jdbcTemplate.update( "UPDATE article SET title = ?, modified_date = ? WHERE id = ?", - newTitle, newPutDate, id + newTitle, modifiedAt, id ); } if(newContent != null) { jdbcTemplate.update( "UPDATE article SET content = ?, modified_date = ? WHERE id = ?", - newContent, newPutDate, id + newContent, modifiedAt, id ); } } diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java index 7e4e01e0..b1c782d4 100644 --- a/src/main/java/com/example/bcsd/ArticleService.java +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -23,14 +23,17 @@ public Article save(long userId, long boardId, String title, String content) { return articleRepository.save(userId, boardId, now, title, content); } + @Transactional(readOnly=true) public Article findById(long id) { return articleRepository.findById(id); } + @Transactional(readOnly=true) public List
findByBoardId(long boardId) { return articleRepository.findByBoardId(boardId); } + @Transactional(readOnly=true) public List
findByMemberId(long memberId){ return articleRepository.findByMemberId(memberId); } @@ -51,6 +54,7 @@ public boolean delete(long id) { return articleRepository.delete(id); } + @Transactional(readOnly=true) public List
findAll() { return articleRepository.findAll(); } diff --git a/src/main/java/com/example/bcsd/BoardController.java b/src/main/java/com/example/bcsd/BoardController.java index d1adb38c..c43d5ad9 100644 --- a/src/main/java/com/example/bcsd/BoardController.java +++ b/src/main/java/com/example/bcsd/BoardController.java @@ -4,6 +4,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.Map; @RestController @@ -26,7 +27,7 @@ public ResponseEntity post(@RequestBody Map article){ } Board created = boardService.save(name); - return ResponseEntity.status(HttpStatus.CREATED).body(created); + return ResponseEntity.created(URI.create("/board/" + created.getId())).build(); } @GetMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/BoardService.java b/src/main/java/com/example/bcsd/BoardService.java index 6a7ba19a..9d75f3e2 100644 --- a/src/main/java/com/example/bcsd/BoardService.java +++ b/src/main/java/com/example/bcsd/BoardService.java @@ -23,6 +23,7 @@ public boolean delete(long id) { return boardRepository.delete(id); } + @Transactional(readOnly=true) public Board findById(long id) { return boardRepository.findById(id); } @@ -31,6 +32,7 @@ public boolean validId(long id) { return boardRepository.findById(id) != null; } + @Transactional(readOnly=true) public List findAll() { return boardRepository.findAll(); } diff --git a/src/main/java/com/example/bcsd/MemberController.java b/src/main/java/com/example/bcsd/MemberController.java index 2a99a88e..116670ae 100644 --- a/src/main/java/com/example/bcsd/MemberController.java +++ b/src/main/java/com/example/bcsd/MemberController.java @@ -4,6 +4,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.util.Map; @RestController @@ -28,7 +29,7 @@ public ResponseEntity post(@RequestBody Map article){ } Member created = memberService.save(name, email, password); - return ResponseEntity.status(HttpStatus.CREATED).body(created); + return ResponseEntity.created(URI.create("/member/" + created.getId())).build(); } @GetMapping("/{id}") diff --git a/src/main/java/com/example/bcsd/MemberService.java b/src/main/java/com/example/bcsd/MemberService.java index c1418182..95698f3d 100644 --- a/src/main/java/com/example/bcsd/MemberService.java +++ b/src/main/java/com/example/bcsd/MemberService.java @@ -23,6 +23,7 @@ public boolean delete(long id) { return memberRepository.delete(id); } + @Transactional(readOnly=true) public Member findById(long id) { return memberRepository.findById(id); } From cd40e82421162b7549e367140575c237ab83e083 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 23 Jun 2025 04:40:31 +0900 Subject: [PATCH 27/29] =?UTF-8?q?feat=20:=20JPA=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20DB=EA=B4=80=EB=A6=AC=20=EA=B5=AC=ED=98=84,?= =?UTF-8?q?=20note=20:=20=EB=85=B8=ED=8A=B8=EB=B6=81=EC=9C=BC=EB=A1=9C=20p?= =?UTF-8?q?ull=20=EB=B0=9B=EC=95=84=EC=84=9C=20DB=20=EC=9E=91=EB=8F=99=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=ED=99=95=EC=9D=B8=20=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + src/main/java/com/example/bcsd/Article.java | 99 +++++++-------- .../com/example/bcsd/ArticleController.java | 4 +- .../com/example/bcsd/ArticleRepository.java | 120 +----------------- .../java/com/example/bcsd/ArticleService.java | 40 +++--- src/main/java/com/example/bcsd/Board.java | 37 +++--- .../com/example/bcsd/BoardRepository.java | 60 +-------- .../java/com/example/bcsd/BoardService.java | 14 +- src/main/java/com/example/bcsd/Member.java | 57 ++++----- .../com/example/bcsd/MemberRepository.java | 66 +--------- .../java/com/example/bcsd/MemberService.java | 27 ++-- 11 files changed, 138 insertions(+), 387 deletions(-) diff --git a/build.gradle b/build.gradle index 6f2674b2..969f7f47 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.springframework.boot:spring-boot-starter-jdbc' diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java index ca445d65..f1c1e0bb 100644 --- a/src/main/java/com/example/bcsd/Article.java +++ b/src/main/java/com/example/bcsd/Article.java @@ -1,40 +1,51 @@ package com.example.bcsd; +import jakarta.persistence.*; +import java.time.LocalDateTime; + +@Entity public class Article { - private final long id; - private final long userId; - private final long boardId; - private final String createdAt; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "author_id") + private Long memberId; + + private Long boardId; private String title; private String content; - private String modifiedAt; - - private Article(Builder builder) { - id = builder.id; - userId = builder.userId; - boardId = builder.boardId; - createdAt = builder.createdAt; - title = builder.title; - content = builder.content; - modifiedAt = builder.modifiedAt; + + @Column(name = "created_date") + private LocalDateTime createdAt; + + @Column(name = "modified_date") + private LocalDateTime modifiedAt; + + protected Article() {} + + public Article(Long memberId, Long boardId, String title, String content) { + this.memberId = memberId; + this.boardId = boardId; + this.title = title; + this.content = content; + this.createdAt = LocalDateTime.now(); + this.modifiedAt = this.createdAt; } - public long getId() { + public Long getId() { return id; } - public long getUserId() { - return userId; + public Long getMemberId() { + return memberId; } - public long getBoardId() { + public Long getBoardId() { return boardId; } - public String getCreatedAt() { - return createdAt; - } - public String getTitle() { return title; } @@ -43,39 +54,21 @@ public String getContent() { return content; } - public String getModifiedAt() { + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getModifiedAt() { return modifiedAt; } - public static class Builder { - private final long id; - private final long userId; - private final long boardId; - private final String createdAt; - private String title; - private String content; - private String modifiedAt = ""; - - public Builder(long id, long userId, long boardId, String createdAt) { - this.id = id; - this.userId = userId; - this.boardId = boardId; - this.createdAt = createdAt; - this.modifiedAt = createdAt; - } - - public Builder title(String val) { - title = val; - return this; - } - - public Builder content(String val) { - content = val; - return this; - } - - public Article build() { - return new Article(this); - } + public void updateTitle(String newTitle) { + this.title = newTitle; + this.modifiedAt = LocalDateTime.now(); + } + + public void updateContent(String newContent) { + this.content = newContent; + this.modifiedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index f4da07a0..41f485cb 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -75,7 +75,7 @@ public ResponseEntity
put(@PathVariable long id, } String password = article.get("password"); - if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ + if(!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)){ throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } @@ -96,7 +96,7 @@ public ResponseEntity delete(@PathVariable long id, } String password = article.get("password"); - if(!memberService.findById(articleService.findById(id).getUserId()).getPassword().equals(password)){ + if(!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)){ throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index 83408e2b..4bb549b9 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -1,123 +1,11 @@ package com.example.bcsd; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -@Repository -public class ArticleRepository { - private JdbcTemplate jdbcTemplate; - - ArticleRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public Article save(long userId, long boardId, String createdAt, String title, String content) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement( - "insert into article (author_id, board_id, title, content, created_date, modified_date) " + - "values (?, ?, ?, ?, ?, ?)", - new String[]{"id"}); - ps.setLong(1, userId); - ps.setLong(2, boardId); - ps.setString(3, title); - ps.setString(4, content); - ps.setString(5, createdAt); - ps.setString(6, createdAt); - return ps; - }, keyHolder); - - Long id = keyHolder.getKey().longValue(); - - Article article = new Article.Builder(id, userId, boardId, createdAt) - .title(title) - .content(content) - .build(); - - return article; - } - - public boolean delete(long id) { - return jdbcTemplate.update("DELETE FROM article WHERE id = ?", id) != 0; - } - - public List
findByBoardId(long boardId) { - return jdbcTemplate.query( - "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE board_id = ?", - (resultSet, rowNum) -> new Article.Builder - (resultSet.getLong("id"), - resultSet.getLong("author_id"), - resultSet.getLong("board_id"), - resultSet.getString("modified_date")) - .title(resultSet.getString("title")) - .content(resultSet.getString("content")) - .build(), - boardId - ); - } - - public List
findByMemberId(long memberId) { - return jdbcTemplate.query( - "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE author_id = ?", - (resultSet, rowNum) -> new Article.Builder - (resultSet.getLong("id"), - resultSet.getLong("author_id"), - resultSet.getLong("board_id"), - resultSet.getString("modified_date")) - .title(resultSet.getString("title")) - .content(resultSet.getString("content")) - .build(), - memberId - ); - } - - public Article findById(long id) { - return jdbcTemplate.queryForObject( - "SELECT id, author_id, board_id, title, content, modified_date FROM article WHERE id = ?", - (resultSet, rowNum) -> new Article.Builder - (resultSet.getLong("id"), - resultSet.getLong("author_id"), - resultSet.getLong("board_id"), - resultSet.getString("modified_date")) - .title(resultSet.getString("title")) - .content(resultSet.getString("content")) - .build(), - id - ); - } - - public void update(long id, String newTitle, String newContent, String modifiedAt) { - if(newTitle != null) { - jdbcTemplate.update( - "UPDATE article SET title = ?, modified_date = ? WHERE id = ?", - newTitle, modifiedAt, id - ); - } +public interface ArticleRepository extends JpaRepository { - if(newContent != null) { - jdbcTemplate.update( - "UPDATE article SET content = ?, modified_date = ? WHERE id = ?", - newContent, modifiedAt, id - ); - } - } + List
findByBoardId(Long boardId); - public List
findAll() { - return jdbcTemplate.query( - "SELECT id, author_id, board_id, title, content, modified_date FROM article", - (resultSet, rowNum) -> new Article.Builder - (resultSet.getLong("id"), - resultSet.getLong("author_id"), - resultSet.getLong("board_id"), - resultSet.getString("modified_date")) - .title(resultSet.getString("title")) - .content(resultSet.getString("content")) - .build() - ); - } + List
findByMemberId(Long memberId); } diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java index b1c782d4..dbb3359b 100644 --- a/src/main/java/com/example/bcsd/ArticleService.java +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -3,59 +3,55 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; - @Service public class ArticleService { private final ArticleRepository articleRepository; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); public ArticleService(ArticleRepository articleRepository) { this.articleRepository = articleRepository; } @Transactional - public Article save(long userId, long boardId, String title, String content) { - String now = LocalDateTime.now().format(formatter); - return articleRepository.save(userId, boardId, now, title, content); + public Article save(long memberId, long boardId, String title, String content) { + return articleRepository.save(new Article(memberId, boardId, title, content)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Article findById(long id) { - return articleRepository.findById(id); + return articleRepository.findById(id).get(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List
findByBoardId(long boardId) { return articleRepository.findByBoardId(boardId); } - @Transactional(readOnly=true) - public List
findByMemberId(long memberId){ + @Transactional(readOnly = true) + public List
findByMemberId(long memberId) { return articleRepository.findByMemberId(memberId); } - public boolean validArticle(long id) { - return articleRepository.findById(id) != null; - } - @Transactional public Article update(long id, String title, String content) { - String now = LocalDateTime.now().format(formatter); - articleRepository.update(id, title, content, now); - return articleRepository.findById(id); + Article article = articleRepository.findById(id).get(); + article.updateTitle(title); + article.updateContent(content); + return articleRepository.save(article); } @Transactional - public boolean delete(long id) { - return articleRepository.delete(id); + public void delete(long id) { + articleRepository.deleteById(id); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List
findAll() { return articleRepository.findAll(); } + + public boolean validArticle(long id) { + return articleRepository.existsById(id); + } } diff --git a/src/main/java/com/example/bcsd/Board.java b/src/main/java/com/example/bcsd/Board.java index 3978eb3b..e76a904e 100644 --- a/src/main/java/com/example/bcsd/Board.java +++ b/src/main/java/com/example/bcsd/Board.java @@ -1,15 +1,24 @@ package com.example.bcsd; +import jakarta.persistence.*; + +@Entity public class Board { - private final long id; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; - private Board(Builder builder) { - id = builder.id; - name = builder.name; + protected Board() { + } + + public Board(String name) { + this.name = name; } - public long getId() { + public Long getId() { return id; } @@ -17,21 +26,7 @@ public String getName() { return name; } - public static class Builder { - private final long id; - private String name = ""; - - public Builder(long id) { - this.id = id; - } - - public Builder name(String val) { - name = val; - return this; - } - - public Board build() { - return new Board(this); - } + public void updateName(String newName) { + this.name = newName; } } diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java index 5a5da8aa..5fb666e9 100644 --- a/src/main/java/com/example/bcsd/BoardRepository.java +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -1,62 +1,6 @@ package com.example.bcsd; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; -import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.data.jpa.repository.JpaRepository; -import java.sql.PreparedStatement; -import java.util.List; - -@Repository -public class BoardRepository { - private JdbcTemplate jdbcTemplate; - - BoardRepository(JdbcTemplate jdbcTemplate){ - this.jdbcTemplate = jdbcTemplate; - } - - public Board save(String name) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement( - "insert into board (name) values (?)", - new String[]{"id"}); - ps.setString(1, name); - return ps; - }, keyHolder); - - Long id = keyHolder.getKey().longValue(); - - Board board = new Board.Builder(id) - .name(name) - .build(); - - return board; - } - - public boolean delete(long id) { - return jdbcTemplate.update("DELETE FROM board WHERE id = ?", id) != 0; - } - - public Board findById(long id){ - return jdbcTemplate.queryForObject( - "SELECT id, name FROM board WHERE id = ?", - (resultSet, rowNum) -> new Board.Builder - (resultSet.getLong("id")) - .name(resultSet.getString("name")) - .build(), - id - ); - } - - public List findAll() { - return jdbcTemplate.query( - "SELECT id, name FROM board", - (resultSet, rowNum) -> new Board.Builder - (resultSet.getLong("id")) - .name(resultSet.getString("name")) - .build() - ); - } +public interface BoardRepository extends JpaRepository { } diff --git a/src/main/java/com/example/bcsd/BoardService.java b/src/main/java/com/example/bcsd/BoardService.java index 9d75f3e2..872671dd 100644 --- a/src/main/java/com/example/bcsd/BoardService.java +++ b/src/main/java/com/example/bcsd/BoardService.java @@ -15,24 +15,24 @@ public BoardService(BoardRepository boardRepository) { @Transactional public Board save(String name) { - return boardRepository.save(name); + return boardRepository.save(new Board(name)); } @Transactional - public boolean delete(long id) { - return boardRepository.delete(id); + public void delete(long id) { + boardRepository.deleteById(id); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Board findById(long id) { - return boardRepository.findById(id); + return boardRepository.findById(id).get(); } public boolean validId(long id) { - return boardRepository.findById(id) != null; + return boardRepository.existsById(id); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAll() { return boardRepository.findAll(); } diff --git a/src/main/java/com/example/bcsd/Member.java b/src/main/java/com/example/bcsd/Member.java index 04d5b683..27a4f187 100644 --- a/src/main/java/com/example/bcsd/Member.java +++ b/src/main/java/com/example/bcsd/Member.java @@ -1,19 +1,28 @@ package com.example.bcsd; +import jakarta.persistence.*; + +@Entity +@Table(name = "member") public class Member { - private final long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; private String email; private String password; - private Member(Builder builder) { - id = builder.id; - name = builder.name; - email = builder.email; - password = builder.password; + protected Member() { } - public long getId() { + public Member(String name, String email, String password) { + this.name = name; + this.email = email; + this.password = password; + } + + public Long getId() { return id; } @@ -29,33 +38,15 @@ public String getPassword() { return password; } - public static class Builder { - private final long id; - private String name = ""; - private String email = ""; - private String password = ""; - - public Builder(long id) { - this.id = id; - } - - public Builder name(String val) { - name = val; - return this; - } - - public Builder email(String val) { - email = val; - return this; - } + public void updateName(String name) { + this.name = name; + } - public Builder password(String val) { - password = val; - return this; - } + public void updateEmail(String email) { + this.email = email; + } - public Member build() { - return new Member(this); - } + public void updatePassword(String password) { + this.password = password; } } diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java index 16b5f5aa..e7076fe7 100644 --- a/src/main/java/com/example/bcsd/MemberRepository.java +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -1,66 +1,8 @@ package com.example.bcsd; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; -import java.sql.PreparedStatement; -import java.time.LocalDateTime; - -@Repository -public class MemberRepository { - private JdbcTemplate jdbcTemplate; - - MemberRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public Member save(String name, String email, String password) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement( - "insert into member (name, email, password) values (?, ?, ?)", - new String[]{"id"}); - ps.setString(1, name); - ps.setString(2, email); - ps.setString(3, password); - return ps; - }, keyHolder); - - Long id = keyHolder.getKey().longValue(); - - Member member = new Member.Builder(id) - .name(name) - .email(email) - .password(password) - .build(); - - return member; - } - - public boolean delete(long id) { - return jdbcTemplate.update("DELETE FROM member WHERE id = ?", id) != 0; - } - - public Member findById(long id) { - return jdbcTemplate.queryForObject( - "SELECT id, name, email, password FROM member WHERE id = ?", - (resultSet, rowNum) -> new Member.Builder - (resultSet.getLong("id")) - .name(resultSet.getString("name")) - .email(resultSet.getString("email")) - .password(resultSet.getString("password")) - .build(), - id - ); - } - - public void update(long id, String email){ - jdbcTemplate.update( - "UPDATE member SET email = ? WHERE id = ?", - email, id - ); - } +public interface MemberRepository extends JpaRepository { + Optional findByEmail(String email); } diff --git a/src/main/java/com/example/bcsd/MemberService.java b/src/main/java/com/example/bcsd/MemberService.java index 95698f3d..bc8e382b 100644 --- a/src/main/java/com/example/bcsd/MemberService.java +++ b/src/main/java/com/example/bcsd/MemberService.java @@ -3,8 +3,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; - @Service public class MemberService { private final MemberRepository memberRepository; @@ -15,26 +13,29 @@ public MemberService(MemberRepository memberRepository) { @Transactional public Member save(String name, String email, String password) { - return memberRepository.save(name, email, password); + Member member = new Member(name, email, password); + return memberRepository.save(member); } @Transactional - public boolean delete(long id) { - return memberRepository.delete(id); + public boolean delete(Long id) { + memberRepository.deleteById(id); + return true; } - @Transactional(readOnly=true) - public Member findById(long id) { - return memberRepository.findById(id); + @Transactional(readOnly = true) + public Member findById(Long id) { + return memberRepository.findById(id).get(); } - public boolean validId(long id) { - return memberRepository.findById(id) != null; + public boolean validId(Long id) { + return memberRepository.existsById(id); } @Transactional - public Member update(long id, String email) { - memberRepository.update(id, email); - return memberRepository.findById(id); + public Member update(Long id, String email) { + Member member = memberRepository.findById(id).get(); + member.updateEmail(email); + return member; } } From a31fa9a06fe0d806f6383203e8f530815c1993c2 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 23 Jun 2025 12:20:25 +0900 Subject: [PATCH 28/29] =?UTF-8?q?fix=20:=20posts=EA=B0=80=20=EC=9E=91?= =?UTF-8?q?=EB=8F=99=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=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/Article.java | 4 ++- .../com/example/bcsd/ArticleController.java | 25 ++++++++----------- .../com/example/bcsd/ArticleRepository.java | 1 + .../com/example/bcsd/BoardController.java | 8 +++--- .../com/example/bcsd/DBExceptionHandler.java | 10 ++++---- .../com/example/bcsd/MemberController.java | 13 +++++----- .../com/example/bcsd/MemberRepository.java | 1 + .../java/com/example/bcsd/PostController.java | 2 +- src/main/resources/templates/posts.html | 4 +-- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java index f1c1e0bb..fe281269 100644 --- a/src/main/java/com/example/bcsd/Article.java +++ b/src/main/java/com/example/bcsd/Article.java @@ -1,6 +1,7 @@ package com.example.bcsd; import jakarta.persistence.*; + import java.time.LocalDateTime; @Entity @@ -23,7 +24,8 @@ public class Article { @Column(name = "modified_date") private LocalDateTime modifiedAt; - protected Article() {} + protected Article() { + } public Article(Long memberId, Long boardId, String title, String content) { this.memberId = memberId; diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 41f485cb..7519352c 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -34,15 +34,14 @@ public ResponseEntity
post(@RequestBody Map article) { try { memberService.validId(userId); boardService.validId(boardId); - } - catch (RuntimeException e){ + } catch (RuntimeException e) { throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); } String title = article.get("title"); String content = article.get("content"); - if(title == null || content == null){ + if (title == null || content == null) { throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); } @@ -52,7 +51,7 @@ public ResponseEntity
post(@RequestBody Map article) { @GetMapping("/{id}") public ResponseEntity
get(@PathVariable long id) { - try{ + try { Article article = articleService.findById(id); return ResponseEntity.ok(article); } catch (RuntimeException e) { @@ -62,20 +61,19 @@ public ResponseEntity
get(@PathVariable long id) { @PutMapping("/{id}") public ResponseEntity
put(@PathVariable long id, - @RequestBody Map article) { + @RequestBody Map article) { long userId = Long.parseLong(article.get("userId")); long boardId = Long.parseLong(article.get("boardId")); try { memberService.validId(userId); boardService.validId(boardId); - } - catch (RuntimeException e){ + } catch (RuntimeException e) { throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); } String password = article.get("password"); - if(!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)){ + if (!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)) { throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } @@ -88,15 +86,14 @@ public ResponseEntity
put(@PathVariable long id, @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id, @RequestBody Map article) { - try{ + try { articleService.validArticle(id); - } - catch (RuntimeException e){ + } catch (RuntimeException e) { throw new InvalidRequestBodyException("유효한 게시물 ID가 아닙니다."); } String password = article.get("password"); - if(!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)){ + if (!memberService.findById(articleService.findById(id).getMemberId()).getPassword().equals(password)) { throw new InvalidRequestBodyException("비밀번호가 일치하지 않습니다."); } @@ -105,8 +102,8 @@ public ResponseEntity delete(@PathVariable long id, } @GetMapping - public ResponseEntity> getArticlesByBoardId(@RequestParam(name="boardId", required=true) - Long id) { + public ResponseEntity> getArticlesByBoardId(@RequestParam(name = "boardId", required = true) + Long id) { List
articles = articleService.findByBoardId(id); return ResponseEntity.ok(articles); diff --git a/src/main/java/com/example/bcsd/ArticleRepository.java b/src/main/java/com/example/bcsd/ArticleRepository.java index 4bb549b9..7e32b030 100644 --- a/src/main/java/com/example/bcsd/ArticleRepository.java +++ b/src/main/java/com/example/bcsd/ArticleRepository.java @@ -1,6 +1,7 @@ package com.example.bcsd; import org.springframework.data.jpa.repository.JpaRepository; + import java.util.List; public interface ArticleRepository extends JpaRepository { diff --git a/src/main/java/com/example/bcsd/BoardController.java b/src/main/java/com/example/bcsd/BoardController.java index c43d5ad9..26535b84 100644 --- a/src/main/java/com/example/bcsd/BoardController.java +++ b/src/main/java/com/example/bcsd/BoardController.java @@ -19,10 +19,10 @@ public BoardController(BoardService boardService, ArticleService articleService1 } @PostMapping - public ResponseEntity post(@RequestBody Map article){ + public ResponseEntity post(@RequestBody Map article) { String name = article.get("name"); - if(name == null){ + if (name == null) { throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); } @@ -32,7 +32,7 @@ public ResponseEntity post(@RequestBody Map article){ @GetMapping("/{id}") public ResponseEntity get(@PathVariable long id) { - try{ + try { Board board = boardService.findById(id); return ResponseEntity.ok(board); } catch (RuntimeException e) { @@ -42,7 +42,7 @@ public ResponseEntity get(@PathVariable long id) { @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id) { - if(!articleService.findByBoardId(id).isEmpty()){ + if (!articleService.findByBoardId(id).isEmpty()) { throw new EntityHasArticleException("게시판에 게시글이 남아있어 삭제 불가"); } diff --git a/src/main/java/com/example/bcsd/DBExceptionHandler.java b/src/main/java/com/example/bcsd/DBExceptionHandler.java index 7cd11b1f..e2982ac9 100644 --- a/src/main/java/com/example/bcsd/DBExceptionHandler.java +++ b/src/main/java/com/example/bcsd/DBExceptionHandler.java @@ -9,27 +9,27 @@ public class DBExceptionHandler { @ExceptionHandler(EmailAlreadyExistsException.class) - public ResponseEntity handleEmailAlreadyExistsException(EmailAlreadyExistsException e){ + public ResponseEntity handleEmailAlreadyExistsException(EmailAlreadyExistsException e) { return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } @ExceptionHandler(EntityHasArticleException.class) - public ResponseEntity handleEntityHasArticleException(EntityHasArticleException e){ + public ResponseEntity handleEntityHasArticleException(EntityHasArticleException e) { return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } @ExceptionHandler(EntityNotFoundException.class) - public ResponseEntity handleEntityNotFoundException(EntityNotFoundException e){ + public ResponseEntity handleEntityNotFoundException(EntityNotFoundException e) { return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } @ExceptionHandler(InvalidRequestBodyException.class) - public ResponseEntity handleInvalidRequestBodyException(InvalidRequestBodyException e){ + public ResponseEntity handleInvalidRequestBodyException(InvalidRequestBodyException e) { return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } @ExceptionHandler(ReferencedEntityNotFoundException.class) - public ResponseEntity handleReferencedEntityNotFoundException(ReferencedEntityNotFoundException e){ + public ResponseEntity handleReferencedEntityNotFoundException(ReferencedEntityNotFoundException e) { return ResponseEntity.status(e.getStatusCode()).body(e.getMessage()); } } diff --git a/src/main/java/com/example/bcsd/MemberController.java b/src/main/java/com/example/bcsd/MemberController.java index 116670ae..07e889e9 100644 --- a/src/main/java/com/example/bcsd/MemberController.java +++ b/src/main/java/com/example/bcsd/MemberController.java @@ -19,12 +19,12 @@ public MemberController(MemberService memberService, ArticleService articleServi } @PostMapping - public ResponseEntity post(@RequestBody Map article){ + public ResponseEntity post(@RequestBody Map article) { String name = article.get("name"); String email = article.get("email"); String password = article.get("password"); - if(name == null || email == null || password == null){ + if (name == null || email == null || password == null) { throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); } @@ -34,7 +34,7 @@ public ResponseEntity post(@RequestBody Map article){ @GetMapping("/{id}") public ResponseEntity get(@PathVariable long id) { - try{ + try { Member member = memberService.findById(id); return ResponseEntity.ok(member); } catch (RuntimeException e) { @@ -44,7 +44,7 @@ public ResponseEntity get(@PathVariable long id) { @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id) { - if(!articleService.findByMemberId(id).isEmpty()){ + if (!articleService.findByMemberId(id).isEmpty()) { throw new EntityHasArticleException("작성한 게시글이 남아있어 삭제 불가"); } @@ -54,13 +54,12 @@ public ResponseEntity delete(@PathVariable long id) { @PutMapping("/{id}") public ResponseEntity update(@PathVariable long id, - @RequestBody Map article){ + @RequestBody Map article) { try { String email = article.get("email"); Member updated = memberService.update(id, email); return ResponseEntity.ok(updated); - } - catch (RuntimeException e){ + } catch (RuntimeException e) { throw new EmailAlreadyExistsException("중복 이메일 입니다."); } } diff --git a/src/main/java/com/example/bcsd/MemberRepository.java b/src/main/java/com/example/bcsd/MemberRepository.java index e7076fe7..58239182 100644 --- a/src/main/java/com/example/bcsd/MemberRepository.java +++ b/src/main/java/com/example/bcsd/MemberRepository.java @@ -1,6 +1,7 @@ package com.example.bcsd; import org.springframework.data.jpa.repository.JpaRepository; + import java.util.Optional; public interface MemberRepository extends JpaRepository { diff --git a/src/main/java/com/example/bcsd/PostController.java b/src/main/java/com/example/bcsd/PostController.java index 11c56d96..4851c629 100644 --- a/src/main/java/com/example/bcsd/PostController.java +++ b/src/main/java/com/example/bcsd/PostController.java @@ -26,7 +26,7 @@ public PostController(BoardService boardService, } @GetMapping("/posts") - public String viewOnePost(@RequestParam(name="boardId", required=true) + public String viewOnePost(@RequestParam(name = "boardId", required = true) Long id, Model model) { List board = new ArrayList<>(); // 리스트에 하나만 넣는 꼼수 board.add(boardService.findById(id)); diff --git a/src/main/resources/templates/posts.html b/src/main/resources/templates/posts.html index b5fae6bd..7e4cac39 100644 --- a/src/main/resources/templates/posts.html +++ b/src/main/resources/templates/posts.html @@ -9,8 +9,8 @@

게시판 이름

제목

- 작성자 | - 최종수정일 + 작성자 | + 최종수정일
내용
From 8dfd075eccf7dfa3c22856c2c9edd3d17913a482 Mon Sep 17 00:00:00 2001 From: NIF404 Date: Mon, 23 Jun 2025 15:07:54 +0900 Subject: [PATCH 29/29] =?UTF-8?q?feat=20:=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84,=20=EC=98=81=EC=86=8D=EC=84=B1=20=EC=A0=84=EC=9D=B4?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B3=A0=EC=95=84=EA=B0=9D=EC=B2=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/bcsd/Article.java | 19 ++++++++++++------- .../com/example/bcsd/ArticleController.java | 10 +++++----- .../java/com/example/bcsd/ArticleService.java | 12 ++++++++++-- src/main/java/com/example/bcsd/Board.java | 10 ++++++++++ .../com/example/bcsd/BoardController.java | 3 --- .../com/example/bcsd/BoardRepository.java | 7 +++++++ 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/example/bcsd/Article.java b/src/main/java/com/example/bcsd/Article.java index fe281269..1314aad9 100644 --- a/src/main/java/com/example/bcsd/Article.java +++ b/src/main/java/com/example/bcsd/Article.java @@ -14,7 +14,6 @@ public class Article { @Column(name = "author_id") private Long memberId; - private Long boardId; private String title; private String content; @@ -24,12 +23,15 @@ public class Article { @Column(name = "modified_date") private LocalDateTime modifiedAt; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id") + private Board board; + protected Article() { } - public Article(Long memberId, Long boardId, String title, String content) { + public Article(Long memberId, String title, String content) { this.memberId = memberId; - this.boardId = boardId; this.title = title; this.content = content; this.createdAt = LocalDateTime.now(); @@ -44,10 +46,6 @@ public Long getMemberId() { return memberId; } - public Long getBoardId() { - return boardId; - } - public String getTitle() { return title; } @@ -73,4 +71,11 @@ public void updateContent(String newContent) { this.content = newContent; this.modifiedAt = LocalDateTime.now(); } + + public void setBoard(Board board){ + this.board = board; + if(!board.getArticles().contains(this)){ + board.getArticles().add(this); + } + } } diff --git a/src/main/java/com/example/bcsd/ArticleController.java b/src/main/java/com/example/bcsd/ArticleController.java index 7519352c..69e8dd70 100644 --- a/src/main/java/com/example/bcsd/ArticleController.java +++ b/src/main/java/com/example/bcsd/ArticleController.java @@ -28,11 +28,11 @@ public ArticleController(ArticleService articleService, @PostMapping public ResponseEntity
post(@RequestBody Map article) { - long userId = Long.parseLong(article.get("userId")); + long memberId = Long.parseLong(article.get("memberId")); long boardId = Long.parseLong(article.get("boardId")); try { - memberService.validId(userId); + memberService.validId(memberId); boardService.validId(boardId); } catch (RuntimeException e) { throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); @@ -45,7 +45,7 @@ public ResponseEntity
post(@RequestBody Map article) { throw new InvalidRequestBodyException("유효하지 않은 요청입니다."); } - Article created = articleService.save(userId, boardId, title, content); + Article created = articleService.save(memberId, boardId, title, content); return ResponseEntity.created(URI.create("/articles/" + created.getId())).build(); } @@ -62,11 +62,11 @@ public ResponseEntity
get(@PathVariable long id) { @PutMapping("/{id}") public ResponseEntity
put(@PathVariable long id, @RequestBody Map article) { - long userId = Long.parseLong(article.get("userId")); + long memberId = Long.parseLong(article.get("memberId")); long boardId = Long.parseLong(article.get("boardId")); try { - memberService.validId(userId); + memberService.validId(memberId); boardService.validId(boardId); } catch (RuntimeException e) { throw new ReferencedEntityNotFoundException("유효하지 않은 게시판 또는 사용자 입니다."); diff --git a/src/main/java/com/example/bcsd/ArticleService.java b/src/main/java/com/example/bcsd/ArticleService.java index dbb3359b..5bb5fc19 100644 --- a/src/main/java/com/example/bcsd/ArticleService.java +++ b/src/main/java/com/example/bcsd/ArticleService.java @@ -8,14 +8,22 @@ @Service 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; } @Transactional public Article save(long memberId, long boardId, String title, String content) { - return articleRepository.save(new Article(memberId, boardId, title, content)); + Board board = boardRepository.findById(boardId).get(); + + Article article = new Article(memberId, title, content); + article.setBoard(board); + + return articleRepository.save(article); } @Transactional(readOnly = true) diff --git a/src/main/java/com/example/bcsd/Board.java b/src/main/java/com/example/bcsd/Board.java index e76a904e..3a7dfb15 100644 --- a/src/main/java/com/example/bcsd/Board.java +++ b/src/main/java/com/example/bcsd/Board.java @@ -2,6 +2,9 @@ import jakarta.persistence.*; +import java.util.ArrayList; +import java.util.List; + @Entity public class Board { @@ -11,6 +14,9 @@ public class Board { private String name; + @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) + private List
articles = new ArrayList<>(); + protected Board() { } @@ -29,4 +35,8 @@ public String getName() { public void updateName(String newName) { this.name = newName; } + + public List
getArticles(){ + return articles; + } } diff --git a/src/main/java/com/example/bcsd/BoardController.java b/src/main/java/com/example/bcsd/BoardController.java index 26535b84..c771642a 100644 --- a/src/main/java/com/example/bcsd/BoardController.java +++ b/src/main/java/com/example/bcsd/BoardController.java @@ -42,9 +42,6 @@ public ResponseEntity get(@PathVariable long id) { @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id) { - if (!articleService.findByBoardId(id).isEmpty()) { - throw new EntityHasArticleException("게시판에 게시글이 남아있어 삭제 불가"); - } boardService.delete(id); return ResponseEntity.noContent().build(); diff --git a/src/main/java/com/example/bcsd/BoardRepository.java b/src/main/java/com/example/bcsd/BoardRepository.java index 5fb666e9..2ffa8b20 100644 --- a/src/main/java/com/example/bcsd/BoardRepository.java +++ b/src/main/java/com/example/bcsd/BoardRepository.java @@ -1,6 +1,13 @@ package com.example.bcsd; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface BoardRepository extends JpaRepository { + + @Override + @EntityGraph(attributePaths = "articles") + Optional findById(Long id); }