From 19e8b425a9726c5394bfa1602ea64862b12b037e Mon Sep 17 00:00:00 2001 From: ZinYan Date: Thu, 13 Nov 2025 14:05:18 +0900 Subject: [PATCH 1/8] =?UTF-8?q?dependency=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 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' } From ac19b5661396ffa296e2376d00be49e3ad3ddd77 Mon Sep 17 00:00:00 2001 From: ZinYan Date: Sat, 4 Oct 2025 23:45:41 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=ED=99=88=20=ED=99=94=EB=A9=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/HomeController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/roomescape/HomeController.java diff --git a/src/main/java/roomescape/HomeController.java b/src/main/java/roomescape/HomeController.java new file mode 100644 index 000000000..e61379f36 --- /dev/null +++ b/src/main/java/roomescape/HomeController.java @@ -0,0 +1,13 @@ +package roomescape; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String home() { + return "home"; + } +} \ No newline at end of file From 2b345ce05babe429fbe208de79eb8d07707eda61 Mon Sep 17 00:00:00 2001 From: ZinYan Date: Sat, 4 Oct 2025 23:50:25 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EC=98=88=EC=95=BD=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/Reservation.java | 4 +++ .../roomescape/ReservationController.java | 34 +++++++++++++++++++ src/test/java/roomescape/MissionStepTest.java | 16 +++++++++ 3 files changed, 54 insertions(+) create mode 100644 src/main/java/roomescape/Reservation.java create mode 100644 src/main/java/roomescape/ReservationController.java diff --git a/src/main/java/roomescape/Reservation.java b/src/main/java/roomescape/Reservation.java new file mode 100644 index 000000000..0e2500418 --- /dev/null +++ b/src/main/java/roomescape/Reservation.java @@ -0,0 +1,4 @@ +package roomescape; + + +public record Reservation(long id, String name, String date, String time) {} \ No newline at end of file diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java new file mode 100644 index 000000000..af43b0920 --- /dev/null +++ b/src/main/java/roomescape/ReservationController.java @@ -0,0 +1,34 @@ +package roomescape; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.List; + +@Controller +public class ReservationController { + + // Temporary data + private final List reservations = new ArrayList<>( + List.of( + new Reservation(1L, "브라운", "2023-01-01", "10:00"), + new Reservation(2L, "브라운", "2023-01-02", "11:00"), + new Reservation(3L, "브라운", "2023-01-03", "12:00") + ) + ); + + // render reservation.html + @GetMapping("/reservation") + public String reservationPage() { + return "reservation"; + } + + // JSON list + @GetMapping("/reservations") + @ResponseBody + public List list() { + return reservations; + } +} diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index cf4efbe91..6c8dcef57 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -5,6 +5,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; +import static org.hamcrest.Matchers.is; + @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class MissionStepTest { @@ -16,4 +18,18 @@ public class MissionStepTest { .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)); + } } From 1c551e9662f8ae7a96ce77bd44018c1058b752b2 Mon Sep 17 00:00:00 2001 From: ZinYan Date: Thu, 13 Nov 2025 05:45:57 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EC=98=88=EC=95=BD=20=EC=B6=94=EA=B0=80=20/?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/Reservation.java | 44 +++++++++++++++++- .../roomescape/ReservationController.java | 45 +++++++++++++------ src/test/java/roomescape/MissionStepTest.java | 38 ++++++++++++++++ 3 files changed, 112 insertions(+), 15 deletions(-) diff --git a/src/main/java/roomescape/Reservation.java b/src/main/java/roomescape/Reservation.java index 0e2500418..2f6f28111 100644 --- a/src/main/java/roomescape/Reservation.java +++ b/src/main/java/roomescape/Reservation.java @@ -1,4 +1,46 @@ package roomescape; -public record Reservation(long id, String name, String date, String time) {} \ No newline at end of file +public class Reservation{ + private Long id; + private String name; + private String date; + private 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 Reservation(String name,String date,String time){ + this.name = name; + this.date = date; + this.time = time; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } + + public static Reservation toEntity(Reservation reservation,Long id){ + return new Reservation(id,reservation.name,reservation.date,reservation.time); + } + + +} \ No newline at end of file diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java index af43b0920..0b2eb91b7 100644 --- a/src/main/java/roomescape/ReservationController.java +++ b/src/main/java/roomescape/ReservationController.java @@ -1,34 +1,51 @@ package roomescape; +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 org.springframework.web.bind.annotation.*; +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 { - // Temporary data - private final List reservations = new ArrayList<>( - List.of( - new Reservation(1L, "브라운", "2023-01-01", "10:00"), - new Reservation(2L, "브라운", "2023-01-02", "11:00"), - new Reservation(3L, "브라운", "2023-01-03", "12:00") - ) - ); + private final List reservations = new ArrayList<>(); + private final AtomicLong index =new AtomicLong(1); - // render reservation.html + // render @GetMapping("/reservation") public String reservationPage() { return "reservation"; } - // JSON list + // Read @GetMapping("/reservations") @ResponseBody - public List list() { - return reservations; + public ResponseEntity> list() { + return ResponseEntity.ok().body(reservations); } + + // Create + @PostMapping("/reservations") + public ResponseEntity add_reservation(@RequestBody Reservation reservation){ + Reservation newReservation = Reservation.toEntity(reservation,index.getAndIncrement()); + reservations.add(newReservation); + return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); + } + + // Delete + @DeleteMapping("/reservations/{id}") + public ResponseEntity cancel_reservation(@PathVariable Long id){ + Reservation newReservation = reservations.stream() + .filter(it-> Objects.equals(it.getId(),id)) + .findFirst() + .orElseThrow(RuntimeException::new); + reservations.remove(newReservation); + return ResponseEntity.noContent().build(); + } + } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 6c8dcef57..9edf0554e 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -1,10 +1,14 @@ package roomescape; import io.restassured.RestAssured; +import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; +import java.util.HashMap; +import java.util.Map; + import static org.hamcrest.Matchers.is; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @@ -32,4 +36,38 @@ public class MissionStepTest { .statusCode(200) .body("size()", is(3)); } + + @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 ac9965693945a2de987ec1b1a07651938354abd0 Mon Sep 17 00:00:00 2001 From: ZinYan Date: Thu, 13 Nov 2025 13:06:52 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/ReservationController.java | 23 +++++++++++++++++-- src/test/java/roomescape/MissionStepTest.java | 22 ++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java index 0b2eb91b7..c97133bb8 100644 --- a/src/main/java/roomescape/ReservationController.java +++ b/src/main/java/roomescape/ReservationController.java @@ -10,6 +10,8 @@ import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; +import static org.apache.logging.log4j.util.Strings.isBlank; + @Controller public class ReservationController { @@ -32,6 +34,12 @@ public ResponseEntity> list() { // Create @PostMapping("/reservations") public ResponseEntity add_reservation(@RequestBody Reservation reservation){ + // handle exception -> any required field empty + if(isBlank(reservation.getName()) || isBlank(reservation.getDate()) || isBlank(reservation.getTime())){ + throw new BadRequestReservationException(); + } + + Reservation newReservation = Reservation.toEntity(reservation,index.getAndIncrement()); reservations.add(newReservation); return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); @@ -40,12 +48,23 @@ public ResponseEntity add_reservation(@RequestBody Reservation rese // Delete @DeleteMapping("/reservations/{id}") public ResponseEntity cancel_reservation(@PathVariable Long id){ + + Reservation newReservation = reservations.stream() - .filter(it-> Objects.equals(it.getId(),id)) + .filter(it-> Objects.equals(it.getId(),id)) .findFirst() - .orElseThrow(RuntimeException::new); + //handle exception -> reservation is not found + .orElseThrow(NotFoundReservationException::new); reservations.remove(newReservation); return ResponseEntity.noContent().build(); } + // Exception Handler + public class NotFoundReservationException extends RuntimeException {} + public class BadRequestReservationException extends RuntimeException {} + @ExceptionHandler({BadRequestReservationException.class, NotFoundReservationException.class}) + public ResponseEntity handleBadRequest(RuntimeException e){ + return ResponseEntity.badRequest().build(); + } + } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 9edf0554e..69c8148b3 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -70,4 +70,26 @@ 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 f7174df5f99295bfa37accf39dc3b699377acbe2 Mon Sep 17 00:00:00 2001 From: ZinYan Date: Sat, 15 Nov 2025 01:34:19 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=A0=81=EC=9A=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ src/main/resources/application.properties | 6 ++++++ src/main/resources/schema.sql | 8 ++++++++ src/test/java/roomescape/MissionStepTest.java | 20 +++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 src/main/resources/schema.sql diff --git a/build.gradle b/build.gradle index 40a581b15..a2b19928d 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,8 @@ dependencies { 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' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' } test { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb..da7e2520a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,6 @@ +# enable h2-console +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console + +# in-memory db named "database" +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..8d9ab2754 --- /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) +); diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 69c8148b3..8d12b43c5 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -3,11 +3,16 @@ 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.test.annotation.DirtiesContext; +import java.sql.Connection; import java.util.HashMap; import java.util.Map; +import org.springframework.jdbc.core.JdbcTemplate; +import java.sql.SQLException; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.is; @@ -92,4 +97,19 @@ public class MissionStepTest { .then().log().all() .statusCode(400); } + + @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); + } + } + } From 66ad9854faf4afe892b9a25347ef8b2d1c896c2e Mon Sep 17 00:00:00 2001 From: ZinYan Date: Sat, 15 Nov 2025 02:13:42 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/ReservationController.java | 22 +++++++++++++++++-- src/test/java/roomescape/MissionStepTest.java | 17 ++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java index c97133bb8..14cc9031d 100644 --- a/src/main/java/roomescape/ReservationController.java +++ b/src/main/java/roomescape/ReservationController.java @@ -1,6 +1,8 @@ package roomescape; import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -18,17 +20,33 @@ public class ReservationController { private final List reservations = new ArrayList<>(); private final AtomicLong index =new AtomicLong(1); + private JdbcTemplate jdbcTemplate; + public ReservationController(JdbcTemplate jdbcTemplate){ + this.jdbcTemplate = jdbcTemplate; + } + // render @GetMapping("/reservation") public String reservationPage() { return "reservation"; } + // RowMapper + private final RowMapper rowMapper = (resultSet, rowNum) -> + new Reservation( + resultSet.getLong("id"), + resultSet.getString("name"), + resultSet.getString("date"), + resultSet.getString("time") + ); + + // Read @GetMapping("/reservations") @ResponseBody - public ResponseEntity> list() { - return ResponseEntity.ok().body(reservations); + public List findAllReservations() { + String sql = "select id,name,date,time from reservation"; + return jdbcTemplate.query(sql,rowMapper); } // Create diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index 8d12b43c5..f7246f6cc 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -9,6 +9,7 @@ import java.sql.Connection; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.springframework.jdbc.core.JdbcTemplate; import java.sql.SQLException; @@ -112,4 +113,20 @@ public class MissionStepTest { } } + @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); + } + + } From e802c984f65544e1d37e595ecdd858ef181a5d8d Mon Sep 17 00:00:00 2001 From: ZinYan Date: Sat, 15 Nov 2025 02:53:24 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80/=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/ReservationController.java | 43 +++++++++++++------ src/test/java/roomescape/MissionStepTest.java | 27 ++++++++++++ 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java index 14cc9031d..e6153459d 100644 --- a/src/main/java/roomescape/ReservationController.java +++ b/src/main/java/roomescape/ReservationController.java @@ -3,10 +3,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.net.URI; +import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -17,9 +20,6 @@ @Controller public class ReservationController { - private final List reservations = new ArrayList<>(); - private final AtomicLong index =new AtomicLong(1); - private JdbcTemplate jdbcTemplate; public ReservationController(JdbcTemplate jdbcTemplate){ this.jdbcTemplate = jdbcTemplate; @@ -57,23 +57,38 @@ public ResponseEntity add_reservation(@RequestBody Reservation rese throw new BadRequestReservationException(); } + String sql = "insert into reservation (name,date,time) values (?,?,?)"; + // Create keyHolder + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update( + connection -> { + PreparedStatement ps = connection.prepareStatement(sql,new String[]{"id"}); + ps.setString(1,reservation.getName()); + ps.setString(2,reservation.getDate()); + ps.setString(3,reservation.getTime()); + return ps; + }, + keyHolder + ); + // Generated id + Long id = keyHolder.getKey().longValue(); - Reservation newReservation = Reservation.toEntity(reservation,index.getAndIncrement()); - reservations.add(newReservation); - return ResponseEntity.created(URI.create("/reservations/" + newReservation.getId())).body(newReservation); + return ResponseEntity.created( + URI.create("/reservations/" + id) + ).build(); } // Delete @DeleteMapping("/reservations/{id}") - public ResponseEntity cancel_reservation(@PathVariable Long id){ + public ResponseEntity cancel_reservation(@PathVariable Long id){ + String sql = "delete from reservation where id = ?"; + int deleted = jdbcTemplate.update(sql,id); - - Reservation newReservation = reservations.stream() - .filter(it-> Objects.equals(it.getId(),id)) - .findFirst() - //handle exception -> reservation is not found - .orElseThrow(NotFoundReservationException::new); - reservations.remove(newReservation); + // handle exception + if (deleted == 0) { + throw new NotFoundReservationException(); + } return ResponseEntity.noContent().build(); } diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index f7246f6cc..93baa69db 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -128,5 +128,32 @@ public class MissionStepTest { 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); + } + }