From f63f24eb07f7c523dfef825342592bb68a759cac Mon Sep 17 00:00:00 2001 From: mingimin Date: Sun, 23 Aug 2020 12:48:42 +0900 Subject: [PATCH 1/4] =?UTF-8?q?CRUD=20=EA=B8=B0=EB=B3=B8=20=EC=99=84?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Board Model 과 Repository 에 한하여 Test 작성 --- .../javaweb/controller/BoardsController.java | 61 ++++++++++ .../java/com/example/javaweb/model/Board.java | 70 +++++++++++ .../javaweb/repository/BoardRepository.java | 77 ++++++++++++ .../javaweb/response/BoardCreateResponse.java | 13 ++ .../example/javaweb/service/BoardService.java | 36 ++++++ .../com/example/javaweb/model/BoardTest.java | 70 +++++++++++ .../repository/BoardRepositoryTest.java | 111 ++++++++++++++++++ 7 files changed, 438 insertions(+) create mode 100644 src/main/java/com/example/javaweb/controller/BoardsController.java create mode 100644 src/main/java/com/example/javaweb/model/Board.java create mode 100644 src/main/java/com/example/javaweb/repository/BoardRepository.java create mode 100644 src/main/java/com/example/javaweb/response/BoardCreateResponse.java create mode 100644 src/main/java/com/example/javaweb/service/BoardService.java create mode 100644 src/test/java/com/example/javaweb/model/BoardTest.java create mode 100644 src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java diff --git a/src/main/java/com/example/javaweb/controller/BoardsController.java b/src/main/java/com/example/javaweb/controller/BoardsController.java new file mode 100644 index 0000000..1d043c8 --- /dev/null +++ b/src/main/java/com/example/javaweb/controller/BoardsController.java @@ -0,0 +1,61 @@ +package com.example.javaweb.controller; + +import com.example.javaweb.model.Board; +import com.example.javaweb.response.BoardCreateResponse; +import com.example.javaweb.service.BoardService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.HashMap; + +@RestController +public class BoardsController { + + private final BoardService boardService; + + public BoardsController(BoardService boardService) { + this.boardService = boardService; + } + + @PostMapping("/board") + public ResponseEntity create(@RequestBody HashMap map) { + return new ResponseEntity<>(boardService.insert(map), HttpStatus.CREATED); + } + + @GetMapping("/board/{id}") + public ResponseEntity find(@PathVariable int id) { + Board board = boardService.find(id); + if (board == null) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "entity not found" + ); + } + + return new ResponseEntity<>(board, HttpStatus.OK); + } + + @PutMapping("/board/{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody HashMap map) { + Board board = boardService.update(id, map); + if (board == null) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "entity not found" + ); + } + + return new ResponseEntity<>(board, HttpStatus.OK); + } + + @DeleteMapping("/board/{id}") + public ResponseEntity delete(@PathVariable int id) { + if (!boardService.delete(id)) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "entity not found" + ); + } + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/src/main/java/com/example/javaweb/model/Board.java b/src/main/java/com/example/javaweb/model/Board.java new file mode 100644 index 0000000..0ec8c81 --- /dev/null +++ b/src/main/java/com/example/javaweb/model/Board.java @@ -0,0 +1,70 @@ +package com.example.javaweb.model; + +import java.util.HashMap; + +public class Board { + public int getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getBody() { + return body; + } + + private int id; + private String title; + private String body; + + public static class Builder { + private int id = -1; + private String title = null; + private String body = null; + + public Builder(Board board) { + id = board.id; + title = board.title; + body = board.body; + } + + public Builder id(int id) { + this.id = id; + return this; + } + + public Builder title(String title) { + this.title = title; + return this; + } + + public Builder body(String body) { + this.body = body; + return this; + } + + public Builder() {} + + public Builder(HashMap map) { + if (map.get("title") instanceof String) { + this.title = (String) map.get("title"); + } + + if (map.get("body") instanceof String) { + this.body = (String) map.get("body"); + } + } + + public Board build() { + return new Board(this); + } + } + + private Board(Builder builder) { + id = builder.id; + title = builder.title; + body = builder.body; + } +} diff --git a/src/main/java/com/example/javaweb/repository/BoardRepository.java b/src/main/java/com/example/javaweb/repository/BoardRepository.java new file mode 100644 index 0000000..6b2f66c --- /dev/null +++ b/src/main/java/com/example/javaweb/repository/BoardRepository.java @@ -0,0 +1,77 @@ +package com.example.javaweb.repository; + +import com.example.javaweb.model.Board; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; + +@Repository +public class BoardRepository { + private ArrayList boards = new ArrayList<>(); + + public int insert(Board board) { + if (board == null) { + return -1; + } + + int newId = 1; + if (boards.size() != 0) { + newId = boards.get(boards.size() - 1).getId() + 1; + } + + final Board newBoard = new Board + .Builder(board) + .id(newId) + .build(); + boards.add(newBoard); + return newId; + } + + public Board find(int id) { + return boards + .stream() + .filter(board -> board.getId() == id) + .findFirst() + .orElse(null); + } + + public int size() { + return boards.size(); + } + + public boolean delete(int id) { + final Board board = find(id); + if (board == null) { + return false; + } + + boards.remove(board); + return true; + } + + public Board update(int id, Board updateBoard) { + Board board = find(id); + if (board == null) { + return null; + } + + Board.Builder builder = new Board.Builder(board); + if (updateBoard.getTitle() != null) { + builder.title(updateBoard.getTitle()); + } + if (updateBoard.getBody() != null) { + builder.body(updateBoard.getBody()); + } + Board newBoard = builder.build(); + + boards.replaceAll((oldBoard) -> { + if (oldBoard.getId() != id) { + return oldBoard; + } else { + return newBoard; + } + }); + + return newBoard; + } +} diff --git a/src/main/java/com/example/javaweb/response/BoardCreateResponse.java b/src/main/java/com/example/javaweb/response/BoardCreateResponse.java new file mode 100644 index 0000000..bb3c6a5 --- /dev/null +++ b/src/main/java/com/example/javaweb/response/BoardCreateResponse.java @@ -0,0 +1,13 @@ +package com.example.javaweb.response; + +public class BoardCreateResponse { + final private int id; + + public BoardCreateResponse(int id) { + this.id = id; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/com/example/javaweb/service/BoardService.java b/src/main/java/com/example/javaweb/service/BoardService.java new file mode 100644 index 0000000..e9d54a0 --- /dev/null +++ b/src/main/java/com/example/javaweb/service/BoardService.java @@ -0,0 +1,36 @@ +package com.example.javaweb.service; + +import com.example.javaweb.model.Board; +import com.example.javaweb.repository.BoardRepository; +import com.example.javaweb.response.BoardCreateResponse; +import org.springframework.stereotype.Service; + +import java.util.HashMap; + +@Service +public class BoardService { + final private BoardRepository boardRepository; + + public BoardService(BoardRepository boardRepository) { + this.boardRepository = boardRepository; + } + + public Board find(int id) { + return boardRepository.find(id); + } + + public BoardCreateResponse insert(HashMap map) { + final Board board = new Board.Builder(map).build(); + int id = boardRepository.insert(board); + return new BoardCreateResponse(id); + } + + public boolean delete(int id) { + return boardRepository.delete(id); + } + + public Board update(int id, HashMap map) { + final Board board = new Board.Builder(map).build(); + return boardRepository.update(id, board); + } +} diff --git a/src/test/java/com/example/javaweb/model/BoardTest.java b/src/test/java/com/example/javaweb/model/BoardTest.java new file mode 100644 index 0000000..eaaceff --- /dev/null +++ b/src/test/java/com/example/javaweb/model/BoardTest.java @@ -0,0 +1,70 @@ +package com.example.javaweb.model; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BoardTest { + + @Test + public void hasId() { + int id = 0; + + Board.Builder builder = new Board.Builder(); + Board board = builder.id(id).build(); + + assertEquals(board.getId(), id); + } + + @Test + public void hasTitle() { + String title = "test title"; + + Board.Builder builder = new Board.Builder(); + Board board = builder.title(title).build(); + + assertEquals(board.getTitle(), title); + } + + @Test + public void hasBody() { + String body = "test body"; + + Board.Builder builder = new Board.Builder(); + Board board = builder.body(body).build(); + + assertEquals(board.getBody(), body); + } + + @Test + public void hasIdAndTitleAndBody() { + int id = 0; + String title = "test title"; + String body = "test body"; + + Board.Builder builder = new Board.Builder(); + Board board = builder.id(id).title(title).body(body).build(); + + assertEquals(board.getId(), id); + assertEquals(board.getTitle(), title); + assertEquals(board.getBody(), body); + } + + @Test + public void createFromHashMap() { + String title = "test title"; + String body = "test body"; + + HashMap map = new HashMap<>(); + map.put("title", title); + map.put("body", body); + + final Board.Builder builder = new Board.Builder(map); + Board board = builder.build(); + + assertEquals(board.getTitle(), title); + assertEquals(board.getBody(), body); + } +} diff --git a/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java b/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java new file mode 100644 index 0000000..2e91bca --- /dev/null +++ b/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java @@ -0,0 +1,111 @@ +package com.example.javaweb.repository; + +import com.example.javaweb.model.Board; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class BoardRepositoryTest { + private BoardRepository boardRepository; + + @BeforeEach + void setUp() { + this.boardRepository = new BoardRepository(); + } + + @Test + void insertBoard() { + final Board board = new Board.Builder().build(); + + assertNotEquals(-1, boardRepository.insert(board)); + assertEquals(1, boardRepository.size()); + } + + @Test + void firstBoardIdIs1() { + final Board board = new Board.Builder().build(); + assertEquals(1, boardRepository.insert(board)); + } + + @Test + void cannotHaveSpecificId() { + final int specificId = 9999; + final Board board = new Board.Builder().id(specificId).build(); + assertNotEquals(specificId, boardRepository.insert(board)); + } + + @Test + void cannotInsertNullBoard() { + assertEquals(-1, boardRepository.insert(null)); + assertEquals(0, boardRepository.size()); + } + + @Test + void findBoard() { + final String title = "title"; + final String body = "body"; + final Board board = new Board.Builder().title(title).body(body).build(); + final int id = boardRepository.insert(board); + + final Board foundedBoard = boardRepository.find(id); + assertEquals(id, foundedBoard.getId()); + assertEquals(board.getTitle(), foundedBoard.getTitle()); + assertEquals(board.getBody(), foundedBoard.getBody()); + } + + @Test + void returnNullIfWrongId() { + final int wrongId = -9999; + final Board board = boardRepository.find(wrongId); + assertNull(board); + } + + @Test + void deleteBoard() { + final String title = "title"; + final String body = "body"; + final Board board = new Board.Builder().title(title).body(body).build(); + final int id = boardRepository.insert(board); + + assertTrue(boardRepository.delete(id)); + assertNull(boardRepository.find(id)); + assertEquals(0, boardRepository.size()); + } + + @Test + void cannotDeleteWrongId() { + final int wrongId = -9999; + assertFalse(boardRepository.delete(wrongId)); + } + + @Test + void updateBoard() { + final String title = "title"; + final String body = "body"; + final Board board = new Board.Builder().title(title).body(body).build(); + final int id = boardRepository.insert(board); + + final String newTitle = "update title"; + final String newBody = "update body"; + final Board newBoard = new Board.Builder().title(newTitle).body(newBody).build(); + + final Board updatedBoard = boardRepository.update(id, newBoard); + + assertNotEquals(title, updatedBoard.getTitle()); + assertEquals(newTitle, updatedBoard.getTitle()); + assertNotEquals(body, updatedBoard.getBody()); + assertEquals(newBody, updatedBoard.getBody()); + } + + @Test + void cannotUpdateWrongId() { + final int wrongId = -9999; + final String title = "update title"; + final String body = "update body"; + final Board board = new Board.Builder().title(title).body(body).build(); + + final Board updatedBoard = boardRepository.update(wrongId, board); + assertNull(updatedBoard); + } +} From a77be0da7bb44eb440d28d003b3f19f6d4afc5bb Mon Sep 17 00:00:00 2001 From: mingimin Date: Sun, 13 Sep 2020 12:08:29 +0900 Subject: [PATCH 2/4] =?UTF-8?q?20/09/10=20=EC=A7=84=ED=96=89=ED=95=9C=20Da?= =?UTF-8?q?tabase=20=EC=97=B0=EB=8F=99=20=EC=8A=A4=ED=84=B0=EB=94=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../javaweb/controller/UserController.java | 28 +++++++++++++ .../java/com/example/javaweb/model/User.java | 40 +++++++++++++++++++ .../javaweb/repository/UserRepository.java | 7 ++++ .../example/javaweb/service/UserService.java | 23 +++++++++++ src/main/resources/application.properties | 1 - src/main/resources/application.yml | 18 +++++++++ 7 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/javaweb/controller/UserController.java create mode 100644 src/main/java/com/example/javaweb/model/User.java create mode 100644 src/main/java/com/example/javaweb/repository/UserRepository.java create mode 100644 src/main/java/com/example/javaweb/service/UserService.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml diff --git a/build.gradle b/build.gradle index 4cb1340..75f7d65 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,8 @@ repositories { } dependencies { + implementation('org.springframework.boot:spring-boot-starter-data-jpa') + runtimeOnly("mysql:mysql-connector-java") implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' diff --git a/src/main/java/com/example/javaweb/controller/UserController.java b/src/main/java/com/example/javaweb/controller/UserController.java new file mode 100644 index 0000000..121a1dc --- /dev/null +++ b/src/main/java/com/example/javaweb/controller/UserController.java @@ -0,0 +1,28 @@ +package com.example.javaweb.controller; + +import com.example.javaweb.model.User; +import com.example.javaweb.service.BoardService; +import com.example.javaweb.service.UserService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; + +@RestController +public class UserController { + + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + @PostMapping("/user") + public ResponseEntity create(@RequestBody HashMap map) { + User user = userService.create(map); + return new ResponseEntity<>(user, HttpStatus.OK); + } +} diff --git a/src/main/java/com/example/javaweb/model/User.java b/src/main/java/com/example/javaweb/model/User.java new file mode 100644 index 0000000..ba0e352 --- /dev/null +++ b/src/main/java/com/example/javaweb/model/User.java @@ -0,0 +1,40 @@ +package com.example.javaweb.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private String name; + + public String getName() { + return name; + } + + public User(Integer id, String name) { + this.id = id; + this.name = name; + } + + public User() {} + + public void setName(String name) { + this.name = name; + } + + public void setId(Integer id) { + this.id = id; + } + + + public Integer getId() { + return id; + } +} diff --git a/src/main/java/com/example/javaweb/repository/UserRepository.java b/src/main/java/com/example/javaweb/repository/UserRepository.java new file mode 100644 index 0000000..e5700ed --- /dev/null +++ b/src/main/java/com/example/javaweb/repository/UserRepository.java @@ -0,0 +1,7 @@ +package com.example.javaweb.repository; + +import com.example.javaweb.model.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/javaweb/service/UserService.java b/src/main/java/com/example/javaweb/service/UserService.java new file mode 100644 index 0000000..5df6eec --- /dev/null +++ b/src/main/java/com/example/javaweb/service/UserService.java @@ -0,0 +1,23 @@ +package com.example.javaweb.service; + +import com.example.javaweb.model.User; +import com.example.javaweb.repository.BoardRepository; +import com.example.javaweb.repository.UserRepository; +import org.springframework.stereotype.Service; + +import java.util.HashMap; + +@Service +public class UserService { + + final private UserRepository userRepository; + + public UserService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + public User create(HashMap map) { + User user = new User(null, (String) map.get("name")); + return userRepository.save(user); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..d247c3a --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,18 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3308/javaweb?serverTimezone=UTC&characterEncoding=UTF-8 + username: root + hikari: + maximum-pool-size: 50 + minimum-idle: 10 + idle-timeout: 30000 + connection-test-query: "SELECT 1" + jpa: + show-sql: true + database-platform: org.hibernate.dialect.MySQL5InnoDBDialect + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true \ No newline at end of file From 39e866e1fbf01021484fe5f92cc30e2fd0d85898 Mon Sep 17 00:00:00 2001 From: mingimin Date: Mon, 14 Sep 2020 00:16:23 +0900 Subject: [PATCH 3/4] =?UTF-8?q?JPA=EB=A5=BC=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20User=20=EC=99=80=20Board=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaweb/controller/BoardsController.java | 11 +- .../javaweb/controller/UserController.java | 44 ++++++- .../java/com/example/javaweb/model/Board.java | 81 ++++++------- .../java/com/example/javaweb/model/User.java | 37 +++--- .../javaweb/repository/BoardRepository.java | 71 +---------- .../javaweb/repository/UserRepository.java | 2 + .../javaweb/response/BoardCreateResponse.java | 13 -- .../example/javaweb/service/BoardService.java | 36 ++++-- .../example/javaweb/service/UserService.java | 30 ++++- .../com/example/javaweb/model/BoardTest.java | 70 ----------- .../repository/BoardRepositoryTest.java | 111 ------------------ 11 files changed, 155 insertions(+), 351 deletions(-) delete mode 100644 src/main/java/com/example/javaweb/response/BoardCreateResponse.java delete mode 100644 src/test/java/com/example/javaweb/model/BoardTest.java delete mode 100644 src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java diff --git a/src/main/java/com/example/javaweb/controller/BoardsController.java b/src/main/java/com/example/javaweb/controller/BoardsController.java index 1d043c8..37838b6 100644 --- a/src/main/java/com/example/javaweb/controller/BoardsController.java +++ b/src/main/java/com/example/javaweb/controller/BoardsController.java @@ -1,7 +1,6 @@ package com.example.javaweb.controller; import com.example.javaweb.model.Board; -import com.example.javaweb.response.BoardCreateResponse; import com.example.javaweb.service.BoardService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,16 +19,16 @@ public BoardsController(BoardService boardService) { } @PostMapping("/board") - public ResponseEntity create(@RequestBody HashMap map) { + public ResponseEntity create(@RequestBody HashMap map) { return new ResponseEntity<>(boardService.insert(map), HttpStatus.CREATED); } @GetMapping("/board/{id}") - public ResponseEntity find(@PathVariable int id) { + public ResponseEntity find(@PathVariable long id) { Board board = boardService.find(id); if (board == null) { throw new ResponseStatusException( - HttpStatus.NOT_FOUND, "entity not found" + HttpStatus.NOT_FOUND, "board not found" ); } @@ -41,7 +40,7 @@ public ResponseEntity update(@PathVariable int id, @RequestBody HashMap update(@PathVariable int id, @RequestBody HashMap delete(@PathVariable int id) { if (!boardService.delete(id)) { throw new ResponseStatusException( - HttpStatus.NOT_FOUND, "entity not found" + HttpStatus.NOT_FOUND, "board not found" ); } diff --git a/src/main/java/com/example/javaweb/controller/UserController.java b/src/main/java/com/example/javaweb/controller/UserController.java index 121a1dc..f4153a2 100644 --- a/src/main/java/com/example/javaweb/controller/UserController.java +++ b/src/main/java/com/example/javaweb/controller/UserController.java @@ -1,13 +1,11 @@ package com.example.javaweb.controller; import com.example.javaweb.model.User; -import com.example.javaweb.service.BoardService; import com.example.javaweb.service.UserService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; import java.util.HashMap; @@ -21,8 +19,42 @@ public UserController(UserService userService) { } @PostMapping("/user") - public ResponseEntity create(@RequestBody HashMap map) { - User user = userService.create(map); + public ResponseEntity create(@RequestBody HashMap map) { + return new ResponseEntity<>(userService.insert(map), HttpStatus.OK); + } + + @GetMapping("/user/{id}") + public ResponseEntity find(@PathVariable long id) { + User user = userService.find(id); + if (user == null) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "user not found" + ); + } + + return new ResponseEntity<>(user, HttpStatus.OK); + } + + @PutMapping("/user/{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody HashMap map) { + User user = userService.update(id, map); + if (user == null) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "user not found" + ); + } + return new ResponseEntity<>(user, HttpStatus.OK); } + + @DeleteMapping("/user/{id}") + public ResponseEntity delete(@PathVariable int id) { + if (!userService.delete(id)) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, "user not found" + ); + } + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/example/javaweb/model/Board.java b/src/main/java/com/example/javaweb/model/Board.java index 0ec8c81..db9f2bb 100644 --- a/src/main/java/com/example/javaweb/model/Board.java +++ b/src/main/java/com/example/javaweb/model/Board.java @@ -1,70 +1,55 @@ package com.example.javaweb.model; +import javax.persistence.*; +import javax.persistence.criteria.CriteriaBuilder; import java.util.HashMap; +@Entity public class Board { - public int getId() { + + private Long id = null; + private String title = null; + private String body = null; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Long getId() { return id; } + public void setTitle(String title) { + this.title = title; + } + public void setBody(String body) { + this.body = body; + } public String getTitle() { return title; } - public String getBody() { return body; } + public void setId(Long id) { + this.id = id; + } - private int id; - private String title; - private String body; - - public static class Builder { - private int id = -1; - private String title = null; - private String body = null; + public Board() {} - public Builder(Board board) { - id = board.id; - title = board.title; - body = board.body; - } - - public Builder id(int id) { - this.id = id; - return this; - } + public Board(Long id, String title, String body) { + this.id = id; + this.title = title; + this.body = body; + } - public Builder title(String title) { - this.title = title; - return this; + public Board(HashMap map) { + if (map.get("id") != null) { + this.id = (Long) map.get("id"); } - - public Builder body(String body) { - this.body = body; - return this; + if (map.get("title") != null) { + this.title = (String) map.get("title"); } - - public Builder() {} - - public Builder(HashMap map) { - if (map.get("title") instanceof String) { - this.title = (String) map.get("title"); - } - - if (map.get("body") instanceof String) { - this.body = (String) map.get("body"); - } + if (map.get("body") != null) { + this.body = (String) map.get("body"); } - - public Board build() { - return new Board(this); - } - } - - private Board(Builder builder) { - id = builder.id; - title = builder.title; - body = builder.body; } } diff --git a/src/main/java/com/example/javaweb/model/User.java b/src/main/java/com/example/javaweb/model/User.java index ba0e352..95a529e 100644 --- a/src/main/java/com/example/javaweb/model/User.java +++ b/src/main/java/com/example/javaweb/model/User.java @@ -1,40 +1,47 @@ package com.example.javaweb.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; + private Long id = null; + private String name = null; - private String name; + public Long getId() { + return id; + } public String getName() { return name; } - public User(Integer id, String name) { - this.id = id; + public void setName(String name) { this.name = name; } - public User() {} - - public void setName(String name) { - this.name = name; + public void setId(Long id) { + this.id = id; } - public void setId(Integer id) { + public User(Long id, String name) { this.id = id; + this.name = name; } + public User() {} - public Integer getId() { - return id; + public User(HashMap map) { + if (map.get("id") != null) { + this.id = (Long) map.get("id"); + } + if (map.get("name") != null) { + this.name = (String) map.get("name"); + } } } diff --git a/src/main/java/com/example/javaweb/repository/BoardRepository.java b/src/main/java/com/example/javaweb/repository/BoardRepository.java index 6b2f66c..b6e8a17 100644 --- a/src/main/java/com/example/javaweb/repository/BoardRepository.java +++ b/src/main/java/com/example/javaweb/repository/BoardRepository.java @@ -1,77 +1,12 @@ package com.example.javaweb.repository; import com.example.javaweb.model.Board; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.ArrayList; +import java.util.List; @Repository -public class BoardRepository { - private ArrayList boards = new ArrayList<>(); +public interface BoardRepository extends JpaRepository { - public int insert(Board board) { - if (board == null) { - return -1; - } - - int newId = 1; - if (boards.size() != 0) { - newId = boards.get(boards.size() - 1).getId() + 1; - } - - final Board newBoard = new Board - .Builder(board) - .id(newId) - .build(); - boards.add(newBoard); - return newId; - } - - public Board find(int id) { - return boards - .stream() - .filter(board -> board.getId() == id) - .findFirst() - .orElse(null); - } - - public int size() { - return boards.size(); - } - - public boolean delete(int id) { - final Board board = find(id); - if (board == null) { - return false; - } - - boards.remove(board); - return true; - } - - public Board update(int id, Board updateBoard) { - Board board = find(id); - if (board == null) { - return null; - } - - Board.Builder builder = new Board.Builder(board); - if (updateBoard.getTitle() != null) { - builder.title(updateBoard.getTitle()); - } - if (updateBoard.getBody() != null) { - builder.body(updateBoard.getBody()); - } - Board newBoard = builder.build(); - - boards.replaceAll((oldBoard) -> { - if (oldBoard.getId() != id) { - return oldBoard; - } else { - return newBoard; - } - }); - - return newBoard; - } } diff --git a/src/main/java/com/example/javaweb/repository/UserRepository.java b/src/main/java/com/example/javaweb/repository/UserRepository.java index e5700ed..b58b079 100644 --- a/src/main/java/com/example/javaweb/repository/UserRepository.java +++ b/src/main/java/com/example/javaweb/repository/UserRepository.java @@ -2,6 +2,8 @@ import com.example.javaweb.model.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +@Repository public interface UserRepository extends JpaRepository { } diff --git a/src/main/java/com/example/javaweb/response/BoardCreateResponse.java b/src/main/java/com/example/javaweb/response/BoardCreateResponse.java deleted file mode 100644 index bb3c6a5..0000000 --- a/src/main/java/com/example/javaweb/response/BoardCreateResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.javaweb.response; - -public class BoardCreateResponse { - final private int id; - - public BoardCreateResponse(int id) { - this.id = id; - } - - public int getId() { - return id; - } -} diff --git a/src/main/java/com/example/javaweb/service/BoardService.java b/src/main/java/com/example/javaweb/service/BoardService.java index e9d54a0..fb22dce 100644 --- a/src/main/java/com/example/javaweb/service/BoardService.java +++ b/src/main/java/com/example/javaweb/service/BoardService.java @@ -2,10 +2,10 @@ import com.example.javaweb.model.Board; import com.example.javaweb.repository.BoardRepository; -import com.example.javaweb.response.BoardCreateResponse; import org.springframework.stereotype.Service; import java.util.HashMap; +import java.util.Optional; @Service public class BoardService { @@ -15,22 +15,34 @@ public BoardService(BoardRepository boardRepository) { this.boardRepository = boardRepository; } - public Board find(int id) { - return boardRepository.find(id); + public Board find(long id) { + return boardRepository.findById(id).orElse(null); } - public BoardCreateResponse insert(HashMap map) { - final Board board = new Board.Builder(map).build(); - int id = boardRepository.insert(board); - return new BoardCreateResponse(id); + public Board insert(HashMap map) { + final Board board = new Board(map); + return boardRepository.save(board); } - public boolean delete(int id) { - return boardRepository.delete(id); + public boolean delete(long id) { + if (!boardRepository.existsById(id)) { + return false; + } + + boardRepository.deleteById(id); + return true; } - public Board update(int id, HashMap map) { - final Board board = new Board.Builder(map).build(); - return boardRepository.update(id, board); + public Board update(long id, HashMap map) { + final Board updateBoard = new Board(map); + final Optional savedBoard = boardRepository.findById(id); + if (savedBoard.isEmpty()) { + return null; + } + + savedBoard.get().setTitle(updateBoard.getTitle()); + savedBoard.get().setBody(updateBoard.getBody()); + + return boardRepository.save(savedBoard.get()); } } diff --git a/src/main/java/com/example/javaweb/service/UserService.java b/src/main/java/com/example/javaweb/service/UserService.java index 5df6eec..6d47dc5 100644 --- a/src/main/java/com/example/javaweb/service/UserService.java +++ b/src/main/java/com/example/javaweb/service/UserService.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import java.util.HashMap; +import java.util.Optional; @Service public class UserService { @@ -16,8 +17,33 @@ public UserService(UserRepository userRepository) { this.userRepository = userRepository; } - public User create(HashMap map) { - User user = new User(null, (String) map.get("name")); + public User insert(HashMap map) { + User user = new User(map); return userRepository.save(user); } + + public User find(long id) { + return userRepository.findById(id).orElse(null); + } + + public boolean delete(long id) { + if (!userRepository.existsById(id)) { + return false; + } + + userRepository.deleteById(id); + return true; + } + + public User update(long id, HashMap map) { + final User updateUser = new User(map); + final Optional savedUser = userRepository.findById(id); + if (savedUser.isEmpty()) { + return null; + } + + savedUser.get().setName(updateUser.getName()); + + return userRepository.save(savedUser.get()); + } } diff --git a/src/test/java/com/example/javaweb/model/BoardTest.java b/src/test/java/com/example/javaweb/model/BoardTest.java deleted file mode 100644 index eaaceff..0000000 --- a/src/test/java/com/example/javaweb/model/BoardTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.javaweb.model; - -import org.junit.jupiter.api.Test; - -import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class BoardTest { - - @Test - public void hasId() { - int id = 0; - - Board.Builder builder = new Board.Builder(); - Board board = builder.id(id).build(); - - assertEquals(board.getId(), id); - } - - @Test - public void hasTitle() { - String title = "test title"; - - Board.Builder builder = new Board.Builder(); - Board board = builder.title(title).build(); - - assertEquals(board.getTitle(), title); - } - - @Test - public void hasBody() { - String body = "test body"; - - Board.Builder builder = new Board.Builder(); - Board board = builder.body(body).build(); - - assertEquals(board.getBody(), body); - } - - @Test - public void hasIdAndTitleAndBody() { - int id = 0; - String title = "test title"; - String body = "test body"; - - Board.Builder builder = new Board.Builder(); - Board board = builder.id(id).title(title).body(body).build(); - - assertEquals(board.getId(), id); - assertEquals(board.getTitle(), title); - assertEquals(board.getBody(), body); - } - - @Test - public void createFromHashMap() { - String title = "test title"; - String body = "test body"; - - HashMap map = new HashMap<>(); - map.put("title", title); - map.put("body", body); - - final Board.Builder builder = new Board.Builder(map); - Board board = builder.build(); - - assertEquals(board.getTitle(), title); - assertEquals(board.getBody(), body); - } -} diff --git a/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java b/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java deleted file mode 100644 index 2e91bca..0000000 --- a/src/test/java/com/example/javaweb/repository/BoardRepositoryTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.example.javaweb.repository; - -import com.example.javaweb.model.Board; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class BoardRepositoryTest { - private BoardRepository boardRepository; - - @BeforeEach - void setUp() { - this.boardRepository = new BoardRepository(); - } - - @Test - void insertBoard() { - final Board board = new Board.Builder().build(); - - assertNotEquals(-1, boardRepository.insert(board)); - assertEquals(1, boardRepository.size()); - } - - @Test - void firstBoardIdIs1() { - final Board board = new Board.Builder().build(); - assertEquals(1, boardRepository.insert(board)); - } - - @Test - void cannotHaveSpecificId() { - final int specificId = 9999; - final Board board = new Board.Builder().id(specificId).build(); - assertNotEquals(specificId, boardRepository.insert(board)); - } - - @Test - void cannotInsertNullBoard() { - assertEquals(-1, boardRepository.insert(null)); - assertEquals(0, boardRepository.size()); - } - - @Test - void findBoard() { - final String title = "title"; - final String body = "body"; - final Board board = new Board.Builder().title(title).body(body).build(); - final int id = boardRepository.insert(board); - - final Board foundedBoard = boardRepository.find(id); - assertEquals(id, foundedBoard.getId()); - assertEquals(board.getTitle(), foundedBoard.getTitle()); - assertEquals(board.getBody(), foundedBoard.getBody()); - } - - @Test - void returnNullIfWrongId() { - final int wrongId = -9999; - final Board board = boardRepository.find(wrongId); - assertNull(board); - } - - @Test - void deleteBoard() { - final String title = "title"; - final String body = "body"; - final Board board = new Board.Builder().title(title).body(body).build(); - final int id = boardRepository.insert(board); - - assertTrue(boardRepository.delete(id)); - assertNull(boardRepository.find(id)); - assertEquals(0, boardRepository.size()); - } - - @Test - void cannotDeleteWrongId() { - final int wrongId = -9999; - assertFalse(boardRepository.delete(wrongId)); - } - - @Test - void updateBoard() { - final String title = "title"; - final String body = "body"; - final Board board = new Board.Builder().title(title).body(body).build(); - final int id = boardRepository.insert(board); - - final String newTitle = "update title"; - final String newBody = "update body"; - final Board newBoard = new Board.Builder().title(newTitle).body(newBody).build(); - - final Board updatedBoard = boardRepository.update(id, newBoard); - - assertNotEquals(title, updatedBoard.getTitle()); - assertEquals(newTitle, updatedBoard.getTitle()); - assertNotEquals(body, updatedBoard.getBody()); - assertEquals(newBody, updatedBoard.getBody()); - } - - @Test - void cannotUpdateWrongId() { - final int wrongId = -9999; - final String title = "update title"; - final String body = "update body"; - final Board board = new Board.Builder().title(title).body(body).build(); - - final Board updatedBoard = boardRepository.update(wrongId, board); - assertNull(updatedBoard); - } -} From b448585b03c70bf76adb7ef6eec6280b58e81a0a Mon Sep 17 00:00:00 2001 From: mingimin Date: Sun, 20 Sep 2020 17:28:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?OneToMany,=20ManyToOne=20=EA=B4=80=EA=B3=84?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=98=EC=97=AC=20=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=EC=9E=AC=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaweb/controller/BoardsController.java | 8 ++-- .../javaweb/controller/UserController.java | 8 ++-- .../java/com/example/javaweb/model/Board.java | 38 +++++++++++++++++-- .../java/com/example/javaweb/model/User.java | 28 +++++++++++++- .../javaweb/repository/BoardRepository.java | 2 - .../example/javaweb/service/BoardService.java | 29 +++++++++++++- src/main/resources/application.yml | 2 +- 7 files changed, 97 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/javaweb/controller/BoardsController.java b/src/main/java/com/example/javaweb/controller/BoardsController.java index 37838b6..6c9ce2b 100644 --- a/src/main/java/com/example/javaweb/controller/BoardsController.java +++ b/src/main/java/com/example/javaweb/controller/BoardsController.java @@ -18,12 +18,12 @@ public BoardsController(BoardService boardService) { this.boardService = boardService; } - @PostMapping("/board") + @PostMapping("/boards") public ResponseEntity create(@RequestBody HashMap map) { return new ResponseEntity<>(boardService.insert(map), HttpStatus.CREATED); } - @GetMapping("/board/{id}") + @GetMapping("/boards/{id}") public ResponseEntity find(@PathVariable long id) { Board board = boardService.find(id); if (board == null) { @@ -35,7 +35,7 @@ public ResponseEntity find(@PathVariable long id) { return new ResponseEntity<>(board, HttpStatus.OK); } - @PutMapping("/board/{id}") + @PutMapping("/boards/{id}") public ResponseEntity update(@PathVariable int id, @RequestBody HashMap map) { Board board = boardService.update(id, map); if (board == null) { @@ -47,7 +47,7 @@ public ResponseEntity update(@PathVariable int id, @RequestBody HashMap(board, HttpStatus.OK); } - @DeleteMapping("/board/{id}") + @DeleteMapping("/boards/{id}") public ResponseEntity delete(@PathVariable int id) { if (!boardService.delete(id)) { throw new ResponseStatusException( diff --git a/src/main/java/com/example/javaweb/controller/UserController.java b/src/main/java/com/example/javaweb/controller/UserController.java index f4153a2..55a538c 100644 --- a/src/main/java/com/example/javaweb/controller/UserController.java +++ b/src/main/java/com/example/javaweb/controller/UserController.java @@ -18,12 +18,12 @@ public UserController(UserService userService) { this.userService = userService; } - @PostMapping("/user") + @PostMapping("/users") public ResponseEntity create(@RequestBody HashMap map) { return new ResponseEntity<>(userService.insert(map), HttpStatus.OK); } - @GetMapping("/user/{id}") + @GetMapping("/users/{id}") public ResponseEntity find(@PathVariable long id) { User user = userService.find(id); if (user == null) { @@ -35,7 +35,7 @@ public ResponseEntity find(@PathVariable long id) { return new ResponseEntity<>(user, HttpStatus.OK); } - @PutMapping("/user/{id}") + @PutMapping("/users/{id}") public ResponseEntity update(@PathVariable int id, @RequestBody HashMap map) { User user = userService.update(id, map); if (user == null) { @@ -47,7 +47,7 @@ public ResponseEntity update(@PathVariable int id, @RequestBody HashMap(user, HttpStatus.OK); } - @DeleteMapping("/user/{id}") + @DeleteMapping("/users/{id}") public ResponseEntity delete(@PathVariable int id) { if (!userService.delete(id)) { throw new ResponseStatusException( diff --git a/src/main/java/com/example/javaweb/model/Board.java b/src/main/java/com/example/javaweb/model/Board.java index db9f2bb..e773ef1 100644 --- a/src/main/java/com/example/javaweb/model/Board.java +++ b/src/main/java/com/example/javaweb/model/Board.java @@ -1,18 +1,38 @@ package com.example.javaweb.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + import javax.persistence.*; -import javax.persistence.criteria.CriteriaBuilder; +import java.io.Serializable; import java.util.HashMap; @Entity -public class Board { +@Table(name = "boards") +public class Board implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonProperty private Long id = null; + @JsonProperty private String title = null; + @JsonProperty private String body = null; - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + @JsonIgnoreProperties(value = {"applications", "hibernateLazyInitializer"}) + private User user; + public Long getId() { return id; } @@ -35,6 +55,13 @@ public void setId(Long id) { public Board() {} + public Board(Long id, String title, String body, User user) { + this.id = id; + this.title = title; + this.body = body; + this.user = user; + } + public Board(Long id, String title, String body) { this.id = id; this.title = title; @@ -51,5 +78,8 @@ public Board(HashMap map) { if (map.get("body") != null) { this.body = (String) map.get("body"); } + if (map.get("user") != null) { + this.user = (User) map.get("user"); + } } } diff --git a/src/main/java/com/example/javaweb/model/User.java b/src/main/java/com/example/javaweb/model/User.java index 95a529e..e79fd7c 100644 --- a/src/main/java/com/example/javaweb/model/User.java +++ b/src/main/java/com/example/javaweb/model/User.java @@ -1,18 +1,42 @@ package com.example.javaweb.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + import javax.persistence.*; -import java.util.ArrayList; +import java.io.Serializable; import java.util.HashMap; import java.util.List; @Entity -public class User { +@Table(name = "users") +public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonProperty private Long id = null; + @JsonProperty private String name = null; + public User(Long id, String name, List boards) { + this.id = id; + this.name = name; + this.boards = boards; + } + + public List getBoards() { + return boards; + } + + public void setBoards(List boards) { + this.boards = boards; + } + + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) + @JsonIgnore + private List boards; + public Long getId() { return id; } diff --git a/src/main/java/com/example/javaweb/repository/BoardRepository.java b/src/main/java/com/example/javaweb/repository/BoardRepository.java index b6e8a17..3793213 100644 --- a/src/main/java/com/example/javaweb/repository/BoardRepository.java +++ b/src/main/java/com/example/javaweb/repository/BoardRepository.java @@ -4,8 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface BoardRepository extends JpaRepository { diff --git a/src/main/java/com/example/javaweb/service/BoardService.java b/src/main/java/com/example/javaweb/service/BoardService.java index fb22dce..c0cb7d6 100644 --- a/src/main/java/com/example/javaweb/service/BoardService.java +++ b/src/main/java/com/example/javaweb/service/BoardService.java @@ -1,7 +1,9 @@ package com.example.javaweb.service; import com.example.javaweb.model.Board; +import com.example.javaweb.model.User; import com.example.javaweb.repository.BoardRepository; +import com.example.javaweb.repository.UserRepository; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -10,9 +12,11 @@ @Service public class BoardService { final private BoardRepository boardRepository; + final private UserRepository userRepository; - public BoardService(BoardRepository boardRepository) { + public BoardService(BoardRepository boardRepository, UserRepository userRepository) { this.boardRepository = boardRepository; + this.userRepository = userRepository; } public Board find(long id) { @@ -20,6 +24,17 @@ public Board find(long id) { } public Board insert(HashMap map) { + final Integer id = (Integer) map.get("user_id"); + if (id == null) { + return null; + } + + final Optional user = userRepository.findById(Long.valueOf(id)); + if (user.isEmpty()) { + return null; + } + + map.put("user", user.get()); final Board board = new Board(map); return boardRepository.save(board); } @@ -34,6 +49,17 @@ public boolean delete(long id) { } public Board update(long id, HashMap map) { + final Integer user_id = (Integer) map.get("user_id"); + if (user_id == null) { + return null; + } + + final Optional user = userRepository.findById(Long.valueOf(user_id)); + if (user.isEmpty()) { + return null; + } + + map.put("user", user.get()); final Board updateBoard = new Board(map); final Optional savedBoard = boardRepository.findById(id); if (savedBoard.isEmpty()) { @@ -42,6 +68,7 @@ public Board update(long id, HashMap map) { savedBoard.get().setTitle(updateBoard.getTitle()); savedBoard.get().setBody(updateBoard.getBody()); + savedBoard.get().setUser(updateBoard.getUser()); return boardRepository.save(savedBoard.get()); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d247c3a..4576483 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: show-sql: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect hibernate: - ddl-auto: create + ddl-auto: update properties: hibernate: format_sql: true \ No newline at end of file