From d888ea06651482dfdcb58be874c16e3ec63d4326 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 6 Nov 2024 23:55:52 +0900 Subject: [PATCH 01/89] =?UTF-8?q?gradle=20=EC=9D=98=EC=A1=B4=EC=84=B1=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 --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index 57267157c..b98f40f99 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.rest-assured:rest-assured:5.3.1' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + compileOnly 'org.projectlombok:lombok:1.18.28' + annotationProcessor 'org.projectlombok:lombok:1.18.28' } test { useJUnitPlatform() } + From 7adbc1c59403f2e9b02e15e6fcdbae2dec74ede1 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 6 Nov 2024 23:58:24 +0900 Subject: [PATCH 02/89] =?UTF-8?q?=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=91=EB=8B=B5=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 | 14 ++++++++++++++ 1 file changed, 14 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..74dd7682d --- /dev/null +++ b/src/main/java/roomescape/HomeController.java @@ -0,0 +1,14 @@ +package roomescape; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String home(){ + return "home"; + } + +} From a7e7b1cfc29d81fc509a2d4fa9fab548e6ee38c0 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:02:17 +0900 Subject: [PATCH 03/89] =?UTF-8?q?=20=ED=95=B5=EC=8B=AC=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20Reservation=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/Reservation.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/roomescape/Reservation.java diff --git a/src/main/java/roomescape/Reservation.java b/src/main/java/roomescape/Reservation.java new file mode 100644 index 000000000..675a8df05 --- /dev/null +++ b/src/main/java/roomescape/Reservation.java @@ -0,0 +1,23 @@ +package roomescape; + +import lombok.Data; + +@Data +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; + } + +} From 5ffe0d120fbe8ccfe2affcef419db7393b7104cb Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:03:03 +0900 Subject: [PATCH 04/89] =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20ReservationController=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/ReservationController.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/roomescape/ReservationController.java diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/ReservationController.java new file mode 100644 index 000000000..532189f29 --- /dev/null +++ b/src/main/java/roomescape/ReservationController.java @@ -0,0 +1,56 @@ +package roomescape; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import roomescape.exception.MissingReservationDataException; +import roomescape.exception.NotFoundReservationException; + +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 List reservations = new ArrayList<>(); + private AtomicLong index = new AtomicLong(1); + + @GetMapping("/reservation") + public String showReservationPage(){ + return "reservation"; + } + + @GetMapping("/reservations") + @ResponseBody + public ResponseEntity> readReservation(){ + return ResponseEntity.ok(reservations); + } + + @PostMapping("/reservations") + @ResponseBody + public ResponseEntity createReservation(@RequestBody Reservation reservation){ + if (reservation.getName().isEmpty() || reservation.getDate().isEmpty() ||reservation.getTime().isEmpty()){ + throw new MissingReservationDataException("예약 필수 정보가 입력되지 않았습니다."); + } + + reservation.setId(index.getAndIncrement()); + reservations.add(reservation); + + return ResponseEntity.created(URI.create("/reservations/"+reservation.getId())).body(reservation); + } + + @DeleteMapping("/reservations/{id}") + @ResponseBody + public ResponseEntity deleteReservation(@PathVariable Long id){ + Reservation reservation = reservations.stream() + .filter(r -> Objects.equals(r.getId(), id)) + .findFirst() + .orElseThrow(()->new NotFoundReservationException("예악을 찾을 수 없습니다.")); + + reservations.remove(reservation); + return ResponseEntity.noContent().build(); + } +} From 3fce7dde0d1b36716513a26c7a6329d366440afa Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:06:06 +0900 Subject: [PATCH 05/89] =?UTF-8?q?=20=ED=95=84=EC=88=98=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20MissingReservationDat?= =?UTF-8?q?aException=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/MissingReservationDataException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/roomescape/exception/MissingReservationDataException.java diff --git a/src/main/java/roomescape/exception/MissingReservationDataException.java b/src/main/java/roomescape/exception/MissingReservationDataException.java new file mode 100644 index 000000000..35ea111bb --- /dev/null +++ b/src/main/java/roomescape/exception/MissingReservationDataException.java @@ -0,0 +1,7 @@ +package roomescape.exception; + +public class MissingReservationDataException extends RuntimeException{ + public MissingReservationDataException(String message){ + super(message); + } +} From 4e5b6c377a60857ea44b3731f895439bbfd75418 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:07:22 +0900 Subject: [PATCH 06/89] =?UTF-8?q?=20=EC=98=88=EC=95=BD=20=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20NotFoundR?= =?UTF-8?q?eservationException=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/exception/NotFoundReservationException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/roomescape/exception/NotFoundReservationException.java diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java new file mode 100644 index 000000000..7aa02b4fd --- /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); + } +} From 45a30926facc0eb75d1fcd8bc0615337b3db8ac6 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:08:32 +0900 Subject: [PATCH 07/89] =?UTF-8?q?=20=EC=97=90=EC=99=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20GlobalExceptionHandler=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 --- .../exception/GlobalExceptionHandler.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/roomescape/exception/GlobalExceptionHandler.java diff --git a/src/main/java/roomescape/exception/GlobalExceptionHandler.java b/src/main/java/roomescape/exception/GlobalExceptionHandler.java new file mode 100644 index 000000000..df7cc3b40 --- /dev/null +++ b/src/main/java/roomescape/exception/GlobalExceptionHandler.java @@ -0,0 +1,18 @@ +package roomescape.exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler(MissingReservationDataException.class) + public ResponseEntity handleMissingReservationDataException(MissingReservationDataException e){ + return ResponseEntity.badRequest().body(e.getMessage()); + } + + @ExceptionHandler(NotFoundReservationException.class) + public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ + return ResponseEntity.badRequest().body(e.getMessage()); + } +} From 87cd94890ea154852868a53e8538916fecaf5d8d Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Thu, 7 Nov 2024 00:09:32 +0900 Subject: [PATCH 08/89] =?UTF-8?q?=20=EB=AF=B8=EC=85=98=20=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=EB=B3=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- src/test/java/roomescape/MissionStepTest.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/MissionStepTest.java index cf4efbe91..9b27282d4 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/MissionStepTest.java @@ -1,10 +1,16 @@ 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) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class MissionStepTest { @@ -16,4 +22,75 @@ 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(0)); // 아직 생성 요청이 없으니 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)); + } + + @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 f2ceebecd2f34d66ce3479d896d190719eb02224 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:08:46 +0900 Subject: [PATCH 09/89] =?UTF-8?q?=20controller=20pakage=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20ReservationController=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => controller}/HomeController.java | 2 +- .../ReservationController.java | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/roomescape/{ => controller}/HomeController.java (88%) rename src/main/java/roomescape/{ => controller}/ReservationController.java (71%) diff --git a/src/main/java/roomescape/HomeController.java b/src/main/java/roomescape/controller/HomeController.java similarity index 88% rename from src/main/java/roomescape/HomeController.java rename to src/main/java/roomescape/controller/HomeController.java index 74dd7682d..ec703e92b 100644 --- a/src/main/java/roomescape/HomeController.java +++ b/src/main/java/roomescape/controller/HomeController.java @@ -1,4 +1,4 @@ -package roomescape; +package roomescape.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/roomescape/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java similarity index 71% rename from src/main/java/roomescape/ReservationController.java rename to src/main/java/roomescape/controller/ReservationController.java index 532189f29..ec517e7a4 100644 --- a/src/main/java/roomescape/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -1,9 +1,11 @@ -package roomescape; +package roomescape.controller; +import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -import roomescape.exception.MissingReservationDataException; +import roomescape.domain.Reservation; +import roomescape.dto.ReservationDto; import roomescape.exception.NotFoundReservationException; import java.net.URI; @@ -24,31 +26,29 @@ public String showReservationPage(){ } @GetMapping("/reservations") - @ResponseBody public ResponseEntity> readReservation(){ return ResponseEntity.ok(reservations); } @PostMapping("/reservations") - @ResponseBody - public ResponseEntity createReservation(@RequestBody Reservation reservation){ - if (reservation.getName().isEmpty() || reservation.getDate().isEmpty() ||reservation.getTime().isEmpty()){ - throw new MissingReservationDataException("예약 필수 정보가 입력되지 않았습니다."); - } - - reservation.setId(index.getAndIncrement()); + public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto){ + Reservation reservation = new Reservation( + index.getAndIncrement(), + reservationDto.getName(), + reservationDto.getDate(), + reservationDto.getTime() + ); reservations.add(reservation); return ResponseEntity.created(URI.create("/reservations/"+reservation.getId())).body(reservation); } @DeleteMapping("/reservations/{id}") - @ResponseBody public ResponseEntity deleteReservation(@PathVariable Long id){ Reservation reservation = reservations.stream() .filter(r -> Objects.equals(r.getId(), id)) .findFirst() - .orElseThrow(()->new NotFoundReservationException("예악을 찾을 수 없습니다.")); + .orElseThrow(()->new NotFoundReservationException()); reservations.remove(reservation); return ResponseEntity.noContent().build(); From 0ce07cb3cdb2dc6153d977996189c62eb2fb78f3 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:11:00 +0900 Subject: [PATCH 10/89] =?UTF-8?q?=20domain=20package=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/{ => domain}/Reservation.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) rename src/main/java/roomescape/{ => domain}/Reservation.java (54%) diff --git a/src/main/java/roomescape/Reservation.java b/src/main/java/roomescape/domain/Reservation.java similarity index 54% rename from src/main/java/roomescape/Reservation.java rename to src/main/java/roomescape/domain/Reservation.java index 675a8df05..1577b6de3 100644 --- a/src/main/java/roomescape/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -1,17 +1,14 @@ -package roomescape; +package roomescape.domain; -import lombok.Data; +import lombok.Getter; -@Data +@Getter public class Reservation { - private Long id; - private String name; - private String date; - private String time; - - public Reservation() { - } + private final Long id; + private final String name; + private final String date; + private final String time; public Reservation(Long id, String name, String date, String time) { this.id = id; From b80921f93e54a705b9cd9911832dca527bc4ab42 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:12:16 +0900 Subject: [PATCH 11/89] =?UTF-8?q?=20dto=20package=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=98=88=EC=95=BD=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/dto/ReservationDto.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/roomescape/dto/ReservationDto.java diff --git a/src/main/java/roomescape/dto/ReservationDto.java b/src/main/java/roomescape/dto/ReservationDto.java new file mode 100644 index 000000000..4b75d8392 --- /dev/null +++ b/src/main/java/roomescape/dto/ReservationDto.java @@ -0,0 +1,20 @@ +package roomescape.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ReservationDto { + + @NotBlank(message = "예약자 이름을 입력하세요.") + private String name; + + @NotBlank(message = "예약 날짜를 입력하세요.") + private String date; + + @NotBlank(message = "예약 시간을 입력하세요.") + private String time; + +} From b5096b76fab98da081e8dca3a26bbc6aababb8cd Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:16:11 +0900 Subject: [PATCH 12/89] =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EB=B0=A9=EB=B2=95=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20Handler=20?= =?UTF-8?q?=EC=9E=AC=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 18 ------------------ .../MissingReservationDataException.java | 7 ------- 2 files changed, 25 deletions(-) delete mode 100644 src/main/java/roomescape/exception/GlobalExceptionHandler.java delete mode 100644 src/main/java/roomescape/exception/MissingReservationDataException.java diff --git a/src/main/java/roomescape/exception/GlobalExceptionHandler.java b/src/main/java/roomescape/exception/GlobalExceptionHandler.java deleted file mode 100644 index df7cc3b40..000000000 --- a/src/main/java/roomescape/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package roomescape.exception; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -@ControllerAdvice -public class GlobalExceptionHandler { - @ExceptionHandler(MissingReservationDataException.class) - public ResponseEntity handleMissingReservationDataException(MissingReservationDataException e){ - return ResponseEntity.badRequest().body(e.getMessage()); - } - - @ExceptionHandler(NotFoundReservationException.class) - public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ - return ResponseEntity.badRequest().body(e.getMessage()); - } -} diff --git a/src/main/java/roomescape/exception/MissingReservationDataException.java b/src/main/java/roomescape/exception/MissingReservationDataException.java deleted file mode 100644 index 35ea111bb..000000000 --- a/src/main/java/roomescape/exception/MissingReservationDataException.java +++ /dev/null @@ -1,7 +0,0 @@ -package roomescape.exception; - -public class MissingReservationDataException extends RuntimeException{ - public MissingReservationDataException(String message){ - super(message); - } -} From 272e63386046dbfb8978ecfd01467b4d63bc27e6 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:19:19 +0900 Subject: [PATCH 13/89] =?UTF-8?q?=20dto=20=EB=82=B4=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=EB=A5=BC=20?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=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 b98f40f99..b84d87a5d 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' compileOnly 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28' + + implementation 'org.springframework.boot:spring-boot-starter-validation' } test { From e3ce304aa7337919a84272c2ad298b1c37f09524 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:21:46 +0900 Subject: [PATCH 14/89] =?UTF-8?q?=20=EC=99=B8=EB=B6=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=98=88=EC=99=B8=EB=A9=94=EC=84=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=84=EB=8B=AC=ED=95=98=EB=8A=94=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=EC=97=90=EC=84=9C=20=EA=B8=B0=EB=B3=B8=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A9=94=EC=84=B8=EC=A7=80=EB=A5=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A7=80=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/exception/NotFoundReservationException.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java index 7aa02b4fd..33a4bdecd 100644 --- a/src/main/java/roomescape/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/exception/NotFoundReservationException.java @@ -1,7 +1,10 @@ package roomescape.exception; public class NotFoundReservationException extends RuntimeException{ - public NotFoundReservationException(String message){ - super(message); + + private static final String NOT_FOUND_RESERVATION_MESSAGE = "예악을 찾을 수 없습니다."; + + public NotFoundReservationException(){ + super(NOT_FOUND_RESERVATION_MESSAGE); } } From 285504413387f618b1408e5bccfa921eef0a3286 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:23:09 +0900 Subject: [PATCH 15/89] =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=20=EC=9D=BC=EB=B6=80=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20Reservation=EC=97=90?= =?UTF-8?q?=20=EA=B4=80=ED=95=9C=20=EC=98=88=EC=99=B8=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReservationExceptionHandler.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/roomescape/exception/ReservationExceptionHandler.java diff --git a/src/main/java/roomescape/exception/ReservationExceptionHandler.java b/src/main/java/roomescape/exception/ReservationExceptionHandler.java new file mode 100644 index 000000000..cd6bbd3e0 --- /dev/null +++ b/src/main/java/roomescape/exception/ReservationExceptionHandler.java @@ -0,0 +1,33 @@ +package roomescape.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@ControllerAdvice(basePackages = "roomescape.controller") +public class ReservationExceptionHandler { + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException e) { + Map errors = new HashMap<>(); + + for (FieldError error : e.getBindingResult().getFieldErrors()) { + errors.put(error.getField(), error.getDefaultMessage()); + log.info("validation error on field {} : {}", error.getField(),error.getDefaultMessage()); + } + + return ResponseEntity.badRequest().body(errors); + } + + @ExceptionHandler(NotFoundReservationException.class) + public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ + return ResponseEntity.badRequest().body(e.getMessage()); + } +} From 4c61b9ad78ecf8a73968b4ab2f3dfc32d36703ae Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 11:24:06 +0900 Subject: [PATCH 16/89] - --- src/main/java/roomescape/RoomescapeApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/roomescape/RoomescapeApplication.java b/src/main/java/roomescape/RoomescapeApplication.java index 702706791..2ca0f743f 100644 --- a/src/main/java/roomescape/RoomescapeApplication.java +++ b/src/main/java/roomescape/RoomescapeApplication.java @@ -8,5 +8,4 @@ public class RoomescapeApplication { public static void main(String[] args) { SpringApplication.run(RoomescapeApplication.class, args); } - } From 3262ef2f3de8bef3fcde0bbb4fa248d76ef922b4 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:27:28 +0900 Subject: [PATCH 17/89] =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EB=82=B4=20final=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/domain/Reservation.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/domain/Reservation.java index 1577b6de3..cca6e0a2f 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -5,12 +5,12 @@ @Getter public class Reservation { - private final Long id; - private final String name; - private final String date; - private final String time; + private Long id; + private String name; + private String date; + private String time; - public Reservation(Long id, String name, String date, String time) { + public Reservation(Long id,String name, String date, String time) { this.id = id; this.name = name; this.date = date; From 8254291e16a8fcea7219b38ab1aa61358140ff70 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:28:12 +0900 Subject: [PATCH 18/89] =?UTF-8?q?=20Dto=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?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/java/roomescape/dto/ReservationDto.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/roomescape/dto/ReservationDto.java b/src/main/java/roomescape/dto/ReservationDto.java index 4b75d8392..69a4c9d48 100644 --- a/src/main/java/roomescape/dto/ReservationDto.java +++ b/src/main/java/roomescape/dto/ReservationDto.java @@ -17,4 +17,12 @@ public class ReservationDto { @NotBlank(message = "예약 시간을 입력하세요.") private String time; + public ReservationDto() { + } + + public ReservationDto(String name, String date, String time) { + this.name = name; + this.date = date; + this.time = time; + } } From b74779588827690a6330ecc524f97a1d694df36e Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:29:41 +0900 Subject: [PATCH 19/89] =?UTF-8?q?=20=EC=98=88=EC=95=BD=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20Repository=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ReservationRepository.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/roomescape/repository/ReservationRepository.java diff --git a/src/main/java/roomescape/repository/ReservationRepository.java b/src/main/java/roomescape/repository/ReservationRepository.java new file mode 100644 index 000000000..57ce23f18 --- /dev/null +++ b/src/main/java/roomescape/repository/ReservationRepository.java @@ -0,0 +1,19 @@ +package roomescape.repository; + +import roomescape.domain.Reservation; +import roomescape.dto.ReservationDto; + +import java.util.List; +import java.util.Optional; + +public interface ReservationRepository { + + Reservation save(ReservationDto reservationDto); + + Optional findById(Long reservationId); + + List findAll(); + + public Optional delete(Long reservationId); + +} From 19e40f1b7b92cefa58818c4aee680492b4e7d8af Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:30:24 +0900 Subject: [PATCH 20/89] =?UTF-8?q?=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryReservationRepository.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/roomescape/repository/MemoryReservationRepository.java diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/repository/MemoryReservationRepository.java new file mode 100644 index 000000000..fec9bb11c --- /dev/null +++ b/src/main/java/roomescape/repository/MemoryReservationRepository.java @@ -0,0 +1,48 @@ +package roomescape.repository; + +import org.springframework.stereotype.Repository; +import roomescape.domain.Reservation; +import roomescape.dto.ReservationDto; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; + +@Repository +public class MemoryReservationRepository implements ReservationRepository{ + + private static Map reservationStore = new ConcurrentHashMap<>(); + private static AtomicLong index = new AtomicLong(1); + + @Override + public Reservation save(ReservationDto reservationDto) { + + Long reservationId = index.getAndIncrement(); + Reservation savedReservation = new Reservation( + reservationId, reservationDto.getName(), reservationDto.getDate(), reservationDto.getTime()); + + reservationStore.put(reservationId,savedReservation); + + return savedReservation; + } + + @Override + public Optional findById(Long reservationId) { + return Optional.ofNullable(reservationStore.get(reservationId)); + } + + @Override + public List findAll() { + return new ArrayList<>(reservationStore.values()); + } + + @Override + public Optional delete(Long reservationId) { + Optional reservation = findById(reservationId); + + return Optional.ofNullable(reservationStore.remove(reservationId)); + } +} From 2bf90d0f8ea8bf5ce3ae3e0547e3164e6b25cbbe Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:30:47 +0900 Subject: [PATCH 21/89] =?UTF-8?q?=20=EC=98=88=EC=95=BD=20=EB=B9=84?= =?UTF-8?q?=EC=A6=88=EB=8B=88=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20Service=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 --- .../service/ReservationService.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/roomescape/service/ReservationService.java diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/service/ReservationService.java new file mode 100644 index 000000000..158aeadfb --- /dev/null +++ b/src/main/java/roomescape/service/ReservationService.java @@ -0,0 +1,30 @@ +package roomescape.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import roomescape.domain.Reservation; +import roomescape.dto.ReservationDto; +import roomescape.repository.ReservationRepository; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class ReservationService { + + private final ReservationRepository repository; + + public Reservation addReservation(ReservationDto reservationDto){ + return repository.save(reservationDto); + } + + public List checkReservations(){ + return repository.findAll(); + } + + public Optional deleteReservation(Long reservationId){ + return repository.delete(reservationId); + } + +} From 51b6b5577bf89f1bdc783eb4ddec33842e4569bf Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:34:01 +0900 Subject: [PATCH 22/89] =?UTF-8?q?=20repository,=20service=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20controller=20?= =?UTF-8?q?=EC=9E=AC=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index ec517e7a4..36aa680b3 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -1,24 +1,24 @@ package roomescape.controller; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.domain.Reservation; import roomescape.dto.ReservationDto; import roomescape.exception.NotFoundReservationException; +import roomescape.service.ReservationService; import java.net.URI; -import java.util.ArrayList; import java.util.List; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicLong; +import java.util.Optional; @Controller +@RequiredArgsConstructor public class ReservationController { - private List reservations = new ArrayList<>(); - private AtomicLong index = new AtomicLong(1); + private final ReservationService reservationService; @GetMapping("/reservation") public String showReservationPage(){ @@ -27,30 +27,23 @@ public String showReservationPage(){ @GetMapping("/reservations") public ResponseEntity> readReservation(){ - return ResponseEntity.ok(reservations); + return ResponseEntity.ok(reservationService.checkReservations()); } @PostMapping("/reservations") - public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto){ - Reservation reservation = new Reservation( - index.getAndIncrement(), - reservationDto.getName(), - reservationDto.getDate(), - reservationDto.getTime() - ); - reservations.add(reservation); - - return ResponseEntity.created(URI.create("/reservations/"+reservation.getId())).body(reservation); + public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto){ + Reservation createdReservation = reservationService.addReservation(reservationDto); + + return ResponseEntity.created(URI.create("/reservations/"+createdReservation.getId())).body(createdReservation); } - @DeleteMapping("/reservations/{id}") - public ResponseEntity deleteReservation(@PathVariable Long id){ - Reservation reservation = reservations.stream() - .filter(r -> Objects.equals(r.getId(), id)) - .findFirst() - .orElseThrow(()->new NotFoundReservationException()); + @DeleteMapping("/reservations/{reservationId}") + public ResponseEntity deleteReservation(@PathVariable Long reservationId){ + Optional deleteReservation = reservationService.deleteReservation(reservationId); + if (deleteReservation.isEmpty()){ + throw new NotFoundReservationException(); + } - reservations.remove(reservation); return ResponseEntity.noContent().build(); } } From 51aadd18dc3384bf100f7c2fd5699417724018c3 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 16:50:55 +0900 Subject: [PATCH 23/89] =?UTF-8?q?=20Spring=20jdbc=20Starter=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index b84d87a5d..6f44b469e 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,9 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.28' implementation 'org.springframework.boot:spring-boot-starter-validation' + + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' } test { From 9ee624c9322976de6a15cf77e9ee9974f18072c3 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 17:07:07 +0900 Subject: [PATCH 24/89] =?UTF-8?q?=20DB=20=EC=84=A4=EC=A0=95=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 --- src/main/resources/application.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb..d2b42566e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,4 @@ +# h2-console ??? ?? +spring.h2.console.enabled=true +# db url +spring.datasource.url=jdbc:h2:mem:database From 9d1d2a0a08098b5177c81af957327878480ffe5b Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 17:07:42 +0900 Subject: [PATCH 25/89] =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/schema.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/resources/schema.sql 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) +); From 8a1f8cd9a61628ca353ed43b765069eb9c6eaeed Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:29:19 +0900 Subject: [PATCH 26/89] =?UTF-8?q?=201,2,3,4=20=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=84=A4=EC=9D=B4=EB=B0=8D=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 --- .../{MissionStepTest.java => SpringMVCMissionStepTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/roomescape/{MissionStepTest.java => SpringMVCMissionStepTest.java} (98%) diff --git a/src/test/java/roomescape/MissionStepTest.java b/src/test/java/roomescape/SpringMVCMissionStepTest.java similarity index 98% rename from src/test/java/roomescape/MissionStepTest.java rename to src/test/java/roomescape/SpringMVCMissionStepTest.java index 9b27282d4..b306b58a7 100644 --- a/src/test/java/roomescape/MissionStepTest.java +++ b/src/test/java/roomescape/SpringMVCMissionStepTest.java @@ -13,7 +13,7 @@ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -public class MissionStepTest { +public class SpringMVCMissionStepTest { @Test void 일단계() { From 2a9ee791d0e5693805a00d55866949bda543cc21 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:29:48 +0900 Subject: [PATCH 27/89] =?UTF-8?q?=205,6,7=20=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/SpringJDBCMissionStepTest.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/test/java/roomescape/SpringJDBCMissionStepTest.java diff --git a/src/test/java/roomescape/SpringJDBCMissionStepTest.java b/src/test/java/roomescape/SpringJDBCMissionStepTest.java new file mode 100644 index 000000000..d0620dac6 --- /dev/null +++ b/src/test/java/roomescape/SpringJDBCMissionStepTest.java @@ -0,0 +1,80 @@ +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.domain.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; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class SpringJDBCMissionStepTest { + + @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); + } + } + + @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); + } + +} From 3012b2698bffed3b3abd7eba7281017f2ab300fc Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:31:32 +0900 Subject: [PATCH 28/89] =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=83=9D=EC=84=B1=EC=9E=90=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 --- src/main/java/roomescape/domain/Reservation.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/domain/Reservation.java index cca6e0a2f..9fba3e268 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -10,7 +10,10 @@ public class Reservation { private String date; private String time; - public Reservation(Long 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; From f0156fa1490209762d62aa359ecae6d9f3c86608 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:32:28 +0900 Subject: [PATCH 29/89] =?UTF-8?q?=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EC=86=8C=EC=97=90=EC=84=9C=20@Repository=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/repository/MemoryReservationRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/repository/MemoryReservationRepository.java index fec9bb11c..90e8d2822 100644 --- a/src/main/java/roomescape/repository/MemoryReservationRepository.java +++ b/src/main/java/roomescape/repository/MemoryReservationRepository.java @@ -11,7 +11,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; -@Repository public class MemoryReservationRepository implements ReservationRepository{ private static Map reservationStore = new ConcurrentHashMap<>(); From e72a1d969307093ec48caaefa443ac9a1c00b441 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:33:39 +0900 Subject: [PATCH 30/89] =?UTF-8?q?=20h2=20=EA=B8=B0=EB=B0=98=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B4=80=EB=A6=AC=20=EC=9A=A9?= =?UTF-8?q?=EB=8F=84=EC=9D=98=20Repository=20=EA=B5=AC=ED=98=84=EC=B2=B4?= =?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 --- .../repository/JdbcReservationRepository.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/main/java/roomescape/repository/JdbcReservationRepository.java diff --git a/src/main/java/roomescape/repository/JdbcReservationRepository.java b/src/main/java/roomescape/repository/JdbcReservationRepository.java new file mode 100644 index 000000000..140015e38 --- /dev/null +++ b/src/main/java/roomescape/repository/JdbcReservationRepository.java @@ -0,0 +1,83 @@ +package roomescape.repository; + +import lombok.RequiredArgsConstructor; +import org.springframework.dao.EmptyResultDataAccessException; +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.Repository; +import roomescape.domain.Reservation; +import roomescape.dto.ReservationDto; + +import java.sql.PreparedStatement; +import java.util.List; +import java.util.Optional; + +@Repository +@RequiredArgsConstructor +public class JdbcReservationRepository implements ReservationRepository{ + + private final JdbcTemplate jdbcTemplate; + + @Override + public Reservation save(ReservationDto reservationDto) { + String sql = "insert into reservation (name, date, time) values (?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); + ps.setString(1, reservationDto.getName()); + ps.setString(2,reservationDto.getDate()); + ps.setString(3,reservationDto.getTime()); + return ps; + }, keyHolder); + + Long generatedAutoId = keyHolder.getKey().longValue(); + return new Reservation(generatedAutoId, reservationDto.getName(), reservationDto.getDate(), reservationDto.getTime()); + } + + @Override + public Optional findById(Long reservationId) { + String sql = "select id, name, date, time from reservation where id = ?"; + + try{ + Reservation reservation = jdbcTemplate.queryForObject(sql, reservationMapper(), reservationId); + return Optional.of(reservation); + } catch(EmptyResultDataAccessException e){ + return Optional.empty(); + } + } + + @Override + public List findAll() { + String sql = "select id, name, date, time from reservation"; + + return jdbcTemplate.query(sql, reservationMapper()); + } + + @Override + public Optional delete(Long reservationId) { + Optional reservation = this.findById(reservationId); + if (reservation.isEmpty()){ + return Optional.empty(); + } + + String sql = "delete from reservation where id = ?"; + jdbcTemplate.update(sql, reservationId); + + return reservation; + } + + private RowMapper reservationMapper() { + return ((rs, rowNum) -> { + return new Reservation( + rs.getLong("id"), + rs.getString("name"), + rs.getString("date"), + rs.getString("time") + ); + }); + } +} From 4b98968c16f7e90a88fdcce45a76c7b9bcd11d45 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 13 Nov 2024 18:34:39 +0900 Subject: [PATCH 31/89] =?UTF-8?q?=20=EB=AF=B8=EC=85=98=20=ED=9D=90?= =?UTF-8?q?=EB=A6=84=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B9=84=EC=A6=88?= =?UTF-8?q?=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B0=94=EA=BE=B8=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/service/ReservationService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/service/ReservationService.java index 158aeadfb..9171383b2 100644 --- a/src/main/java/roomescape/service/ReservationService.java +++ b/src/main/java/roomescape/service/ReservationService.java @@ -15,14 +15,14 @@ public class ReservationService { private final ReservationRepository repository; - public Reservation addReservation(ReservationDto reservationDto){ - return repository.save(reservationDto); - } - public List checkReservations(){ return repository.findAll(); } + public Reservation addReservation(ReservationDto reservationDto){ + return repository.save(reservationDto); + } + public Optional deleteReservation(Long reservationId){ return repository.delete(reservationId); } From 8b552a6d9c42552273d854d34d8e7506264cc61f Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 19 Nov 2024 15:13:54 +0900 Subject: [PATCH 32/89] =?UTF-8?q?=20DTO->Entity=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B0=8F=20=EB=A1=9C=EC=A7=81=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/main/java/roomescape/domain/Reservation.java | 3 +++ .../repository/MemoryReservationRepository.java | 11 ++++------- .../roomescape/repository/ReservationRepository.java | 3 +-- .../java/roomescape/service/ReservationService.java | 6 +++++- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/domain/Reservation.java index cca6e0a2f..4cc517507 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -17,4 +17,7 @@ public Reservation(Long id,String name, String date, String time) { this.time = time; } + public void setId(Long id) { + this.id = id; + } } diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/repository/MemoryReservationRepository.java index fec9bb11c..219e4a06e 100644 --- a/src/main/java/roomescape/repository/MemoryReservationRepository.java +++ b/src/main/java/roomescape/repository/MemoryReservationRepository.java @@ -2,7 +2,6 @@ import org.springframework.stereotype.Repository; import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; import java.util.ArrayList; import java.util.List; @@ -18,15 +17,13 @@ public class MemoryReservationRepository implements ReservationRepository{ private static AtomicLong index = new AtomicLong(1); @Override - public Reservation save(ReservationDto reservationDto) { + public Reservation save(Reservation reservation) { Long reservationId = index.getAndIncrement(); - Reservation savedReservation = new Reservation( - reservationId, reservationDto.getName(), reservationDto.getDate(), reservationDto.getTime()); + reservation.setId(reservationId); + reservationStore.put(reservationId,reservation); - reservationStore.put(reservationId,savedReservation); - - return savedReservation; + return reservation; } @Override diff --git a/src/main/java/roomescape/repository/ReservationRepository.java b/src/main/java/roomescape/repository/ReservationRepository.java index 57ce23f18..fd826ef1f 100644 --- a/src/main/java/roomescape/repository/ReservationRepository.java +++ b/src/main/java/roomescape/repository/ReservationRepository.java @@ -1,14 +1,13 @@ package roomescape.repository; import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; import java.util.List; import java.util.Optional; public interface ReservationRepository { - Reservation save(ReservationDto reservationDto); + Reservation save(Reservation reservation); Optional findById(Long reservationId); diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/service/ReservationService.java index 158aeadfb..e7ef942e6 100644 --- a/src/main/java/roomescape/service/ReservationService.java +++ b/src/main/java/roomescape/service/ReservationService.java @@ -16,7 +16,8 @@ public class ReservationService { private final ReservationRepository repository; public Reservation addReservation(ReservationDto reservationDto){ - return repository.save(reservationDto); + Reservation reservation = convertToEntity(reservationDto); + return repository.save(reservation); } public List checkReservations(){ @@ -27,4 +28,7 @@ public Optional deleteReservation(Long reservationId){ return repository.delete(reservationId); } + private Reservation convertToEntity(ReservationDto dto) { + return new Reservation(null, dto.getName(), dto.getDate(), dto.getTime()); + } } From 98eeee30fd0834bfbf1d4c8eb4381ccc4e81ed22 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 19 Nov 2024 22:07:47 +0900 Subject: [PATCH 33/89] =?UTF-8?q?=20Controller=EC=99=80=20RestControl?= =?UTF-8?q?ler=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...omeController.java => MainPageController.java} | 9 +++++++-- .../controller/ReservationController.java | 15 ++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) rename src/main/java/roomescape/controller/{HomeController.java => MainPageController.java} (53%) diff --git a/src/main/java/roomescape/controller/HomeController.java b/src/main/java/roomescape/controller/MainPageController.java similarity index 53% rename from src/main/java/roomescape/controller/HomeController.java rename to src/main/java/roomescape/controller/MainPageController.java index ec703e92b..6a80faf40 100644 --- a/src/main/java/roomescape/controller/HomeController.java +++ b/src/main/java/roomescape/controller/MainPageController.java @@ -4,11 +4,16 @@ import org.springframework.web.bind.annotation.GetMapping; @Controller -public class HomeController { +public class MainPageController { @GetMapping("/") - public String home(){ + public String showHomePage() { return "home"; } + @GetMapping("/reservation") + public String showReservationForm(){ + return "reservation"; + } + } diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 36aa680b3..128121784 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -3,7 +3,6 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.domain.Reservation; import roomescape.dto.ReservationDto; @@ -14,27 +13,21 @@ import java.util.List; import java.util.Optional; -@Controller +@RestController @RequiredArgsConstructor public class ReservationController { private final ReservationService reservationService; - @GetMapping("/reservation") - public String showReservationPage(){ - return "reservation"; - } - @GetMapping("/reservations") public ResponseEntity> readReservation(){ return ResponseEntity.ok(reservationService.checkReservations()); } @PostMapping("/reservations") - public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto){ - Reservation createdReservation = reservationService.addReservation(reservationDto); - - return ResponseEntity.created(URI.create("/reservations/"+createdReservation.getId())).body(createdReservation); + public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto) { + Reservation savedReservation = reservationService.addReservation(reservationDto); + return ResponseEntity.created(URI.create("/reservations/" + savedReservation.getId())).body(savedReservation); } @DeleteMapping("/reservations/{reservationId}") From a2938994a6c693105ed7f508618bcb2aecc206d3 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:36:14 +0900 Subject: [PATCH 34/89] =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EC=88=98=EC=A0=95,=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/NotFoundReservationException.java | 2 +- .../exception/ReservationExceptionHandler.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) rename src/main/java/roomescape/{ => reservation/presentation}/exception/NotFoundReservationException.java (83%) rename src/main/java/roomescape/{ => reservation/presentation}/exception/ReservationExceptionHandler.java (76%) diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java similarity index 83% rename from src/main/java/roomescape/exception/NotFoundReservationException.java rename to src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java index 33a4bdecd..73beb55cb 100644 --- a/src/main/java/roomescape/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.exception; +package roomescape.reservation.presentation.exception; public class NotFoundReservationException extends RuntimeException{ diff --git a/src/main/java/roomescape/exception/ReservationExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java similarity index 76% rename from src/main/java/roomescape/exception/ReservationExceptionHandler.java rename to src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java index cd6bbd3e0..76e66dadd 100644 --- a/src/main/java/roomescape/exception/ReservationExceptionHandler.java +++ b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java @@ -1,4 +1,4 @@ -package roomescape.exception; +package roomescape.reservation.presentation.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -6,12 +6,13 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import roomescape.reservation.presentation.ReservationController; import java.util.HashMap; import java.util.Map; @Slf4j -@ControllerAdvice(basePackages = "roomescape.controller") +@ControllerAdvice(assignableTypes = ReservationController.class) public class ReservationExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) @@ -30,4 +31,9 @@ public ResponseEntity> handleValidationExceptions(MethodArgu public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ return ResponseEntity.badRequest().body(e.getMessage()); } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e){ + return ResponseEntity.internalServerError().body(e.getMessage()); + } } From ee1ec845462b0329de34658cd86c3a92f3e37455 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:41:05 +0900 Subject: [PATCH 35/89] =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=A0=8C=EB=8D=94=EB=A7=81=ED=95=98=EB=8A=94=20=EB=B7=B0=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/MainPageExceptionHandler.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java diff --git a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java new file mode 100644 index 000000000..5eb283391 --- /dev/null +++ b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java @@ -0,0 +1,16 @@ +package roomescape.reservation.presentation.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import roomescape.MainPageController; + +@Slf4j +@ControllerAdvice(assignableTypes = MainPageController.class) +public class MainPageExceptionHandler { + @ExceptionHandler(Exception.class) + public String handleException(Exception e){ + log.error("error: " + e.getMessage()); + return "error/500"; //view 렌더링 페이지는 만들지 않음! + } +} From edf05cdc0c881b4fe031c6fcf722247e32cd026a Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:45:15 +0900 Subject: [PATCH 36/89] =?UTF-8?q?=20=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EB=93=9C=20=EC=95=84=ED=82=A4=ED=85=8D=EC=B2=98=EC=97=90=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=ED=95=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{controller => }/MainPageController.java | 3 +-- .../business}/ReservationService.java | 8 ++++---- .../{ => reservation}/domain/Reservation.java | 2 +- .../persistence}/MemoryReservationRepository.java | 6 +++--- .../persistence}/ReservationRepository.java | 4 ++-- .../presentation}/ReservationController.java | 10 +++++----- .../presentation}/dto/ReservationDto.java | 2 +- 7 files changed, 17 insertions(+), 18 deletions(-) rename src/main/java/roomescape/{controller => }/MainPageController.java (91%) rename src/main/java/roomescape/{service => reservation/business}/ReservationService.java (79%) rename src/main/java/roomescape/{ => reservation}/domain/Reservation.java (91%) rename src/main/java/roomescape/{repository => reservation/persistence}/MemoryReservationRepository.java (92%) rename src/main/java/roomescape/{repository => reservation/persistence}/ReservationRepository.java (76%) rename src/main/java/roomescape/{controller => reservation/presentation}/ReservationController.java (81%) rename src/main/java/roomescape/{ => reservation/presentation}/dto/ReservationDto.java (92%) diff --git a/src/main/java/roomescape/controller/MainPageController.java b/src/main/java/roomescape/MainPageController.java similarity index 91% rename from src/main/java/roomescape/controller/MainPageController.java rename to src/main/java/roomescape/MainPageController.java index 6a80faf40..9384075b0 100644 --- a/src/main/java/roomescape/controller/MainPageController.java +++ b/src/main/java/roomescape/MainPageController.java @@ -1,4 +1,4 @@ -package roomescape.controller; +package roomescape; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -15,5 +15,4 @@ public String showHomePage() { public String showReservationForm(){ return "reservation"; } - } diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/reservation/business/ReservationService.java similarity index 79% rename from src/main/java/roomescape/service/ReservationService.java rename to src/main/java/roomescape/reservation/business/ReservationService.java index e7ef942e6..cc40bc1b4 100644 --- a/src/main/java/roomescape/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/business/ReservationService.java @@ -1,10 +1,10 @@ -package roomescape.service; +package roomescape.reservation.business; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; -import roomescape.repository.ReservationRepository; +import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.dto.ReservationDto; +import roomescape.reservation.persistence.ReservationRepository; import java.util.List; import java.util.Optional; diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/reservation/domain/Reservation.java similarity index 91% rename from src/main/java/roomescape/domain/Reservation.java rename to src/main/java/roomescape/reservation/domain/Reservation.java index 4cc517507..368b4c1f4 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/reservation/domain/Reservation.java @@ -1,4 +1,4 @@ -package roomescape.domain; +package roomescape.reservation.domain; import lombok.Getter; diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java similarity index 92% rename from src/main/java/roomescape/repository/MemoryReservationRepository.java rename to src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java index 219e4a06e..c592c8c09 100644 --- a/src/main/java/roomescape/repository/MemoryReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java @@ -1,7 +1,7 @@ -package roomescape.repository; +package roomescape.reservation.persistence; import org.springframework.stereotype.Repository; -import roomescape.domain.Reservation; +import roomescape.reservation.domain.Reservation; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicLong; @Repository -public class MemoryReservationRepository implements ReservationRepository{ +public class MemoryReservationRepository implements ReservationRepository { private static Map reservationStore = new ConcurrentHashMap<>(); private static AtomicLong index = new AtomicLong(1); diff --git a/src/main/java/roomescape/repository/ReservationRepository.java b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java similarity index 76% rename from src/main/java/roomescape/repository/ReservationRepository.java rename to src/main/java/roomescape/reservation/persistence/ReservationRepository.java index fd826ef1f..20b2c9950 100644 --- a/src/main/java/roomescape/repository/ReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java @@ -1,6 +1,6 @@ -package roomescape.repository; +package roomescape.reservation.persistence; -import roomescape.domain.Reservation; +import roomescape.reservation.domain.Reservation; import java.util.List; import java.util.Optional; diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/reservation/presentation/ReservationController.java similarity index 81% rename from src/main/java/roomescape/controller/ReservationController.java rename to src/main/java/roomescape/reservation/presentation/ReservationController.java index 128121784..7d6373f6e 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/reservation/presentation/ReservationController.java @@ -1,13 +1,13 @@ -package roomescape.controller; +package roomescape.reservation.presentation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; -import roomescape.exception.NotFoundReservationException; -import roomescape.service.ReservationService; +import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.dto.ReservationDto; +import roomescape.reservation.presentation.exception.NotFoundReservationException; +import roomescape.reservation.business.ReservationService; import java.net.URI; import java.util.List; diff --git a/src/main/java/roomescape/dto/ReservationDto.java b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java similarity index 92% rename from src/main/java/roomescape/dto/ReservationDto.java rename to src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java index 69a4c9d48..f391fbb01 100644 --- a/src/main/java/roomescape/dto/ReservationDto.java +++ b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java @@ -1,4 +1,4 @@ -package roomescape.dto; +package roomescape.reservation.presentation.dto; import jakarta.validation.constraints.NotBlank; import lombok.Getter; From 927c74c2446792bd29084074bfe25417af643498 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 19 Nov 2024 15:13:54 +0900 Subject: [PATCH 37/89] =?UTF-8?q?=20DTO->Entity=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B0=8F=20=EB=A1=9C=EC=A7=81=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/main/java/roomescape/domain/Reservation.java | 3 +++ .../repository/MemoryReservationRepository.java | 11 ++++------- .../roomescape/repository/ReservationRepository.java | 3 +-- .../java/roomescape/service/ReservationService.java | 12 ++++++++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/domain/Reservation.java index 9fba3e268..2d8faaee3 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -20,4 +20,7 @@ public Reservation(Long id, String name, String date, String time) { this.time = time; } + public void setId(Long id) { + this.id = id; + } } diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/repository/MemoryReservationRepository.java index 90e8d2822..8414799c4 100644 --- a/src/main/java/roomescape/repository/MemoryReservationRepository.java +++ b/src/main/java/roomescape/repository/MemoryReservationRepository.java @@ -2,7 +2,6 @@ import org.springframework.stereotype.Repository; import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; import java.util.ArrayList; import java.util.List; @@ -17,15 +16,13 @@ public class MemoryReservationRepository implements ReservationRepository{ private static AtomicLong index = new AtomicLong(1); @Override - public Reservation save(ReservationDto reservationDto) { + public Reservation save(Reservation reservation) { Long reservationId = index.getAndIncrement(); - Reservation savedReservation = new Reservation( - reservationId, reservationDto.getName(), reservationDto.getDate(), reservationDto.getTime()); + reservation.setId(reservationId); + reservationStore.put(reservationId,reservation); - reservationStore.put(reservationId,savedReservation); - - return savedReservation; + return reservation; } @Override diff --git a/src/main/java/roomescape/repository/ReservationRepository.java b/src/main/java/roomescape/repository/ReservationRepository.java index 57ce23f18..fd826ef1f 100644 --- a/src/main/java/roomescape/repository/ReservationRepository.java +++ b/src/main/java/roomescape/repository/ReservationRepository.java @@ -1,14 +1,13 @@ package roomescape.repository; import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; import java.util.List; import java.util.Optional; public interface ReservationRepository { - Reservation save(ReservationDto reservationDto); + Reservation save(Reservation reservation); Optional findById(Long reservationId); diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/service/ReservationService.java index 9171383b2..e7ef942e6 100644 --- a/src/main/java/roomescape/service/ReservationService.java +++ b/src/main/java/roomescape/service/ReservationService.java @@ -15,16 +15,20 @@ public class ReservationService { private final ReservationRepository repository; - public List checkReservations(){ - return repository.findAll(); + public Reservation addReservation(ReservationDto reservationDto){ + Reservation reservation = convertToEntity(reservationDto); + return repository.save(reservation); } - public Reservation addReservation(ReservationDto reservationDto){ - return repository.save(reservationDto); + public List checkReservations(){ + return repository.findAll(); } public Optional deleteReservation(Long reservationId){ return repository.delete(reservationId); } + private Reservation convertToEntity(ReservationDto dto) { + return new Reservation(null, dto.getName(), dto.getDate(), dto.getTime()); + } } From 7be63ffaa56d0d2431b03b838d9d4f464087edf2 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 19 Nov 2024 22:07:47 +0900 Subject: [PATCH 38/89] =?UTF-8?q?=20Controller=EC=99=80=20RestControl?= =?UTF-8?q?ler=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...omeController.java => MainPageController.java} | 9 +++++++-- .../controller/ReservationController.java | 15 ++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) rename src/main/java/roomescape/controller/{HomeController.java => MainPageController.java} (53%) diff --git a/src/main/java/roomescape/controller/HomeController.java b/src/main/java/roomescape/controller/MainPageController.java similarity index 53% rename from src/main/java/roomescape/controller/HomeController.java rename to src/main/java/roomescape/controller/MainPageController.java index ec703e92b..6a80faf40 100644 --- a/src/main/java/roomescape/controller/HomeController.java +++ b/src/main/java/roomescape/controller/MainPageController.java @@ -4,11 +4,16 @@ import org.springframework.web.bind.annotation.GetMapping; @Controller -public class HomeController { +public class MainPageController { @GetMapping("/") - public String home(){ + public String showHomePage() { return "home"; } + @GetMapping("/reservation") + public String showReservationForm(){ + return "reservation"; + } + } diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/controller/ReservationController.java index 36aa680b3..128121784 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/controller/ReservationController.java @@ -3,7 +3,6 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import roomescape.domain.Reservation; import roomescape.dto.ReservationDto; @@ -14,27 +13,21 @@ import java.util.List; import java.util.Optional; -@Controller +@RestController @RequiredArgsConstructor public class ReservationController { private final ReservationService reservationService; - @GetMapping("/reservation") - public String showReservationPage(){ - return "reservation"; - } - @GetMapping("/reservations") public ResponseEntity> readReservation(){ return ResponseEntity.ok(reservationService.checkReservations()); } @PostMapping("/reservations") - public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto){ - Reservation createdReservation = reservationService.addReservation(reservationDto); - - return ResponseEntity.created(URI.create("/reservations/"+createdReservation.getId())).body(createdReservation); + public ResponseEntity createReservation(@Valid @RequestBody ReservationDto reservationDto) { + Reservation savedReservation = reservationService.addReservation(reservationDto); + return ResponseEntity.created(URI.create("/reservations/" + savedReservation.getId())).body(savedReservation); } @DeleteMapping("/reservations/{reservationId}") From 552f755478cb30f170f8b2f136944552ae9fc4ee Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:36:14 +0900 Subject: [PATCH 39/89] =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EC=88=98=EC=A0=95,=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/NotFoundReservationException.java | 2 +- .../exception/ReservationExceptionHandler.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) rename src/main/java/roomescape/{ => reservation/presentation}/exception/NotFoundReservationException.java (83%) rename src/main/java/roomescape/{ => reservation/presentation}/exception/ReservationExceptionHandler.java (76%) diff --git a/src/main/java/roomescape/exception/NotFoundReservationException.java b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java similarity index 83% rename from src/main/java/roomescape/exception/NotFoundReservationException.java rename to src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java index 33a4bdecd..73beb55cb 100644 --- a/src/main/java/roomescape/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.exception; +package roomescape.reservation.presentation.exception; public class NotFoundReservationException extends RuntimeException{ diff --git a/src/main/java/roomescape/exception/ReservationExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java similarity index 76% rename from src/main/java/roomescape/exception/ReservationExceptionHandler.java rename to src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java index cd6bbd3e0..76e66dadd 100644 --- a/src/main/java/roomescape/exception/ReservationExceptionHandler.java +++ b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java @@ -1,4 +1,4 @@ -package roomescape.exception; +package roomescape.reservation.presentation.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -6,12 +6,13 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import roomescape.reservation.presentation.ReservationController; import java.util.HashMap; import java.util.Map; @Slf4j -@ControllerAdvice(basePackages = "roomescape.controller") +@ControllerAdvice(assignableTypes = ReservationController.class) public class ReservationExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) @@ -30,4 +31,9 @@ public ResponseEntity> handleValidationExceptions(MethodArgu public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ return ResponseEntity.badRequest().body(e.getMessage()); } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e){ + return ResponseEntity.internalServerError().body(e.getMessage()); + } } From 8ede9a7406762400038e51e8223e35280f2c19cd Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:41:05 +0900 Subject: [PATCH 40/89] =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=A0=8C=EB=8D=94=EB=A7=81=ED=95=98=EB=8A=94=20=EB=B7=B0=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/MainPageExceptionHandler.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java diff --git a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java new file mode 100644 index 000000000..5eb283391 --- /dev/null +++ b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java @@ -0,0 +1,16 @@ +package roomescape.reservation.presentation.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import roomescape.MainPageController; + +@Slf4j +@ControllerAdvice(assignableTypes = MainPageController.class) +public class MainPageExceptionHandler { + @ExceptionHandler(Exception.class) + public String handleException(Exception e){ + log.error("error: " + e.getMessage()); + return "error/500"; //view 렌더링 페이지는 만들지 않음! + } +} From d6d1e9d36dce023c6b5677b4ec6c4f996a54f219 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Wed, 20 Nov 2024 03:45:15 +0900 Subject: [PATCH 41/89] =?UTF-8?q?=20=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EB=93=9C=20=EC=95=84=ED=82=A4=ED=85=8D=EC=B2=98=EC=97=90=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=ED=95=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{controller => }/MainPageController.java | 3 +-- .../business}/ReservationService.java | 8 ++++---- .../{ => reservation}/domain/Reservation.java | 2 +- .../persistence}/JdbcReservationRepository.java | 0 .../persistence}/MemoryReservationRepository.java | 7 ++++--- .../persistence}/ReservationRepository.java | 4 ++-- .../presentation}/ReservationController.java | 10 +++++----- .../presentation}/dto/ReservationDto.java | 2 +- 8 files changed, 18 insertions(+), 18 deletions(-) rename src/main/java/roomescape/{controller => }/MainPageController.java (91%) rename src/main/java/roomescape/{service => reservation/business}/ReservationService.java (79%) rename src/main/java/roomescape/{ => reservation}/domain/Reservation.java (91%) rename src/main/java/roomescape/{repository => reservation/persistence}/JdbcReservationRepository.java (100%) rename src/main/java/roomescape/{repository => reservation/persistence}/MemoryReservationRepository.java (91%) rename src/main/java/roomescape/{repository => reservation/persistence}/ReservationRepository.java (76%) rename src/main/java/roomescape/{controller => reservation/presentation}/ReservationController.java (81%) rename src/main/java/roomescape/{ => reservation/presentation}/dto/ReservationDto.java (92%) diff --git a/src/main/java/roomescape/controller/MainPageController.java b/src/main/java/roomescape/MainPageController.java similarity index 91% rename from src/main/java/roomescape/controller/MainPageController.java rename to src/main/java/roomescape/MainPageController.java index 6a80faf40..9384075b0 100644 --- a/src/main/java/roomescape/controller/MainPageController.java +++ b/src/main/java/roomescape/MainPageController.java @@ -1,4 +1,4 @@ -package roomescape.controller; +package roomescape; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -15,5 +15,4 @@ public String showHomePage() { public String showReservationForm(){ return "reservation"; } - } diff --git a/src/main/java/roomescape/service/ReservationService.java b/src/main/java/roomescape/reservation/business/ReservationService.java similarity index 79% rename from src/main/java/roomescape/service/ReservationService.java rename to src/main/java/roomescape/reservation/business/ReservationService.java index e7ef942e6..cc40bc1b4 100644 --- a/src/main/java/roomescape/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/business/ReservationService.java @@ -1,10 +1,10 @@ -package roomescape.service; +package roomescape.reservation.business; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; -import roomescape.repository.ReservationRepository; +import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.dto.ReservationDto; +import roomescape.reservation.persistence.ReservationRepository; import java.util.List; import java.util.Optional; diff --git a/src/main/java/roomescape/domain/Reservation.java b/src/main/java/roomescape/reservation/domain/Reservation.java similarity index 91% rename from src/main/java/roomescape/domain/Reservation.java rename to src/main/java/roomescape/reservation/domain/Reservation.java index 2d8faaee3..65b4ffbce 100644 --- a/src/main/java/roomescape/domain/Reservation.java +++ b/src/main/java/roomescape/reservation/domain/Reservation.java @@ -1,4 +1,4 @@ -package roomescape.domain; +package roomescape.reservation.domain; import lombok.Getter; diff --git a/src/main/java/roomescape/repository/JdbcReservationRepository.java b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java similarity index 100% rename from src/main/java/roomescape/repository/JdbcReservationRepository.java rename to src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java diff --git a/src/main/java/roomescape/repository/MemoryReservationRepository.java b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java similarity index 91% rename from src/main/java/roomescape/repository/MemoryReservationRepository.java rename to src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java index 8414799c4..c592c8c09 100644 --- a/src/main/java/roomescape/repository/MemoryReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java @@ -1,7 +1,7 @@ -package roomescape.repository; +package roomescape.reservation.persistence; import org.springframework.stereotype.Repository; -import roomescape.domain.Reservation; +import roomescape.reservation.domain.Reservation; import java.util.ArrayList; import java.util.List; @@ -10,7 +10,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; -public class MemoryReservationRepository implements ReservationRepository{ +@Repository +public class MemoryReservationRepository implements ReservationRepository { private static Map reservationStore = new ConcurrentHashMap<>(); private static AtomicLong index = new AtomicLong(1); diff --git a/src/main/java/roomescape/repository/ReservationRepository.java b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java similarity index 76% rename from src/main/java/roomescape/repository/ReservationRepository.java rename to src/main/java/roomescape/reservation/persistence/ReservationRepository.java index fd826ef1f..20b2c9950 100644 --- a/src/main/java/roomescape/repository/ReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java @@ -1,6 +1,6 @@ -package roomescape.repository; +package roomescape.reservation.persistence; -import roomescape.domain.Reservation; +import roomescape.reservation.domain.Reservation; import java.util.List; import java.util.Optional; diff --git a/src/main/java/roomescape/controller/ReservationController.java b/src/main/java/roomescape/reservation/presentation/ReservationController.java similarity index 81% rename from src/main/java/roomescape/controller/ReservationController.java rename to src/main/java/roomescape/reservation/presentation/ReservationController.java index 128121784..7d6373f6e 100644 --- a/src/main/java/roomescape/controller/ReservationController.java +++ b/src/main/java/roomescape/reservation/presentation/ReservationController.java @@ -1,13 +1,13 @@ -package roomescape.controller; +package roomescape.reservation.presentation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; -import roomescape.exception.NotFoundReservationException; -import roomescape.service.ReservationService; +import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.dto.ReservationDto; +import roomescape.reservation.presentation.exception.NotFoundReservationException; +import roomescape.reservation.business.ReservationService; import java.net.URI; import java.util.List; diff --git a/src/main/java/roomescape/dto/ReservationDto.java b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java similarity index 92% rename from src/main/java/roomescape/dto/ReservationDto.java rename to src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java index 69a4c9d48..f391fbb01 100644 --- a/src/main/java/roomescape/dto/ReservationDto.java +++ b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java @@ -1,4 +1,4 @@ -package roomescape.dto; +package roomescape.reservation.presentation.dto; import jakarta.validation.constraints.NotBlank; import lombok.Getter; From fe2f464d32597ec3a595101c8e32f1a5344ffa24 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 10:10:45 +0900 Subject: [PATCH 42/89] =?UTF-8?q?=20DTO=20->=20Entity=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/JdbcReservationRepository.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java index 140015e38..cf7429e2f 100644 --- a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java @@ -1,4 +1,4 @@ -package roomescape.repository; +package roomescape.reservation.persistence; import lombok.RequiredArgsConstructor; import org.springframework.dao.EmptyResultDataAccessException; @@ -7,8 +7,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import roomescape.domain.Reservation; -import roomescape.dto.ReservationDto; +import roomescape.reservation.domain.Reservation; import java.sql.PreparedStatement; import java.util.List; @@ -16,26 +15,26 @@ @Repository @RequiredArgsConstructor -public class JdbcReservationRepository implements ReservationRepository{ +public class JdbcReservationRepository implements ReservationRepository { private final JdbcTemplate jdbcTemplate; @Override - public Reservation save(ReservationDto reservationDto) { + public Reservation save(Reservation reservation) { String sql = "insert into reservation (name, date, time) values (?,?,?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); - ps.setString(1, reservationDto.getName()); - ps.setString(2,reservationDto.getDate()); - ps.setString(3,reservationDto.getTime()); + ps.setString(1, reservation.getName()); + ps.setString(2,reservation.getDate()); + ps.setString(3,reservation.getTime()); return ps; }, keyHolder); Long generatedAutoId = keyHolder.getKey().longValue(); - return new Reservation(generatedAutoId, reservationDto.getName(), reservationDto.getDate(), reservationDto.getTime()); + return new Reservation(generatedAutoId, reservation.getName(), reservation.getDate(), reservation.getTime()); } @Override From f5d864221f5a47b9f9f01fad52bfb3c585d1daad Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 10:11:02 +0900 Subject: [PATCH 43/89] =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/persistence/MemoryReservationRepository.java | 2 -- src/test/java/roomescape/SpringJDBCMissionStepTest.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java index c592c8c09..d689df1a6 100644 --- a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java @@ -1,6 +1,5 @@ package roomescape.reservation.persistence; -import org.springframework.stereotype.Repository; import roomescape.reservation.domain.Reservation; import java.util.ArrayList; @@ -10,7 +9,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; -@Repository public class MemoryReservationRepository implements ReservationRepository { private static Map reservationStore = new ConcurrentHashMap<>(); diff --git a/src/test/java/roomescape/SpringJDBCMissionStepTest.java b/src/test/java/roomescape/SpringJDBCMissionStepTest.java index d0620dac6..14a8393c0 100644 --- a/src/test/java/roomescape/SpringJDBCMissionStepTest.java +++ b/src/test/java/roomescape/SpringJDBCMissionStepTest.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.domain.Reservation; +import roomescape.reservation.domain.Reservation; import java.sql.Connection; import java.sql.SQLException; From 5f71d558b5952552c31b540f024d8ca30d8d492c Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 11:14:21 +0900 Subject: [PATCH 44/89] =?UTF-8?q?=20DTO=EB=A5=BC=20record=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/ReservationService.java | 10 +++---- .../presentation/dto/ReservationDto.java | 28 ++++--------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/main/java/roomescape/reservation/business/ReservationService.java b/src/main/java/roomescape/reservation/business/ReservationService.java index cc40bc1b4..a64eded6d 100644 --- a/src/main/java/roomescape/reservation/business/ReservationService.java +++ b/src/main/java/roomescape/reservation/business/ReservationService.java @@ -15,20 +15,20 @@ public class ReservationService { private final ReservationRepository repository; - public Reservation addReservation(ReservationDto reservationDto){ + public Reservation addReservation(ReservationDto reservationDto) { Reservation reservation = convertToEntity(reservationDto); return repository.save(reservation); } - public List checkReservations(){ + public List checkReservations() { return repository.findAll(); } - public Optional deleteReservation(Long reservationId){ + public Optional deleteReservation(Long reservationId) { return repository.delete(reservationId); } - private Reservation convertToEntity(ReservationDto dto) { - return new Reservation(null, dto.getName(), dto.getDate(), dto.getTime()); + private Reservation convertToEntity(ReservationDto reservationDto) { + return new Reservation(null, reservationDto.name(), reservationDto.date(), reservationDto.time()); } } diff --git a/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java index f391fbb01..60e5e62a3 100644 --- a/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java +++ b/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java @@ -1,28 +1,10 @@ package roomescape.reservation.presentation.dto; import jakarta.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.Setter; -@Getter -@Setter -public class ReservationDto { - - @NotBlank(message = "예약자 이름을 입력하세요.") - private String name; - - @NotBlank(message = "예약 날짜를 입력하세요.") - private String date; - - @NotBlank(message = "예약 시간을 입력하세요.") - private String time; - - public ReservationDto() { - } - - public ReservationDto(String name, String date, String time) { - this.name = name; - this.date = date; - this.time = time; - } +public record ReservationDto( + @NotBlank(message = "예약자 이름을 입력하세요.") String name, + @NotBlank(message = "예약 날짜를 입력하세요.") String date, + @NotBlank(message = "예약 시간을 입력하세요.") String time +) { } From 55a279732ab7e6618dcfdc4f5470c3d9504b634a Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 13:59:02 +0900 Subject: [PATCH 45/89] =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/MainPageController.java | 2 +- .../persistence/JdbcReservationRepository.java | 10 +++++----- .../persistence/MemoryReservationRepository.java | 2 +- .../presentation/ReservationController.java | 6 +++--- .../exception/MainPageExceptionHandler.java | 2 +- .../exception/NotFoundReservationException.java | 4 ++-- .../exception/ReservationExceptionHandler.java | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/roomescape/MainPageController.java b/src/main/java/roomescape/MainPageController.java index 9384075b0..7fe55776f 100644 --- a/src/main/java/roomescape/MainPageController.java +++ b/src/main/java/roomescape/MainPageController.java @@ -12,7 +12,7 @@ public String showHomePage() { } @GetMapping("/reservation") - public String showReservationForm(){ + public String showReservationForm() { return "reservation"; } } diff --git a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java index cf7429e2f..87335d204 100644 --- a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java @@ -28,8 +28,8 @@ public Reservation save(Reservation reservation) { 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()); + ps.setString(2, reservation.getDate()); + ps.setString(3, reservation.getTime()); return ps; }, keyHolder); @@ -41,10 +41,10 @@ public Reservation save(Reservation reservation) { public Optional findById(Long reservationId) { String sql = "select id, name, date, time from reservation where id = ?"; - try{ + try { Reservation reservation = jdbcTemplate.queryForObject(sql, reservationMapper(), reservationId); return Optional.of(reservation); - } catch(EmptyResultDataAccessException e){ + } catch (EmptyResultDataAccessException e) { return Optional.empty(); } } @@ -59,7 +59,7 @@ public List findAll() { @Override public Optional delete(Long reservationId) { Optional reservation = this.findById(reservationId); - if (reservation.isEmpty()){ + if (reservation.isEmpty()) { return Optional.empty(); } diff --git a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java index d689df1a6..820228031 100644 --- a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java @@ -19,7 +19,7 @@ public Reservation save(Reservation reservation) { Long reservationId = index.getAndIncrement(); reservation.setId(reservationId); - reservationStore.put(reservationId,reservation); + reservationStore.put(reservationId, reservation); return reservation; } diff --git a/src/main/java/roomescape/reservation/presentation/ReservationController.java b/src/main/java/roomescape/reservation/presentation/ReservationController.java index 7d6373f6e..4549834bf 100644 --- a/src/main/java/roomescape/reservation/presentation/ReservationController.java +++ b/src/main/java/roomescape/reservation/presentation/ReservationController.java @@ -20,7 +20,7 @@ public class ReservationController { private final ReservationService reservationService; @GetMapping("/reservations") - public ResponseEntity> readReservation(){ + public ResponseEntity> readReservation() { return ResponseEntity.ok(reservationService.checkReservations()); } @@ -31,9 +31,9 @@ public ResponseEntity createReservation(@Valid @RequestBody Reserva } @DeleteMapping("/reservations/{reservationId}") - public ResponseEntity deleteReservation(@PathVariable Long reservationId){ + public ResponseEntity deleteReservation(@PathVariable Long reservationId) { Optional deleteReservation = reservationService.deleteReservation(reservationId); - if (deleteReservation.isEmpty()){ + if (deleteReservation.isEmpty()) { throw new NotFoundReservationException(); } diff --git a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java index 5eb283391..66c2caa68 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java +++ b/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java @@ -9,7 +9,7 @@ @ControllerAdvice(assignableTypes = MainPageController.class) public class MainPageExceptionHandler { @ExceptionHandler(Exception.class) - public String handleException(Exception e){ + public String handleException(Exception e) { log.error("error: " + e.getMessage()); return "error/500"; //view 렌더링 페이지는 만들지 않음! } diff --git a/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java index 73beb55cb..ef6a65877 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java @@ -1,10 +1,10 @@ package roomescape.reservation.presentation.exception; -public class NotFoundReservationException extends RuntimeException{ +public class NotFoundReservationException extends RuntimeException { private static final String NOT_FOUND_RESERVATION_MESSAGE = "예악을 찾을 수 없습니다."; - public NotFoundReservationException(){ + public NotFoundReservationException() { super(NOT_FOUND_RESERVATION_MESSAGE); } } diff --git a/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java index 76e66dadd..646475d2e 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java +++ b/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java @@ -21,19 +21,19 @@ public ResponseEntity> handleValidationExceptions(MethodArgu for (FieldError error : e.getBindingResult().getFieldErrors()) { errors.put(error.getField(), error.getDefaultMessage()); - log.info("validation error on field {} : {}", error.getField(),error.getDefaultMessage()); + log.info("validation error on field {} : {}", error.getField(), error.getDefaultMessage()); } return ResponseEntity.badRequest().body(errors); } @ExceptionHandler(NotFoundReservationException.class) - public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e){ + public ResponseEntity handleNotFoundReservationException(NotFoundReservationException e) { return ResponseEntity.badRequest().body(e.getMessage()); } @ExceptionHandler(Exception.class) - public ResponseEntity handleException(Exception e){ + public ResponseEntity handleException(Exception e) { return ResponseEntity.internalServerError().body(e.getMessage()); } } From 795a778cf45e79c8043fd03d1ad57772f2d16c0a Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 15:05:51 +0900 Subject: [PATCH 46/89] =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B2=B4=EC=9D=B4=EB=8B=9D=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/presentation/ReservationController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/roomescape/reservation/presentation/ReservationController.java b/src/main/java/roomescape/reservation/presentation/ReservationController.java index 4549834bf..f1f7c418e 100644 --- a/src/main/java/roomescape/reservation/presentation/ReservationController.java +++ b/src/main/java/roomescape/reservation/presentation/ReservationController.java @@ -32,10 +32,8 @@ public ResponseEntity createReservation(@Valid @RequestBody Reserva @DeleteMapping("/reservations/{reservationId}") public ResponseEntity deleteReservation(@PathVariable Long reservationId) { - Optional deleteReservation = reservationService.deleteReservation(reservationId); - if (deleteReservation.isEmpty()) { - throw new NotFoundReservationException(); - } + Reservation deletedReservation = reservationService.deleteReservation(reservationId) + .orElseThrow(NotFoundReservationException::new); return ResponseEntity.noContent().build(); } From 08fa6f4c7bcdda6d473b75013a7cd6af310ba253 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Fri, 22 Nov 2024 16:11:14 +0900 Subject: [PATCH 47/89] =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/ReservationService.java | 5 ++--- .../JdbcReservationRepository.java | 19 +++++++------------ .../MemoryReservationRepository.java | 17 ++++++++++------- .../persistence/ReservationRepository.java | 5 ++--- .../presentation/ReservationController.java | 6 +----- 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/main/java/roomescape/reservation/business/ReservationService.java b/src/main/java/roomescape/reservation/business/ReservationService.java index a64eded6d..a244beaf5 100644 --- a/src/main/java/roomescape/reservation/business/ReservationService.java +++ b/src/main/java/roomescape/reservation/business/ReservationService.java @@ -7,7 +7,6 @@ import roomescape.reservation.persistence.ReservationRepository; import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -24,8 +23,8 @@ public List checkReservations() { return repository.findAll(); } - public Optional deleteReservation(Long reservationId) { - return repository.delete(reservationId); + public void deleteReservation(Long reservationId) { + repository.delete(reservationId); } private Reservation convertToEntity(ReservationDto reservationDto) { diff --git a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java index 87335d204..20d29211a 100644 --- a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java @@ -8,10 +8,10 @@ import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.exception.NotFoundReservationException; import java.sql.PreparedStatement; import java.util.List; -import java.util.Optional; @Repository @RequiredArgsConstructor @@ -38,14 +38,13 @@ public Reservation save(Reservation reservation) { } @Override - public Optional findById(Long reservationId) { + public Reservation findById(Long reservationId) { String sql = "select id, name, date, time from reservation where id = ?"; try { - Reservation reservation = jdbcTemplate.queryForObject(sql, reservationMapper(), reservationId); - return Optional.of(reservation); + return jdbcTemplate.queryForObject(sql, reservationMapper(), reservationId); } catch (EmptyResultDataAccessException e) { - return Optional.empty(); + throw new NotFoundReservationException(); } } @@ -57,16 +56,12 @@ public List findAll() { } @Override - public Optional delete(Long reservationId) { - Optional reservation = this.findById(reservationId); - if (reservation.isEmpty()) { - return Optional.empty(); - } + public void delete(Long reservationId) { + Reservation deletedReservation = this.findById(reservationId); String sql = "delete from reservation where id = ?"; - jdbcTemplate.update(sql, reservationId); + jdbcTemplate.update(sql, deletedReservation.getId()); - return reservation; } private RowMapper reservationMapper() { diff --git a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java index 820228031..32cabf2e1 100644 --- a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java @@ -1,11 +1,11 @@ package roomescape.reservation.persistence; import roomescape.reservation.domain.Reservation; +import roomescape.reservation.presentation.exception.NotFoundReservationException; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; @@ -25,8 +25,12 @@ public Reservation save(Reservation reservation) { } @Override - public Optional findById(Long reservationId) { - return Optional.ofNullable(reservationStore.get(reservationId)); + public Reservation findById(Long reservationId) { + Reservation reservation = reservationStore.get(reservationId); + if (reservation == null) { + throw new NotFoundReservationException(); + } + return reservation; } @Override @@ -35,9 +39,8 @@ public List findAll() { } @Override - public Optional delete(Long reservationId) { - Optional reservation = findById(reservationId); - - return Optional.ofNullable(reservationStore.remove(reservationId)); + public void delete(Long reservationId) { + Reservation deletedReservation = this.findById(reservationId); + reservationStore.remove(deletedReservation.getId()); } } diff --git a/src/main/java/roomescape/reservation/persistence/ReservationRepository.java b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java index 20b2c9950..d0a7af0be 100644 --- a/src/main/java/roomescape/reservation/persistence/ReservationRepository.java +++ b/src/main/java/roomescape/reservation/persistence/ReservationRepository.java @@ -3,16 +3,15 @@ import roomescape.reservation.domain.Reservation; import java.util.List; -import java.util.Optional; public interface ReservationRepository { Reservation save(Reservation reservation); - Optional findById(Long reservationId); + Reservation findById(Long reservationId); List findAll(); - public Optional delete(Long reservationId); + void delete(Long reservationId); } diff --git a/src/main/java/roomescape/reservation/presentation/ReservationController.java b/src/main/java/roomescape/reservation/presentation/ReservationController.java index f1f7c418e..8e1247142 100644 --- a/src/main/java/roomescape/reservation/presentation/ReservationController.java +++ b/src/main/java/roomescape/reservation/presentation/ReservationController.java @@ -6,12 +6,10 @@ import org.springframework.web.bind.annotation.*; import roomescape.reservation.domain.Reservation; import roomescape.reservation.presentation.dto.ReservationDto; -import roomescape.reservation.presentation.exception.NotFoundReservationException; import roomescape.reservation.business.ReservationService; import java.net.URI; import java.util.List; -import java.util.Optional; @RestController @RequiredArgsConstructor @@ -32,9 +30,7 @@ public ResponseEntity createReservation(@Valid @RequestBody Reserva @DeleteMapping("/reservations/{reservationId}") public ResponseEntity deleteReservation(@PathVariable Long reservationId) { - Reservation deletedReservation = reservationService.deleteReservation(reservationId) - .orElseThrow(NotFoundReservationException::new); - + reservationService.deleteReservation(reservationId); return ResponseEntity.noContent().build(); } } From 4151de62ea716e12c2798bc201455039a8306f50 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:05:55 +0900 Subject: [PATCH 48/89] =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{reservation => }/business/ReservationService.java | 8 ++++---- .../roomescape/{reservation => }/domain/Reservation.java | 2 +- .../exception/MainPageExceptionHandler.java | 2 +- .../exception/NotFoundReservationException.java | 2 +- .../exception/ReservationExceptionHandler.java | 4 ++-- .../persistence/JdbcReservationRepository.java | 6 +++--- .../persistence/MemoryReservationRepository.java | 6 +++--- .../persistence/ReservationRepository.java | 4 ++-- .../presentation/ReservationController.java | 8 ++++---- .../presentation/dto/ReservationDto.java | 2 +- 10 files changed, 22 insertions(+), 22 deletions(-) rename src/main/java/roomescape/{reservation => }/business/ReservationService.java (78%) rename src/main/java/roomescape/{reservation => }/domain/Reservation.java (91%) rename src/main/java/roomescape/{reservation/presentation => }/exception/MainPageExceptionHandler.java (90%) rename src/main/java/roomescape/{reservation/presentation => }/exception/NotFoundReservationException.java (83%) rename src/main/java/roomescape/{reservation/presentation => }/exception/ReservationExceptionHandler.java (92%) rename src/main/java/roomescape/{reservation => }/persistence/JdbcReservationRepository.java (93%) rename src/main/java/roomescape/{reservation => }/persistence/MemoryReservationRepository.java (87%) rename src/main/java/roomescape/{reservation => }/persistence/ReservationRepository.java (71%) rename src/main/java/roomescape/{reservation => }/presentation/ReservationController.java (84%) rename src/main/java/roomescape/{reservation => }/presentation/dto/ReservationDto.java (86%) diff --git a/src/main/java/roomescape/reservation/business/ReservationService.java b/src/main/java/roomescape/business/ReservationService.java similarity index 78% rename from src/main/java/roomescape/reservation/business/ReservationService.java rename to src/main/java/roomescape/business/ReservationService.java index a244beaf5..613bc3135 100644 --- a/src/main/java/roomescape/reservation/business/ReservationService.java +++ b/src/main/java/roomescape/business/ReservationService.java @@ -1,10 +1,10 @@ -package roomescape.reservation.business; +package roomescape.business; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import roomescape.reservation.domain.Reservation; -import roomescape.reservation.presentation.dto.ReservationDto; -import roomescape.reservation.persistence.ReservationRepository; +import roomescape.domain.Reservation; +import roomescape.presentation.dto.ReservationDto; +import roomescape.persistence.ReservationRepository; import java.util.List; diff --git a/src/main/java/roomescape/reservation/domain/Reservation.java b/src/main/java/roomescape/domain/Reservation.java similarity index 91% rename from src/main/java/roomescape/reservation/domain/Reservation.java rename to src/main/java/roomescape/domain/Reservation.java index 65b4ffbce..2d8faaee3 100644 --- a/src/main/java/roomescape/reservation/domain/Reservation.java +++ b/src/main/java/roomescape/domain/Reservation.java @@ -1,4 +1,4 @@ -package roomescape.reservation.domain; +package roomescape.domain; import lombok.Getter; diff --git a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java b/src/main/java/roomescape/exception/MainPageExceptionHandler.java similarity index 90% rename from src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java rename to src/main/java/roomescape/exception/MainPageExceptionHandler.java index 66c2caa68..df65c0a60 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/MainPageExceptionHandler.java +++ b/src/main/java/roomescape/exception/MainPageExceptionHandler.java @@ -1,4 +1,4 @@ -package roomescape.reservation.presentation.exception; +package roomescape.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; diff --git a/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java b/src/main/java/roomescape/exception/NotFoundReservationException.java similarity index 83% rename from src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java rename to src/main/java/roomescape/exception/NotFoundReservationException.java index ef6a65877..35d2aa0f2 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/NotFoundReservationException.java +++ b/src/main/java/roomescape/exception/NotFoundReservationException.java @@ -1,4 +1,4 @@ -package roomescape.reservation.presentation.exception; +package roomescape.exception; public class NotFoundReservationException extends RuntimeException { diff --git a/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java b/src/main/java/roomescape/exception/ReservationExceptionHandler.java similarity index 92% rename from src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java rename to src/main/java/roomescape/exception/ReservationExceptionHandler.java index 646475d2e..bd45f6edf 100644 --- a/src/main/java/roomescape/reservation/presentation/exception/ReservationExceptionHandler.java +++ b/src/main/java/roomescape/exception/ReservationExceptionHandler.java @@ -1,4 +1,4 @@ -package roomescape.reservation.presentation.exception; +package roomescape.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -6,7 +6,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import roomescape.reservation.presentation.ReservationController; +import roomescape.presentation.ReservationController; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java b/src/main/java/roomescape/persistence/JdbcReservationRepository.java similarity index 93% rename from src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java rename to src/main/java/roomescape/persistence/JdbcReservationRepository.java index 20d29211a..02e94227d 100644 --- a/src/main/java/roomescape/reservation/persistence/JdbcReservationRepository.java +++ b/src/main/java/roomescape/persistence/JdbcReservationRepository.java @@ -1,4 +1,4 @@ -package roomescape.reservation.persistence; +package roomescape.persistence; import lombok.RequiredArgsConstructor; import org.springframework.dao.EmptyResultDataAccessException; @@ -7,8 +7,8 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; -import roomescape.reservation.domain.Reservation; -import roomescape.reservation.presentation.exception.NotFoundReservationException; +import roomescape.domain.Reservation; +import roomescape.exception.NotFoundReservationException; import java.sql.PreparedStatement; import java.util.List; diff --git a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java b/src/main/java/roomescape/persistence/MemoryReservationRepository.java similarity index 87% rename from src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java rename to src/main/java/roomescape/persistence/MemoryReservationRepository.java index 32cabf2e1..ebff7a103 100644 --- a/src/main/java/roomescape/reservation/persistence/MemoryReservationRepository.java +++ b/src/main/java/roomescape/persistence/MemoryReservationRepository.java @@ -1,7 +1,7 @@ -package roomescape.reservation.persistence; +package roomescape.persistence; -import roomescape.reservation.domain.Reservation; -import roomescape.reservation.presentation.exception.NotFoundReservationException; +import roomescape.domain.Reservation; +import roomescape.exception.NotFoundReservationException; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/roomescape/reservation/persistence/ReservationRepository.java b/src/main/java/roomescape/persistence/ReservationRepository.java similarity index 71% rename from src/main/java/roomescape/reservation/persistence/ReservationRepository.java rename to src/main/java/roomescape/persistence/ReservationRepository.java index d0a7af0be..d9cfaddcc 100644 --- a/src/main/java/roomescape/reservation/persistence/ReservationRepository.java +++ b/src/main/java/roomescape/persistence/ReservationRepository.java @@ -1,6 +1,6 @@ -package roomescape.reservation.persistence; +package roomescape.persistence; -import roomescape.reservation.domain.Reservation; +import roomescape.domain.Reservation; import java.util.List; diff --git a/src/main/java/roomescape/reservation/presentation/ReservationController.java b/src/main/java/roomescape/presentation/ReservationController.java similarity index 84% rename from src/main/java/roomescape/reservation/presentation/ReservationController.java rename to src/main/java/roomescape/presentation/ReservationController.java index 8e1247142..260202018 100644 --- a/src/main/java/roomescape/reservation/presentation/ReservationController.java +++ b/src/main/java/roomescape/presentation/ReservationController.java @@ -1,12 +1,12 @@ -package roomescape.reservation.presentation; +package roomescape.presentation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import roomescape.reservation.domain.Reservation; -import roomescape.reservation.presentation.dto.ReservationDto; -import roomescape.reservation.business.ReservationService; +import roomescape.domain.Reservation; +import roomescape.presentation.dto.ReservationDto; +import roomescape.business.ReservationService; import java.net.URI; import java.util.List; diff --git a/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java b/src/main/java/roomescape/presentation/dto/ReservationDto.java similarity index 86% rename from src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java rename to src/main/java/roomescape/presentation/dto/ReservationDto.java index 60e5e62a3..4ea4b30dd 100644 --- a/src/main/java/roomescape/reservation/presentation/dto/ReservationDto.java +++ b/src/main/java/roomescape/presentation/dto/ReservationDto.java @@ -1,4 +1,4 @@ -package roomescape.reservation.presentation.dto; +package roomescape.presentation.dto; import jakarta.validation.constraints.NotBlank; From f42cf40eaa7fd9cfac55a9529a871f089b3022cc Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:14:06 +0900 Subject: [PATCH 49/89] =?UTF-8?q?=20Time=20Table=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 8d9ab2754..7adcd0fc9 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -6,3 +6,10 @@ CREATE TABLE reservation time VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); + +CREATE TABLE time +( + id BIGINT NOT NULL AUTO_INCREMENT, + time VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); From 1927a329bc10072339bf4e0c51394d2613bc8bc0 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:15:54 +0900 Subject: [PATCH 50/89] =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=A1=B0=EC=A0=95=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20import=20=EC=88=98=EC=A0=95=20=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/roomescape/SpringJDBCMissionStepTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/roomescape/SpringJDBCMissionStepTest.java b/src/test/java/roomescape/SpringJDBCMissionStepTest.java index 14a8393c0..d0620dac6 100644 --- a/src/test/java/roomescape/SpringJDBCMissionStepTest.java +++ b/src/test/java/roomescape/SpringJDBCMissionStepTest.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.reservation.domain.Reservation; +import roomescape.domain.Reservation; import java.sql.Connection; import java.sql.SQLException; From 38998be3eacf0536f3c828f3dc1823970cf47dd9 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:17:03 +0900 Subject: [PATCH 51/89] =?UTF-8?q?=20=EC=8B=9C=EA=B0=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B7=B0=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=EA=B3=BC=20=EB=A7=A4=ED=95=91=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 --- src/main/java/roomescape/MainPageController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/roomescape/MainPageController.java b/src/main/java/roomescape/MainPageController.java index 7fe55776f..a241a6aac 100644 --- a/src/main/java/roomescape/MainPageController.java +++ b/src/main/java/roomescape/MainPageController.java @@ -15,4 +15,7 @@ public String showHomePage() { public String showReservationForm() { return "reservation"; } + + @GetMapping("/time") + public String showTimeForm() { return "time"; } } From c1a3e0002e79ce4e999a30ec9630a1f1948a3fae Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:21:47 +0900 Subject: [PATCH 52/89] =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20Time=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A0=84=EC=86=A1=20=EA=B0=9D=EC=B2=B4=20TimeDto?= =?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/java/roomescape/domain/Time.java | 18 ++++++++++++++++++ .../roomescape/presentation/dto/TimeDto.java | 9 +++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/roomescape/domain/Time.java create mode 100644 src/main/java/roomescape/presentation/dto/TimeDto.java diff --git a/src/main/java/roomescape/domain/Time.java b/src/main/java/roomescape/domain/Time.java new file mode 100644 index 000000000..9ab58056e --- /dev/null +++ b/src/main/java/roomescape/domain/Time.java @@ -0,0 +1,18 @@ +package roomescape.domain; + +import lombok.Getter; + +@Getter +public class Time { + + private Long id; + private String time; + + public Time() { + } + + public Time(Long id, String time) { + this.id = id; + this.time = time; + } +} diff --git a/src/main/java/roomescape/presentation/dto/TimeDto.java b/src/main/java/roomescape/presentation/dto/TimeDto.java new file mode 100644 index 000000000..c01219462 --- /dev/null +++ b/src/main/java/roomescape/presentation/dto/TimeDto.java @@ -0,0 +1,9 @@ +package roomescape.presentation.dto; + +import jakarta.validation.constraints.NotBlank; + +public record TimeDto( + @NotBlank(message = "에약 시간을 입력하세요.") String time +){ +} + From d6f862d3a0d21d36d2d09f8869be93a054834708 Mon Sep 17 00:00:00 2001 From: goldm0ng Date: Tue, 26 Nov 2024 19:23:45 +0900 Subject: [PATCH 53/89] =?UTF-8?q?=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20TimeRepository=20=EB=B0=8F=20Jdbc=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=20=EA=B5=AC=ED=98=84=EC=B2=B4=20JdbcTimeRepo?= =?UTF-8?q?sitory=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/JdbcTimeRepository.java | 72 +++++++++++++++++++ .../persistence/TimeRepository.java | 16 +++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/roomescape/persistence/JdbcTimeRepository.java create mode 100644 src/main/java/roomescape/persistence/TimeRepository.java diff --git a/src/main/java/roomescape/persistence/JdbcTimeRepository.java b/src/main/java/roomescape/persistence/JdbcTimeRepository.java new file mode 100644 index 000000000..a1ac84e4a --- /dev/null +++ b/src/main/java/roomescape/persistence/JdbcTimeRepository.java @@ -0,0 +1,72 @@ +package roomescape.persistence; + +import lombok.RequiredArgsConstructor; +import org.springframework.dao.EmptyResultDataAccessException; +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.Repository; +import roomescape.domain.Time; +import roomescape.exception.NotFoundTimeException; + +import java.sql.PreparedStatement; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class JdbcTimeRepository implements TimeRepository{ + + private final JdbcTemplate jdbcTemplate; + + @Override + public Time save(Time time) { + String sql = "insert into time (time) values (?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection ->{ + PreparedStatement ps = connection.prepareStatement(sql, new String []{"id"}); + ps.setString(1, time.getTime()); + return ps; + }, keyHolder); + + Long generatedAutoId = keyHolder.getKey().longValue(); + return new Time(generatedAutoId, time.getTime()); + } + + @Override + public Time findById(Long timeId) { + String sql = "select id, time from time where id = ?"; + + try{ + return jdbcTemplate.queryForObject(sql, timeMapper(), timeId); + } catch (EmptyResultDataAccessException e){ + throw new NotFoundTimeException(); + } + } + + @Override + public List