From ce7cb7f56794a877ba79920bf0d7876ea621bce3 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 13:02:40 +0900 Subject: [PATCH 01/21] step1 --- build.gradle | 2 ++ .../roomescape/controller/StepController.java | 15 +++++++++++++++ src/test/java/roomescape/MissionStepTest.java | 15 ++++++++++++--- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/main/java/roomescape/controller/StepController.java diff --git a/build.gradle b/build.gradle index 57267157c..40a581b15 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' } diff --git a/src/main/java/roomescape/controller/StepController.java b/src/main/java/roomescape/controller/StepController.java new file mode 100644 index 000000000..498eee27d --- /dev/null +++ b/src/main/java/roomescape/controller/StepController.java @@ -0,0 +1,15 @@ +package roomescape.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@Controller +public class StepController { + + @GetMapping("/") + public String viewHome() { + + return "home"; + } +} diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index cf4efbe91..b931bcbf2 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -1,5 +1,12 @@ package roomescape; +import static org.assertj.core.api.Assertions.assertThat; + +import io.restassured.RestAssured; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + + import io.restassured.RestAssured; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -11,9 +18,11 @@ public class MissionStepTest { @Test void 일단계() { - RestAssured.given().log().all() + var response = RestAssured.given().log().all() .when().get("/") - .then().log().all() - .statusCode(200); + .then().log().all().extract(); +// .statusCode(200); + + assertThat(response.asString()).contains("어드민 페이지"); } } From aa41cbe9edb9c966e4e8a3b385f5f48bc7b0c40a Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 13:04:49 +0900 Subject: [PATCH 02/21] =?UTF-8?q?test:=20=EC=9D=BC=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/roomescape/MissionStepTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index b931bcbf2..dab63f7d8 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -18,11 +18,9 @@ public class MissionStepTest { @Test void 일단계() { - var response = RestAssured.given().log().all() + RestAssured.given().log().all() .when().get("/") - .then().log().all().extract(); -// .statusCode(200); - - assertThat(response.asString()).contains("어드민 페이지"); + .then().log().all() + .statusCode(200); } } From 50a9c9c1941af101dfe3688097ddc03646e05662 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 14:18:32 +0900 Subject: [PATCH 03/21] feat: step2 --- .../controller/ReservationController.java | 27 ++++++++++++++ .../roomescape/controller/StepController.java | 6 ++++ src/main/java/roomescape/dto/Reservation.java | 36 +++++++++++++++++++ src/main/resources/templates/reservation.html | 2 +- src/test/java/roomescape/MissionStepTest.java | 19 +++++++++- 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/main/java/roomescape/controller/ReservationController.java create mode 100644 src/main/java/roomescape/dto/Reservation.java diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java new file mode 100644 index 000000000..29b481d1d --- /dev/null +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -0,0 +1,27 @@ +package roomescape.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import roomescape.dto.Reservation; + +import java.util.ArrayList; +import java.util.List; + +@Controller +public class ReservationController { + private List reservations = new ArrayList<>(); + + @GetMapping("/reservations") + @ResponseBody + public ResponseEntity> getReservations() { + reservations.add(Reservation.toEntity(1, "브라운", "2023-01-01", "10:00")); + reservations.add(Reservation.toEntity(2, "브라운", "2023-01-02", "11:00")); + reservations.add(Reservation.toEntity(3, "브라운", "2023-01-03", "12:00")); + + return ResponseEntity.ok().body(reservations); + } + + +} \ No newline at end of file diff --git a/src/main/java/roomescape/controller/StepController.java b/src/main/java/roomescape/controller/StepController.java index 498eee27d..151e832a3 100644 --- a/src/main/java/roomescape/controller/StepController.java +++ b/src/main/java/roomescape/controller/StepController.java @@ -12,4 +12,10 @@ public String viewHome() { return "home"; } + + @GetMapping("/reservation") + public String viewReservation(){ + + return "reservation"; + } } diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java new file mode 100644 index 000000000..af84a4435 --- /dev/null +++ b/src/main/java/roomescape/dto/Reservation.java @@ -0,0 +1,36 @@ +package roomescape.dto; + +public class Reservation { + private int id; + private String name; + private String date; + private String time; + + public Reservation(int id, String name, String date, String time) { + this.id = id; + this.name = name; + this.date = date; + this.time = time; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } + + public static Reservation toEntity(int id, String name, String date, String time) { + return new Reservation(id, name, date, time); + } + +} diff --git a/src/main/resources/templates/reservation.html b/src/main/resources/templates/reservation.html index 7c0eb9fc4..82f7a07cf 100644 --- a/src/main/resources/templates/reservation.html +++ b/src/main/resources/templates/reservation.html @@ -55,7 +55,7 @@

예약 관리

- + diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index dab63f7d8..b2ae7efdb 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.is; + import io.restassured.RestAssured; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -18,9 +20,24 @@ public class MissionStepTest { @Test void 일단계() { - RestAssured.given().log().all() + RestAssured.given().log().all() .when().get("/") .then().log().all() .statusCode(200); } + + @Test + void 이단계() { + RestAssured.given().log().all() + .when().get("/reservation") + .then().log().all() + .statusCode(200); + + RestAssured.given().log().all() + .when().get("/reservations") + .then().log().all() + .statusCode(200) + .body("size()", is(3)); // 아직 생성 요청이 없으니 Controller에서 임의로 넣어준 Reservation 갯수 만큼 검증하거나 0개임을 확인하세요. + } + } From 664fe38ed5d57e86bbe2d2a2d3e375975c735bec Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 19:55:39 +0900 Subject: [PATCH 04/21] =?UTF-8?q?feat:=20step3=20create=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...StepController.java => AppController.java} | 3 +- .../controller/ReservationController.java | 26 +++++++++---- src/main/java/roomescape/dto/Reservation.java | 19 +++++++--- src/test/java/roomescape/MissionStepTest.java | 37 +++++++++++++++++++ 4 files changed, 71 insertions(+), 14 deletions(-) rename src/main/java/roomescape/controller/{StepController.java => AppController.java} (78%) diff --git a/src/main/java/roomescape/controller/StepController.java b/src/main/java/roomescape/controller/AppController.java similarity index 78% rename from src/main/java/roomescape/controller/StepController.java rename to src/main/java/roomescape/controller/AppController.java index 151e832a3..c4cb9bce0 100644 --- a/src/main/java/roomescape/controller/StepController.java +++ b/src/main/java/roomescape/controller/AppController.java @@ -2,10 +2,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; @Controller -public class StepController { +public class AppController { @GetMapping("/") public String viewHome() { diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 29b481d1d..b2e9315f3 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -3,24 +3,36 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import roomescape.dto.Reservation; +import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; @Controller public class ReservationController { private List reservations = new ArrayList<>(); + private AtomicLong index = new AtomicLong(1); - @GetMapping("/reservations") - @ResponseBody - public ResponseEntity> getReservations() { - reservations.add(Reservation.toEntity(1, "브라운", "2023-01-01", "10:00")); - reservations.add(Reservation.toEntity(2, "브라운", "2023-01-02", "11:00")); - reservations.add(Reservation.toEntity(3, "브라운", "2023-01-03", "12:00")); +// @GetMapping("/reservations") +// public ResponseEntity> getReservations() { +// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-01", "10:00")); +// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-02", "11:00")); +// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-03", "12:00")); +// +// return ResponseEntity.ok().body(reservations); +// } - return ResponseEntity.ok().body(reservations); + @PostMapping("/reservations") + public ResponseEntity createReservation(@RequestBody Reservation reservation) { + Reservation newReservation = Reservation.toEntity(index.getAndIncrement(), reservation); + reservations.add(newReservation); + + return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index af84a4435..53a101cad 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -1,19 +1,28 @@ package roomescape.dto; public class Reservation { - private int id; + private Long id; private String name; private String date; private String time; - public Reservation(int id, String name, String date, String time) { + public Reservation() { + } + + public Reservation(Long id, String name, String date, String time) { this.id = id; this.name = name; this.date = date; this.time = time; } - public int getId() { + public Reservation(String name, String date, String time) { + this.name = name; + this.date = date; + this.time = time; + } + + public Long getId() { return id; } @@ -29,8 +38,8 @@ public String getTime() { return time; } - public static Reservation toEntity(int id, String name, String date, String time) { - return new Reservation(id, name, date, time); + public static Reservation toEntity(Long id, Reservation reservation) { + return new Reservation(id, reservation.name, reservation.date, reservation.time); } } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index b2ae7efdb..16516c827 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -5,6 +5,7 @@ import static org.hamcrest.Matchers.is; import io.restassured.RestAssured; +import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -14,6 +15,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; +import java.util.HashMap; +import java.util.Map; + @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class MissionStepTest { @@ -40,4 +44,37 @@ public class MissionStepTest { .body("size()", is(3)); // 아직 생성 요청이 없으니 Controller에서 임의로 넣어준 Reservation 갯수 만큼 검증하거나 0개임을 확인하세요. } + @Test + void 삼단계() { + Map params = new HashMap<>(); + params.put("name", "브라운"); + params.put("date", "2023-08-05"); + params.put("time", "15:40"); + + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(params) + .when().post("/reservations") + .then().log().all() + .statusCode(201) + .header("Location", "/reservations/1") + .body("id", is(1)); +// +// RestAssured.given().log().all() +// .when().get("/reservations") +// .then().log().all() +// .statusCode(200) +// .body("size()", is(1)); +// +// RestAssured.given().log().all() +// .when().delete("/reservations/1") +// .then().log().all() +// .statusCode(204); +// +// RestAssured.given().log().all() +// .when().get("/reservations") +// .then().log().all() +// .statusCode(200) +// .body("size()", is(0)); + } } From 7c34c2ddb11190363d771b9ef93df5ec11f55411 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 19:57:05 +0900 Subject: [PATCH 05/21] =?UTF-8?q?feat:=20step3=20get=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 15 ++++++--------- src/test/java/roomescape/MissionStepTest.java | 12 ++++++------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index b2e9315f3..e306bd62e 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -18,20 +18,17 @@ public class ReservationController { private List reservations = new ArrayList<>(); private AtomicLong index = new AtomicLong(1); -// @GetMapping("/reservations") -// public ResponseEntity> getReservations() { -// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-01", "10:00")); -// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-02", "11:00")); -// reservations.add(Reservation.toEntity(index.getAndIncrement(), "브라운", "2023-01-03", "12:00")); -// -// return ResponseEntity.ok().body(reservations); -// } + @GetMapping("/reservations") + public ResponseEntity> getReservations() { + + return ResponseEntity.ok().body(reservations); + } @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody Reservation reservation) { Reservation newReservation = Reservation.toEntity(index.getAndIncrement(), reservation); reservations.add(newReservation); - + return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 16516c827..b4763cb5d 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -59,12 +59,12 @@ public class MissionStepTest { .statusCode(201) .header("Location", "/reservations/1") .body("id", is(1)); -// -// RestAssured.given().log().all() -// .when().get("/reservations") -// .then().log().all() -// .statusCode(200) -// .body("size()", is(1)); + + RestAssured.given().log().all() + .when().get("/reservations") + .then().log().all() + .statusCode(200) + .body("size()", is(1)); // // RestAssured.given().log().all() // .when().delete("/reservations/1") From 1dc190a0a235d68971549a26cddafb56647e03a7 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 20:00:04 +0900 Subject: [PATCH 06/21] =?UTF-8?q?feat:=20step3=20delete=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 16 ++++++++++---- src/test/java/roomescape/MissionStepTest.java | 22 +++++++++---------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index e306bd62e..f167652e7 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -2,15 +2,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import roomescape.dto.Reservation; import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; @Controller @@ -32,5 +30,15 @@ public ResponseEntity createReservation(@RequestBody Reservation re return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } + @DeleteMapping("/reservations/{id}") + public ResponseEntity deleteReservation(@PathVariable Long id) { + Reservation reservation = reservations.stream() + .filter(it -> Objects.equals(it.getId(), id)) + .findFirst() + .orElseThrow(RuntimeException::new); + reservations.remove(reservation); + + return ResponseEntity.noContent().build(); + } } \ No newline at end of file diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index b4763cb5d..9f14e3c04 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -65,16 +65,16 @@ public class MissionStepTest { .then().log().all() .statusCode(200) .body("size()", is(1)); -// -// RestAssured.given().log().all() -// .when().delete("/reservations/1") -// .then().log().all() -// .statusCode(204); -// -// RestAssured.given().log().all() -// .when().get("/reservations") -// .then().log().all() -// .statusCode(200) -// .body("size()", is(0)); + + RestAssured.given().log().all() + .when().delete("/reservations/1") + .then().log().all() + .statusCode(204); + + RestAssured.given().log().all() + .when().get("/reservations") + .then().log().all() + .statusCode(200) + .body("size()", is(0)); } } From c8e97c407d2dfd330c8789d515dd32f8f32f1b27 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 20:25:53 +0900 Subject: [PATCH 07/21] =?UTF-8?q?feat:=20step4=20delete=20id=20=EB=AF=B8?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC,=20insert=20empty=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 9 +++++++- src/main/java/roomescape/dto/Reservation.java | 15 +++++++++++++ .../NotFoundReservationException.java | 7 +++++++ src/test/java/roomescape/MissionStepTest.java | 21 +++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/java/roomescape/exception/NotFoundReservationException.java diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index f167652e7..1cb313b01 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.dto.Reservation; +import roomescape.exception.NotFoundReservationException; import java.net.URI; import java.util.ArrayList; @@ -25,6 +26,7 @@ public ResponseEntity> getReservations() { @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody Reservation reservation) { Reservation newReservation = Reservation.toEntity(index.getAndIncrement(), reservation); + reservations.add(newReservation); return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); @@ -35,10 +37,15 @@ public ResponseEntity deleteReservation(@PathVariable Long id) { Reservation reservation = reservations.stream() .filter(it -> Objects.equals(it.getId(), id)) .findFirst() - .orElseThrow(RuntimeException::new); + .orElseThrow(() -> new NotFoundReservationException("삭제할 ID" + id + "가 존재하지 않습니다.")); reservations.remove(reservation); return ResponseEntity.noContent().build(); } + + @ExceptionHandler(NotFoundReservationException.class) + public ResponseEntity handleException(NotFoundReservationException e) { + return ResponseEntity.badRequest().build(); + } } \ No newline at end of file diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 53a101cad..04380df61 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -1,5 +1,7 @@ package roomescape.dto; +import roomescape.exception.NotFoundReservationException; + public class Reservation { private Long id; private String name; @@ -10,6 +12,10 @@ public Reservation() { } public Reservation(Long id, String name, String date, String time) { + validateEmpty(name); + validateEmpty(date); + validateEmpty(time); + this.id = id; this.name = name; this.date = date; @@ -17,6 +23,10 @@ public Reservation(Long id, String name, String date, String time) { } public Reservation(String name, String date, String time) { + validateEmpty(name); + validateEmpty(date); + validateEmpty(time); + this.name = name; this.date = date; this.time = time; @@ -42,4 +52,9 @@ public static Reservation toEntity(Long id, Reservation reservation) { return new Reservation(id, reservation.name, reservation.date, reservation.time); } + private void validateEmpty(String data) { + if (data.isEmpty()) { + throw new NotFoundReservationException("값이 존재하지 않습니다."); + } + } } diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java new file mode 100644 index 000000000..c1270a896 --- /dev/null +++ b/src/main/java/roomescape/exception/NotFoundReservationException.java @@ -0,0 +1,7 @@ +package roomescape.exception; + +public class NotFoundReservationException extends RuntimeException { + public NotFoundReservationException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 9f14e3c04..feadfc0e3 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -77,4 +77,25 @@ public class MissionStepTest { .statusCode(200) .body("size()", is(0)); } + + @Test + void 사단계() { + Map params = new HashMap<>(); + params.put("name", "브라운"); + params.put("date", ""); + params.put("time", ""); + + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(params) + .when().post("/reservations") + .then().log().all() + .statusCode(400); + + // 삭제할 예약이 없는 경우 + RestAssured.given().log().all() + .when().delete("/reservations/1") + .then().log().all() + .statusCode(400); + } } From d357ab33a94433f431383c52863ad4c0d4120e74 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 20:30:06 +0900 Subject: [PATCH 08/21] =?UTF-8?q?refactor:=20exception=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EC=9C=84=EC=B9=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/roomescape/controller/ReservationController.java | 2 +- src/main/java/roomescape/dto/Reservation.java | 2 +- .../{ => dto}/exception/NotFoundReservationException.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/roomescape/{ => dto}/exception/NotFoundReservationException.java (82%) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 1cb313b01..aa0ad2631 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.dto.Reservation; -import roomescape.exception.NotFoundReservationException; +import roomescape.dto.exception.NotFoundReservationException; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 04380df61..13cc1f525 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -1,6 +1,6 @@ package roomescape.dto; -import roomescape.exception.NotFoundReservationException; +import roomescape.dto.exception.NotFoundReservationException; public class Reservation { private Long id; diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/dto/exception/NotFoundReservationException.java similarity index 82% rename from src/main/java/roomescape/exception/NotFoundReservationException.java rename to src/main/java/roomescape/dto/exception/NotFoundReservationException.java index c1270a896..99a559088 100644 --- a/src/main/java/roomescape/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/dto/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.exception; +package roomescape.dto.exception; public class NotFoundReservationException extends RuntimeException { public NotFoundReservationException(String message) { From e2f17e7c0bbb69a65ce9e70e45e0c8b564c5ee34 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 13 May 2024 20:48:33 +0900 Subject: [PATCH 09/21] =?UTF-8?q?feat:=20Date,=20Time=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/dto/Reservation.java | 35 ++++++++++++++++--- src/test/java/roomescape/MissionStepTest.java | 8 +++-- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 13cc1f525..c1a758e3b 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -2,6 +2,12 @@ import roomescape.dto.exception.NotFoundReservationException; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.zip.DataFormatException; + public class Reservation { private Long id; private String name; @@ -13,8 +19,8 @@ public Reservation() { public Reservation(Long id, String name, String date, String time) { validateEmpty(name); - validateEmpty(date); - validateEmpty(time); + validateDate(date); + validateTime(time); this.id = id; this.name = name; @@ -24,8 +30,8 @@ public Reservation(Long id, String name, String date, String time) { public Reservation(String name, String date, String time) { validateEmpty(name); - validateEmpty(date); - validateEmpty(time); + validateDate(date); + validateTime(time); this.name = name; this.date = date; @@ -57,4 +63,25 @@ private void validateEmpty(String data) { throw new NotFoundReservationException("값이 존재하지 않습니다."); } } + + private void validateDate(String dateString) { + DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + try { + LocalDate.parse(dateString, DATE_FORMATTER); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("날짜 형식이 맞지 않습니다."); + } + } + + private void validateTime(String timeString) { + DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("hh:mm"); + + try { + LocalTime.parse(timeString, TIME_FORMATTER); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("시간 형식이 맞지 않습니다."); + } + } + } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index feadfc0e3..29b67cb8d 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -81,9 +81,9 @@ public class MissionStepTest { @Test void 사단계() { Map params = new HashMap<>(); - params.put("name", "브라운"); - params.put("date", ""); - params.put("time", ""); + params.put("name", ""); + params.put("date", "2024-02-30"); + params.put("time", "25:11"); RestAssured.given().log().all() .contentType(ContentType.JSON) @@ -97,5 +97,7 @@ public class MissionStepTest { .when().delete("/reservations/1") .then().log().all() .statusCode(400); + + } } From e8d18c57b6a37363d19bd6eecaa93675311e9561 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 20 May 2024 12:29:15 +0900 Subject: [PATCH 10/21] =?UTF-8?q?feat:=205=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++ .../controller/ReservationController.java | 2 +- .../NotFoundReservationException.java | 2 +- src/main/java/roomescape/dto/Reservation.java | 3 +- src/main/resources/application.properties | 4 +++ src/main/resources/schema.sql | 8 +++++ src/test/java/roomescape/ReservationTest.java | 31 +++++++++++++++++++ 7 files changed, 49 insertions(+), 4 deletions(-) rename src/main/java/roomescape/{dto => domain}/exception/NotFoundReservationException.java (81%) create mode 100644 src/main/resources/schema.sql create mode 100644 src/test/java/roomescape/ReservationTest.java diff --git a/build.gradle b/build.gradle index 40a581b15..9191610af 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' + implementation 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' } diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index aa0ad2631..5b74fcf45 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.dto.Reservation; -import roomescape.dto.exception.NotFoundReservationException; +import roomescape.domain.exception.NotFoundReservationException; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/roomescape/dto/exception/NotFoundReservationException.java b/src/main/java/roomescape/domain/exception/NotFoundReservationException.java similarity index 81% rename from src/main/java/roomescape/dto/exception/NotFoundReservationException.java rename to src/main/java/roomescape/domain/exception/NotFoundReservationException.java index 99a559088..13929bb45 100644 --- a/src/main/java/roomescape/dto/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/domain/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.dto.exception; +package roomescape.domain.exception; public class NotFoundReservationException extends RuntimeException { public NotFoundReservationException(String message) { diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index c1a758e3b..0be4bc1cc 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -1,12 +1,11 @@ package roomescape.dto; -import roomescape.dto.exception.NotFoundReservationException; +import roomescape.domain.exception.NotFoundReservationException; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import java.util.zip.DataFormatException; public class Reservation { private Long id; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb..f861d4a59 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,4 @@ +# h2-console ??? ?? +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +spring.datasource.url=jdbc:h2:mem:database \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 000000000..ed2d29830 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE reservation +( + id BIGINT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + date VARCHAR(255) NOT NULL, + time VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); \ No newline at end of file diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java new file mode 100644 index 000000000..f3bbd0853 --- /dev/null +++ b/src/test/java/roomescape/ReservationTest.java @@ -0,0 +1,31 @@ +package roomescape; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.annotation.DirtiesContext; + +import java.sql.Connection; +import java.sql.SQLException; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class ReservationTest { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Test + void 오단계() { + try (Connection connection = jdbcTemplate.getDataSource().getConnection()) { + assertThat(connection).isNotNull(); + assertThat(connection.getCatalog()).isEqualTo("DATABASE"); + assertThat(connection.getMetaData().getTables(null, null, "RESERVATION", null).next()).isTrue(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file From ff9df48dc7aebc517aed684df5fd22a01aaf417a Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 20 May 2024 17:39:23 +0900 Subject: [PATCH 11/21] =?UTF-8?q?feat:=206=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 20 +++++--- .../domain/ReservationRepository.java | 30 +++++++++++ src/main/java/roomescape/dto/Reservation.java | 33 ++++++++---- src/test/java/roomescape/ReservationTest.java | 51 ++++++++++++++++++- 4 files changed, 116 insertions(+), 18 deletions(-) create mode 100644 src/main/java/roomescape/domain/ReservationRepository.java diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 5b74fcf45..848a2a64e 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -3,8 +3,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import roomescape.dto.Reservation; +import roomescape.domain.ReservationRepository; import roomescape.domain.exception.NotFoundReservationException; +import roomescape.dto.Reservation; import java.net.URI; import java.util.ArrayList; @@ -14,18 +15,23 @@ @Controller public class ReservationController { - private List reservations = new ArrayList<>(); - private AtomicLong index = new AtomicLong(1); + private final List reservations = new ArrayList<>(); + private final AtomicLong index = new AtomicLong(1); + private ReservationRepository reservationRepository; - @GetMapping("/reservations") - public ResponseEntity> getReservations() { + public ReservationController(ReservationRepository reservationRepository) { + this.reservationRepository = reservationRepository; + } + @GetMapping("/reservations") + public ResponseEntity> getReservations(){ + final List reservations = reservationRepository.findReservation(); return ResponseEntity.ok().body(reservations); } @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody Reservation reservation) { - Reservation newReservation = Reservation.toEntity(index.getAndIncrement(), reservation); + Reservation newReservation = Reservation.toEntity((int) index.getAndIncrement(), reservation); reservations.add(newReservation); @@ -33,7 +39,7 @@ public ResponseEntity createReservation(@RequestBody Reservation re } @DeleteMapping("/reservations/{id}") - public ResponseEntity deleteReservation(@PathVariable Long id) { + public ResponseEntity deleteReservation(@PathVariable int id) { Reservation reservation = reservations.stream() .filter(it -> Objects.equals(it.getId(), id)) .findFirst() diff --git a/src/main/java/roomescape/domain/ReservationRepository.java b/src/main/java/roomescape/domain/ReservationRepository.java new file mode 100644 index 000000000..353d224c3 --- /dev/null +++ b/src/main/java/roomescape/domain/ReservationRepository.java @@ -0,0 +1,30 @@ +package roomescape.domain; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import roomescape.dto.Reservation; + +import java.util.List; + +@Repository +public class ReservationRepository { + private final JdbcTemplate jdbcTemplate; + + public ReservationRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public List findReservation() { + + return jdbcTemplate.query( + "select * from reservation", + (resultSet, rowNum) -> + new Reservation( + resultSet.getInt("id"), + resultSet.getString("name"), + resultSet.getString("date"), + resultSet.getString("time") + ) + ); + } +} \ No newline at end of file diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 0be4bc1cc..a4404ba1b 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -8,52 +8,65 @@ import java.time.format.DateTimeParseException; public class Reservation { - private Long id; + private int id; private String name; private String date; private String time; - public Reservation() { - } - - public Reservation(Long id, String name, String date, String time) { + public Reservation(String name, String date, String time) { validateEmpty(name); validateDate(date); validateTime(time); - this.id = id; this.name = name; this.date = date; this.time = time; } - public Reservation(String name, String date, String time) { + public Reservation(int id, String name, String date, String time) { validateEmpty(name); validateDate(date); validateTime(time); + this.id = id; this.name = name; this.date = date; this.time = time; } - public Long getId() { + public int getId() { return id; } + public void setId(int id) { + this.id = id; + } + public String getName() { return name; } + public void setName(String name) { + this.name = name; + } + public String getDate() { return date; } + public void setDate(String date) { + this.date = date; + } + public String getTime() { return time; } - public static Reservation toEntity(Long id, Reservation reservation) { + public void setTime(String time) { + this.time = time; + } + + public static Reservation toEntity(int id, Reservation reservation) { return new Reservation(id, reservation.name, reservation.date, reservation.time); } @@ -74,7 +87,7 @@ private void validateDate(String dateString) { } private void validateTime(String timeString) { - DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("hh:mm"); + DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:MM"); try { LocalTime.parse(timeString, TIME_FORMATTER); diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java index f3bbd0853..7d00ff076 100644 --- a/src/test/java/roomescape/ReservationTest.java +++ b/src/test/java/roomescape/ReservationTest.java @@ -1,15 +1,21 @@ package roomescape; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.annotation.DirtiesContext; +import roomescape.dto.Reservation; import java.sql.Connection; import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @@ -28,4 +34,47 @@ public class ReservationTest { throw new RuntimeException(e); } } + + @Test + void 육단계() { + jdbcTemplate.update("INSERT INTO reservation (name, date, time) VALUES (?, ?, ?)", "브라운", "2023-08-05", "15:40"); + + List reservations = + RestAssured.given().log().all() + .when().get("/reservations") + .then().log().all() + .statusCode(200).extract() + .jsonPath().getList(".", Reservation.class); + + Integer count = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); + + assertThat(reservations.size()).isEqualTo(count); + } + + @Test + void 칠단계() { + Map params = new HashMap<>(); + params.put("name", "브라운"); + params.put("date", "2023-08-05"); + params.put("time", "10:00"); + + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(params) + .when().post("/reservations") + .then().log().all() + .statusCode(201) + .header("Location", "/reservations/1"); + + Integer count = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); + assertThat(count).isEqualTo(1); + + RestAssured.given().log().all() + .when().delete("/reservations/1") + .then().log().all() + .statusCode(204); + + Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); + assertThat(countAfterDelete).isEqualTo(0); + } } \ No newline at end of file From a1631a9cc4d441acf3d3ee4b989bfc7e72c22294 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 20 May 2024 18:17:08 +0900 Subject: [PATCH 12/21] =?UTF-8?q?feat:=207=EB=8B=A8=EA=B3=84=20insert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 38 +++++++++---------- .../domain/ReservationRepository.java | 19 ++++++++++ src/main/java/roomescape/dto/Reservation.java | 3 ++ src/test/java/roomescape/ReservationTest.java | 14 +++---- 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 848a2a64e..d2caf9009 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -2,21 +2,19 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import roomescape.domain.ReservationRepository; import roomescape.domain.exception.NotFoundReservationException; import roomescape.dto.Reservation; import java.net.URI; -import java.util.ArrayList; import java.util.List; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicLong; @Controller public class ReservationController { - private final List reservations = new ArrayList<>(); - private final AtomicLong index = new AtomicLong(1); private ReservationRepository reservationRepository; public ReservationController(ReservationRepository reservationRepository) { @@ -24,31 +22,29 @@ public ReservationController(ReservationRepository reservationRepository) { } @GetMapping("/reservations") - public ResponseEntity> getReservations(){ + public ResponseEntity> getReservations() { final List reservations = reservationRepository.findReservation(); return ResponseEntity.ok().body(reservations); } @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody Reservation reservation) { - Reservation newReservation = Reservation.toEntity((int) index.getAndIncrement(), reservation); - - reservations.add(newReservation); + Reservation newReservation = reservationRepository.insertReservation(reservation); return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } - @DeleteMapping("/reservations/{id}") - public ResponseEntity deleteReservation(@PathVariable int id) { - Reservation reservation = reservations.stream() - .filter(it -> Objects.equals(it.getId(), id)) - .findFirst() - .orElseThrow(() -> new NotFoundReservationException("삭제할 ID" + id + "가 존재하지 않습니다.")); - - reservations.remove(reservation); - - return ResponseEntity.noContent().build(); - } +// @DeleteMapping("/reservations/{id}") +// public ResponseEntity deleteReservation(@PathVariable int id) { +// Reservation reservation = reservations.stream() +// .filter(it -> Objects.equals(it.getId(), id)) +// .findFirst() +// .orElseThrow(() -> new NotFoundReservationException("삭제할 ID" + id + "가 존재하지 않습니다.")); +// +// reservations.remove(reservation); +// +// return ResponseEntity.noContent().build(); +// } @ExceptionHandler(NotFoundReservationException.class) public ResponseEntity handleException(NotFoundReservationException e) { diff --git a/src/main/java/roomescape/domain/ReservationRepository.java b/src/main/java/roomescape/domain/ReservationRepository.java index 353d224c3..dce8906c3 100644 --- a/src/main/java/roomescape/domain/ReservationRepository.java +++ b/src/main/java/roomescape/domain/ReservationRepository.java @@ -1,9 +1,12 @@ package roomescape.domain; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import roomescape.dto.Reservation; +import java.sql.PreparedStatement; import java.util.List; @Repository @@ -27,4 +30,20 @@ public List findReservation() { ) ); } + + public Reservation insertReservation(Reservation reservation) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "insert into reservation (name, date, time) values (?, ?, ?)", + new String[]{"id"}); + ps.setString(1, reservation.getName()); + ps.setString(2, reservation.getDate()); + ps.setString(3, reservation.getTime()); + return ps; + }, keyHolder); + + return new Reservation((int)keyHolder.getKey().longValue(), reservation.getName(), reservation.getDate(), reservation.getTime()); + } + } \ No newline at end of file diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index a4404ba1b..0c86fa93d 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -13,6 +13,9 @@ public class Reservation { private String date; private String time; + public Reservation() { + } + public Reservation(String name, String date, String time) { validateEmpty(name); validateDate(date); diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java index 7d00ff076..2942e0732 100644 --- a/src/test/java/roomescape/ReservationTest.java +++ b/src/test/java/roomescape/ReservationTest.java @@ -69,12 +69,12 @@ public class ReservationTest { Integer count = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); assertThat(count).isEqualTo(1); - RestAssured.given().log().all() - .when().delete("/reservations/1") - .then().log().all() - .statusCode(204); - - Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); - assertThat(countAfterDelete).isEqualTo(0); +// RestAssured.given().log().all() +// .when().delete("/reservations/1") +// .then().log().all() +// .statusCode(204); +// +// Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); +// assertThat(countAfterDelete).isEqualTo(0); } } \ No newline at end of file From 80a433a1826b2c4bf86c8960c913a9e8a68341d7 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 20 May 2024 18:20:35 +0900 Subject: [PATCH 13/21] =?UTF-8?q?feat:=207=EB=8B=A8=EA=B3=84=20delete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 22 ++++++------------- .../domain/ReservationRepository.java | 6 ++++- src/test/java/roomescape/ReservationTest.java | 14 ++++++------ 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index d2caf9009..d1e687c30 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -2,10 +2,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.*; import roomescape.domain.ReservationRepository; import roomescape.domain.exception.NotFoundReservationException; import roomescape.dto.Reservation; @@ -34,17 +31,12 @@ public ResponseEntity createReservation(@RequestBody Reservation re return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } -// @DeleteMapping("/reservations/{id}") -// public ResponseEntity deleteReservation(@PathVariable int id) { -// Reservation reservation = reservations.stream() -// .filter(it -> Objects.equals(it.getId(), id)) -// .findFirst() -// .orElseThrow(() -> new NotFoundReservationException("삭제할 ID" + id + "가 존재하지 않습니다.")); -// -// reservations.remove(reservation); -// -// return ResponseEntity.noContent().build(); -// } + @DeleteMapping("/reservations/{id}") + public ResponseEntity deleteReservation(@PathVariable int id) { + reservationRepository.deleteReservation(id); + + return ResponseEntity.noContent().build(); + } @ExceptionHandler(NotFoundReservationException.class) public ResponseEntity handleException(NotFoundReservationException e) { diff --git a/src/main/java/roomescape/domain/ReservationRepository.java b/src/main/java/roomescape/domain/ReservationRepository.java index dce8906c3..529fcab0d 100644 --- a/src/main/java/roomescape/domain/ReservationRepository.java +++ b/src/main/java/roomescape/domain/ReservationRepository.java @@ -43,7 +43,11 @@ public Reservation insertReservation(Reservation reservation) { return ps; }, keyHolder); - return new Reservation((int)keyHolder.getKey().longValue(), reservation.getName(), reservation.getDate(), reservation.getTime()); + return new Reservation((int) keyHolder.getKey().longValue(), reservation.getName(), reservation.getDate(), reservation.getTime()); } + public int deleteReservation(int id) { + String sql = "delete from reservation where id = ?"; + return jdbcTemplate.update(sql, id); + } } \ No newline at end of file diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java index 2942e0732..7d00ff076 100644 --- a/src/test/java/roomescape/ReservationTest.java +++ b/src/test/java/roomescape/ReservationTest.java @@ -69,12 +69,12 @@ public class ReservationTest { Integer count = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); assertThat(count).isEqualTo(1); -// RestAssured.given().log().all() -// .when().delete("/reservations/1") -// .then().log().all() -// .statusCode(204); -// -// Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); -// assertThat(countAfterDelete).isEqualTo(0); + RestAssured.given().log().all() + .when().delete("/reservations/1") + .then().log().all() + .statusCode(204); + + Integer countAfterDelete = jdbcTemplate.queryForObject("SELECT count(1) from reservation", Integer.class); + assertThat(countAfterDelete).isEqualTo(0); } } \ No newline at end of file From 5490e90aaaf389aee1ba45379192e0b4cfb35d96 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 20 May 2024 18:54:01 +0900 Subject: [PATCH 14/21] =?UTF-8?q?feat:=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/controller/ReservationController.java | 2 +- src/main/java/roomescape/dto/Reservation.java | 2 +- .../{domain => }/exception/NotFoundReservationException.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/roomescape/{domain => }/exception/NotFoundReservationException.java (81%) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index d1e687c30..228647533 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.domain.ReservationRepository; -import roomescape.domain.exception.NotFoundReservationException; +import roomescape.exception.NotFoundReservationException; import roomescape.dto.Reservation; import java.net.URI; diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 0c86fa93d..6e8141842 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -1,6 +1,6 @@ package roomescape.dto; -import roomescape.domain.exception.NotFoundReservationException; +import roomescape.exception.NotFoundReservationException; import java.time.LocalDate; import java.time.LocalTime; diff --git a/src/main/java/roomescape/domain/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java similarity index 81% rename from src/main/java/roomescape/domain/exception/NotFoundReservationException.java rename to src/main/java/roomescape/exception/NotFoundReservationException.java index 13929bb45..c1270a896 100644 --- a/src/main/java/roomescape/domain/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.domain.exception; +package roomescape.exception; public class NotFoundReservationException extends RuntimeException { public NotFoundReservationException(String message) { From 0c312a69b3b304989c7e9797bcf04455d119cfe9 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Tue, 21 May 2024 15:20:39 +0900 Subject: [PATCH 15/21] =?UTF-8?q?refactor:=20Repository=20=EB=AA=85?= =?UTF-8?q?=EB=AA=85=EB=B2=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/controller/ReservationController.java | 6 +++--- src/main/java/roomescape/domain/ReservationRepository.java | 6 +++--- src/test/java/roomescape/ReservationTest.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 228647533..766b707f9 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -20,20 +20,20 @@ public ReservationController(ReservationRepository reservationRepository) { @GetMapping("/reservations") public ResponseEntity> getReservations() { - final List reservations = reservationRepository.findReservation(); + final List reservations = reservationRepository.findAll(); return ResponseEntity.ok().body(reservations); } @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody Reservation reservation) { - Reservation newReservation = reservationRepository.insertReservation(reservation); + Reservation newReservation = reservationRepository.save(reservation); return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); } @DeleteMapping("/reservations/{id}") public ResponseEntity deleteReservation(@PathVariable int id) { - reservationRepository.deleteReservation(id); + reservationRepository.delete(id); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/roomescape/domain/ReservationRepository.java b/src/main/java/roomescape/domain/ReservationRepository.java index 529fcab0d..22baa1706 100644 --- a/src/main/java/roomescape/domain/ReservationRepository.java +++ b/src/main/java/roomescape/domain/ReservationRepository.java @@ -17,7 +17,7 @@ public ReservationRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } - public List findReservation() { + public List findAll() { return jdbcTemplate.query( "select * from reservation", @@ -31,7 +31,7 @@ public List findReservation() { ); } - public Reservation insertReservation(Reservation reservation) { + public Reservation save(Reservation reservation) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement( @@ -46,7 +46,7 @@ public Reservation insertReservation(Reservation reservation) { return new Reservation((int) keyHolder.getKey().longValue(), reservation.getName(), reservation.getDate(), reservation.getTime()); } - public int deleteReservation(int id) { + public int delete(int id) { String sql = "delete from reservation where id = ?"; return jdbcTemplate.update(sql, id); } diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java index 7d00ff076..48d151f56 100644 --- a/src/test/java/roomescape/ReservationTest.java +++ b/src/test/java/roomescape/ReservationTest.java @@ -37,7 +37,7 @@ public class ReservationTest { @Test void 육단계() { - jdbcTemplate.update("INSERT INTO reservation (name, date, time) VALUES (?, ?, ?)", "브라운", "2023-08-05", "15:40"); + jdbcTemplate.update("INSERT INTO reservation (name, date, time) VALUES (?, ?, ?)", "브라운", "2023-08-05", "15:40"); List reservations = RestAssured.given().log().all() From 3c62160d59522dc868a71fa656ceea98d958b7c5 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Tue, 21 May 2024 15:32:43 +0900 Subject: [PATCH 16/21] =?UTF-8?q?refactor:=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/dto/Reservation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/dto/Reservation.java index 6e8141842..b07b17e9b 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/dto/Reservation.java @@ -90,7 +90,7 @@ private void validateDate(String dateString) { } private void validateTime(String timeString) { - DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:MM"); + DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); try { LocalTime.parse(timeString, TIME_FORMATTER); From 39e0e70d3ee8cfa94e1570bef9e6db76cad64149 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Wed, 22 May 2024 17:20:32 +0900 Subject: [PATCH 17/21] =?UTF-8?q?refactor:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95,=20dao=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/controller/ReservationController.java | 4 ++-- .../roomescape/{domain => dao}/ReservationRepository.java | 4 ++-- src/main/java/roomescape/{dto => domain}/Reservation.java | 2 +- src/test/java/roomescape/ReservationTest.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/roomescape/{domain => dao}/ReservationRepository.java (96%) rename src/main/java/roomescape/{dto => domain}/Reservation.java (98%) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 766b707f9..df10faf79 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -3,9 +3,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import roomescape.domain.ReservationRepository; +import roomescape.dao.ReservationRepository; import roomescape.exception.NotFoundReservationException; -import roomescape.dto.Reservation; +import roomescape.domain.Reservation; import java.net.URI; import java.util.List; diff --git a/src/main/java/roomescape/domain/ReservationRepository.java b/src/main/java/roomescape/dao/ReservationRepository.java similarity index 96% rename from src/main/java/roomescape/domain/ReservationRepository.java rename to src/main/java/roomescape/dao/ReservationRepository.java index 22baa1706..58b75c3cd 100644 --- a/src/main/java/roomescape/domain/ReservationRepository.java +++ b/src/main/java/roomescape/dao/ReservationRepository.java @@ -1,10 +1,10 @@ -package roomescape.domain; +package roomescape.dao; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import roomescape.dto.Reservation; +import roomescape.domain.Reservation; import java.sql.PreparedStatement; import java.util.List; diff --git a/src/main/java/roomescape/dto/Reservation.java b/src/main/java/roomescape/domain/Reservation.java similarity index 98% rename from src/main/java/roomescape/dto/Reservation.java rename to src/main/java/roomescape/domain/Reservation.java index b07b17e9b..18f81f488 100644 --- a/src/main/java/roomescape/dto/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -1,4 +1,4 @@ -package roomescape.dto; +package roomescape.domain; import roomescape.exception.NotFoundReservationException; diff --git a/src/test/java/roomescape/ReservationTest.java b/src/test/java/roomescape/ReservationTest.java index 48d151f56..36d501d33 100644 --- a/src/test/java/roomescape/ReservationTest.java +++ b/src/test/java/roomescape/ReservationTest.java @@ -7,7 +7,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.annotation.DirtiesContext; -import roomescape.dto.Reservation; +import roomescape.domain.Reservation; import java.sql.Connection; import java.sql.SQLException; From aef90c1bd59284a9463aa0bd755ba331e842d3b5 Mon Sep 17 00:00:00 2001 From: anhye0n Date: Mon, 27 May 2024 20:48:55 +0900 Subject: [PATCH 18/21] =?UTF-8?q?feat:=208=EB=8B=A8=EA=B3=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/controller/TimeController.java | 50 ++++++++++++++++++ .../java/roomescape/dao/TimeRepository.java | 51 +++++++++++++++++++ src/main/java/roomescape/domain/Time.java | 37 ++++++++++++++ src/main/resources/schema.sql | 7 +++ src/test/java/roomescape/TimeTest.java | 40 +++++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 src/main/java/roomescape/controller/TimeController.java create mode 100644 src/main/java/roomescape/dao/TimeRepository.java create mode 100644 src/main/java/roomescape/domain/Time.java create mode 100644 src/test/java/roomescape/TimeTest.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..e22dbc5a7 --- /dev/null +++ b/src/main/java/roomescape/controller/TimeController.java @@ -0,0 +1,50 @@ +package roomescape.controller; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import roomescape.dao.TimeRepository; +import roomescape.domain.Time; +import roomescape.exception.NotFoundReservationException; + +import java.net.URI; +import java.util.List; + +@Controller +public class TimeController { + + private TimeRepository timeRepository; + + public TimeController(TimeRepository timeRepository) { + this.timeRepository = timeRepository; + } + + @GetMapping("/times") + public ResponseEntity> getTimeInformation() { + final List