From 54ab53c04cd3a390b2780ee6ec1c5449cfb4cb12 Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 22:28:49 +0900 Subject: [PATCH 01/18] =?UTF-8?q?step8=20:=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/controller/RoomEscapeController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/roomescape/controller/RoomEscapeController.java b/src/main/java/roomescape/controller/RoomEscapeController.java index 860c24215..086c90e31 100644 --- a/src/main/java/roomescape/controller/RoomEscapeController.java +++ b/src/main/java/roomescape/controller/RoomEscapeController.java @@ -15,4 +15,9 @@ public String home() { public String reservation() { return "reservation"; } + + @GetMapping("/time") + public String time() { + return "time"; + } } From f6604d598022902c35f7d702c5b21c77aa56d739 Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 22:32:36 +0900 Subject: [PATCH 02/18] =?UTF-8?q?refactor=20:=20@RequestMapping=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/roomescape/controller/ReservationController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 5f823738d..3dae839c1 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import roomescape.entity.Reservation; import roomescape.entity.repository.ReservationRepository; @@ -18,6 +19,7 @@ import roomescape.exception.ReservationException; @RestController +@RequestMapping("/reservations") public class ReservationController { private final ReservationRepository reservationRepository; @@ -26,13 +28,13 @@ public ReservationController(ReservationRepository reservationRepository) { this.reservationRepository = reservationRepository; } - @GetMapping("/reservations") + @GetMapping public List getReservations() { return reservationRepository.findAll(); } @Transactional - @PostMapping("/reservations") + @PostMapping public ResponseEntity createReservation(@RequestBody Reservation reservation) { final Reservation save = reservationRepository.save(reservation); URI location = URI.create("/reservations/" + save.getId()); @@ -40,7 +42,7 @@ public ResponseEntity createReservation(@RequestBody Reservation re } @Transactional - @DeleteMapping("/reservations/{id}") + @DeleteMapping("/{id}") public ResponseEntity deleteReservation(@PathVariable Long id) { final int countOfDeleted = reservationRepository.deleteById(id); From 4b4221161e93a3a35e1186973ddcdef136e4850e Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 22:34:11 +0900 Subject: [PATCH 03/18] =?UTF-8?q?refactor=20:=20SpringFramework=EC=9D=98?= =?UTF-8?q?=20@Transaction=EC=9C=BC=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/controller/ReservationController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 3dae839c1..c564a6aa1 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -1,10 +1,10 @@ package roomescape.controller; -import jakarta.transaction.Transactional; import java.net.URI; import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; From ca5ea512ae2c710e0135c2e50ba1484fb0613d25 Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 23:13:33 +0900 Subject: [PATCH 04/18] =?UTF-8?q?step8=20:=20=EC=8A=A4=ED=82=A4=EB=A7=88?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/schema.sql | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 4f5b8dc9a..3c8e62a16 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -6,3 +6,10 @@ CREATE TABLE reservation time VARCHAR(5) NOT NULL, PRIMARY KEY (id) ); + +CREATE TABLE time +( + id BIGINT NOT NULL AUTO_INCREMENT, + time VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); From 7bfb606430e47129bfbae7c0fb142c892b690c02 Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 23:14:33 +0900 Subject: [PATCH 05/18] step8 --- .../roomescape/controller/TimeController.java | 55 +++++++++++++++++++ .../java/roomescape/entity/Dto/TimeInDto.java | 19 +++++++ .../roomescape/entity/Dto/TimeOutDto.java | 21 +++++++ .../entity/repository/TimeRepository.java | 46 ++++++++++++++++ src/test/java/roomescape/CoreStepTest.java | 43 +++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 src/main/java/roomescape/controller/TimeController.java create mode 100644 src/main/java/roomescape/entity/Dto/TimeInDto.java create mode 100644 src/main/java/roomescape/entity/Dto/TimeOutDto.java create mode 100644 src/main/java/roomescape/entity/repository/TimeRepository.java create mode 100644 src/test/java/roomescape/CoreStepTest.java diff --git a/src/main/java/roomescape/controller/TimeController.java b/src/main/java/roomescape/controller/TimeController.java new file mode 100644 index 000000000..74c5444e1 --- /dev/null +++ b/src/main/java/roomescape/controller/TimeController.java @@ -0,0 +1,55 @@ +package roomescape.controller; + +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import roomescape.entity.Dto.TimeInDto; +import roomescape.entity.Dto.TimeOutDto; +import roomescape.entity.repository.TimeRepository; +import roomescape.exception.NotFoundException; + +@RestController +@RequestMapping("/times") +public class TimeController { + + private final TimeRepository timeRepository; + + public TimeController(TimeRepository timeRepository) { + this.timeRepository = timeRepository; + } + + @GetMapping + public List getTimes() { + return timeRepository.findAll(); + } + + @Transactional + @PostMapping + public ResponseEntity createTime(@RequestBody TimeInDto timeInDto) { + final TimeOutDto save = timeRepository.save(timeInDto); + URI location = URI.create("/times/" + save.getId()); + return ResponseEntity.created(location).body(save); + } + + + @Transactional + @DeleteMapping("/{id}") + public ResponseEntity deleteTime(@PathVariable Long id) { + final int countOfDeleted = timeRepository.deleteById(id); + + if (countOfDeleted <= 0) { + throw new NotFoundException("해당 id를 가진 Time 객체를 찾을 수 없습니다."); + } + + return ResponseEntity.noContent().build(); + } + +} diff --git a/src/main/java/roomescape/entity/Dto/TimeInDto.java b/src/main/java/roomescape/entity/Dto/TimeInDto.java new file mode 100644 index 000000000..7f3501309 --- /dev/null +++ b/src/main/java/roomescape/entity/Dto/TimeInDto.java @@ -0,0 +1,19 @@ +package roomescape.entity.Dto; + +public class TimeInDto { + + private String time; + + private TimeInDto() { + this.time = null; + } + + public TimeInDto(String time) { + this.time = time; + } + + public String getTime() { + return time; + } + +} diff --git a/src/main/java/roomescape/entity/Dto/TimeOutDto.java b/src/main/java/roomescape/entity/Dto/TimeOutDto.java new file mode 100644 index 000000000..8e8dbe1cb --- /dev/null +++ b/src/main/java/roomescape/entity/Dto/TimeOutDto.java @@ -0,0 +1,21 @@ +package roomescape.entity.Dto; + +public class TimeOutDto { + + private Long id; + private String time; + + public TimeOutDto(Long id, String time) { + this.id = id; + this.time = time; + } + + public Long getId() { + return id; + } + + public String getTime() { + return time; + } + +} diff --git a/src/main/java/roomescape/entity/repository/TimeRepository.java b/src/main/java/roomescape/entity/repository/TimeRepository.java new file mode 100644 index 000000000..272e9ebca --- /dev/null +++ b/src/main/java/roomescape/entity/repository/TimeRepository.java @@ -0,0 +1,46 @@ +package roomescape.entity.repository; + +import java.util.List; +import javax.sql.DataSource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.jdbc.core.simple.SimpleJdbcInsert; +import org.springframework.stereotype.Repository; +import roomescape.entity.Dto.TimeInDto; +import roomescape.entity.Dto.TimeOutDto; + +@Repository +public class TimeRepository { + + private final JdbcTemplate jdbcTemplate; + private final SimpleJdbcInsert simpleJdbcInsert; + + public TimeRepository(JdbcTemplate jdbcTemplate, DataSource source) { + this.jdbcTemplate = jdbcTemplate; + this.simpleJdbcInsert = new SimpleJdbcInsert(source) + .withTableName("time") + .usingGeneratedKeyColumns("id"); + } + + public List findAll() { + String sql = "SELECT * FROM time"; + return jdbcTemplate.query(sql, (rs, rowNum) -> + new TimeOutDto( + rs.getLong("id"), + rs.getString("time"))); + } + + public TimeOutDto save(TimeInDto timeInDto) { + SqlParameterSource params = new MapSqlParameterSource() + .addValue("time", timeInDto.getTime()); + long id = simpleJdbcInsert.executeAndReturnKey(params).longValue(); + return new TimeOutDto(id, timeInDto.getTime()); + } + + public int deleteById(Long id) { + String sql = "DELETE FROM time WHERE id = ?"; + return jdbcTemplate.update(sql, id); + } + +} diff --git a/src/test/java/roomescape/CoreStepTest.java b/src/test/java/roomescape/CoreStepTest.java new file mode 100644 index 000000000..fc73d139d --- /dev/null +++ b/src/test/java/roomescape/CoreStepTest.java @@ -0,0 +1,43 @@ +package roomescape; + +import static org.hamcrest.Matchers.is; + +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class CoreStepTest { + + @Test + void 팔단계() { + Map params = new HashMap<>(); + params.put("time", "10:00"); + + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(params) + .when().post("/times") + .then().log().all() + .statusCode(201) + .header("Location", "/times/1"); + + RestAssured.given().log().all() + .when().get("/times") + .then().log().all() + .statusCode(200) + .body("size()", is(1)); + + RestAssured.given().log().all() + .when().delete("/times/1") + .then().log().all() + .statusCode(204); + } + + +} From 37d388da57aa1a5f25359dc8caba877d19801512 Mon Sep 17 00:00:00 2001 From: JoungMinJu Date: Wed, 12 Feb 2025 23:42:19 +0900 Subject: [PATCH 06/18] =?UTF-8?q?step8=20:=20TimeOutDto=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EA=B3=A0=20Time=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/controller/TimeController.java | 8 +++---- .../roomescape/entity/Dto/TimeOutDto.java | 21 ------------------- .../entity/repository/TimeRepository.java | 10 ++++----- .../java/roomescape/entity/value/Time.java | 21 ++++++++++++++----- 4 files changed, 25 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/roomescape/entity/Dto/TimeOutDto.java diff --git a/src/main/java/roomescape/controller/TimeController.java b/src/main/java/roomescape/controller/TimeController.java index 74c5444e1..443f37a27 100644 --- a/src/main/java/roomescape/controller/TimeController.java +++ b/src/main/java/roomescape/controller/TimeController.java @@ -12,8 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import roomescape.entity.Dto.TimeInDto; -import roomescape.entity.Dto.TimeOutDto; import roomescape.entity.repository.TimeRepository; +import roomescape.entity.value.Time; import roomescape.exception.NotFoundException; @RestController @@ -27,14 +27,14 @@ public TimeController(TimeRepository timeRepository) { } @GetMapping - public List getTimes() { + public List