diff --git a/src/main/java/roomescape/reservation/Reservation.java b/src/main/java/roomescape/reservation/Reservation.java index 4acc267f9..224cb40cd 100644 --- a/src/main/java/roomescape/reservation/Reservation.java +++ b/src/main/java/roomescape/reservation/Reservation.java @@ -1,7 +1,8 @@ package roomescape.reservation; +import roomescape.time.Time; + import java.time.LocalDate; -import java.time.LocalTime; import java.util.Objects; public class Reservation { @@ -12,20 +13,20 @@ public class Reservation { private final LocalDate date; - private final LocalTime time; + private final Time time; - private Reservation(Long id, String name, LocalDate date, LocalTime time) { + private Reservation(Long id, String name, LocalDate date, Time time) { this.id = id; this.name = Objects.requireNonNull(name, "이름은 필수입니다."); this.date = Objects.requireNonNull(date, "예약 날짜는 필수 입니다."); this.time = Objects.requireNonNull(time, "예약 시간은 필수입니다."); } - public static Reservation ofNew(String name, LocalDate date, LocalTime time) { + public static Reservation ofNew(String name, LocalDate date, Time time) { return new Reservation(null, name, date, time); } - public static Reservation ofExist(Long id, String name, LocalDate date, LocalTime time) { + public static Reservation ofExist(Long id, String name, LocalDate date, Time time) { return new Reservation(id, name, date, time); } @@ -41,7 +42,7 @@ public LocalDate getDate() { return date; } - public LocalTime getTime() { + public Time getTime() { return time; } } diff --git a/src/main/java/roomescape/reservation/controller/ReservationCommandController.java b/src/main/java/roomescape/reservation/controller/ReservationCommandController.java index 007df038f..00266be51 100644 --- a/src/main/java/roomescape/reservation/controller/ReservationCommandController.java +++ b/src/main/java/roomescape/reservation/controller/ReservationCommandController.java @@ -6,6 +6,8 @@ import roomescape.reservation.ReservationDao; import roomescape.reservation.dto.ReservationCreateRequest; import roomescape.reservation.dto.ReservationCreateResponse; +import roomescape.time.Time; +import roomescape.time.TimeDao; import java.net.URI; import java.net.URISyntaxException; @@ -15,9 +17,11 @@ public class ReservationCommandController { private final ReservationDao reservationDao; + private final TimeDao timeDao; - public ReservationCommandController(ReservationDao reservationDao) { + public ReservationCommandController(ReservationDao reservationDao, TimeDao timeDao) { this.reservationDao = reservationDao; + this.timeDao = timeDao; } @GetMapping("/reservations") @@ -28,10 +32,13 @@ public ResponseEntity> getReservationList() { @PostMapping("/reservations") public ResponseEntity createReservation(@RequestBody ReservationCreateRequest request) throws URISyntaxException { + Time time = timeDao.findById(request.getTime()) + .orElseThrow(); + Long id = reservationDao.save(Reservation.ofNew( request.getName(), request.getDate(), - request.getTime() + time )); URI uri = new URI("/reservations/" + id); diff --git a/src/main/java/roomescape/reservation/controller/ReservationController.java b/src/main/java/roomescape/reservation/controller/ReservationController.java index 4b8f2d386..468d10dc3 100644 --- a/src/main/java/roomescape/reservation/controller/ReservationController.java +++ b/src/main/java/roomescape/reservation/controller/ReservationController.java @@ -8,6 +8,6 @@ public class ReservationController { @GetMapping("/reservation") public String getReservationPage() { - return "reservation"; + return "new-reservation"; } } diff --git a/src/main/java/roomescape/reservation/dto/ReservationCreateRequest.java b/src/main/java/roomescape/reservation/dto/ReservationCreateRequest.java index ae0becbf2..0e863e680 100644 --- a/src/main/java/roomescape/reservation/dto/ReservationCreateRequest.java +++ b/src/main/java/roomescape/reservation/dto/ReservationCreateRequest.java @@ -1,7 +1,6 @@ package roomescape.reservation.dto; import java.time.LocalDate; -import java.time.LocalTime; public class ReservationCreateRequest { @@ -9,7 +8,7 @@ public class ReservationCreateRequest { private LocalDate date; - private LocalTime time; + private Long time; public String getName() { return name; @@ -19,8 +18,7 @@ public LocalDate getDate() { return date; } - public LocalTime getTime() { + public Long getTime() { return time; } - } diff --git a/src/main/java/roomescape/reservation/infra/ReservationDaoImpl.java b/src/main/java/roomescape/reservation/infra/ReservationDaoImpl.java index 926825c85..52a51215e 100644 --- a/src/main/java/roomescape/reservation/infra/ReservationDaoImpl.java +++ b/src/main/java/roomescape/reservation/infra/ReservationDaoImpl.java @@ -9,10 +9,10 @@ import roomescape.exception.NotFoundReservationException; import roomescape.reservation.Reservation; import roomescape.reservation.ReservationDao; +import roomescape.time.Time; import java.sql.Date; import java.sql.PreparedStatement; -import java.sql.Time; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -20,11 +20,14 @@ @Repository public class ReservationDaoImpl implements ReservationDao { - private static final RowMapper ALL_RESERVATION_ROW_MAPPER = (rs, rowNum) -> Reservation.ofExist( + private static final RowMapper RESERVATION_ROW_MAPPER = (rs, rowNum) -> Reservation.ofExist( rs.getLong("id"), rs.getString("name"), rs.getDate("date").toLocalDate(), - rs.getTime("time").toLocalTime() + Time.ofExist( + rs.getLong("time_id"), + rs.getTime("time_value").toLocalTime() + ) ); private final JdbcTemplate jdbcTemplate; @@ -35,14 +38,19 @@ public ReservationDaoImpl(JdbcTemplate jdbcTemplate) { @Override public Optional findById(Long id) { - String sql = "SELECT * FROM reservation WHERE id = ?"; + String sql = """ + SELECT + r.id as reservation_id, + r.name, + r.date, + t.id as time_id, + t.time as time_value + FROM reservation r + INNER JOIN reservation_time t ON r.time_id = t.id + WHERE r.id = ? + """; try { - Reservation reservation = jdbcTemplate.queryForObject(sql, (rs, rowNum) -> Reservation.ofExist( - rs.getLong("id"), - rs.getString("name"), - rs.getDate("date").toLocalDate(), - rs.getTime("time").toLocalTime() - ), id); + Reservation reservation = jdbcTemplate.queryForObject(sql, RESERVATION_ROW_MAPPER, id); return Optional.ofNullable(reservation); } catch (EmptyResultDataAccessException e) { return Optional.empty(); @@ -52,20 +60,29 @@ public Optional findById(Long id) { @Override public List findAll() { - String sql = "SELECT * FROM reservation"; - return jdbcTemplate.query(sql, ALL_RESERVATION_ROW_MAPPER); + String sql = """ + SELECT + r.id AS reservation_id, + r.name, + r.date, + t.id AS time_id, + t.time AS time_value + FROM reservation r + INNER JOIN reservation_time t ON r.time_id = r.id + """; + return jdbcTemplate.query(sql, RESERVATION_ROW_MAPPER); } @Override public Long save(Reservation reservation) { - String sql = "INSERT INTO reservation (name, date, time) VALUES (?, ?, ?)"; + String sql = "INSERT INTO reservation (name, date, time_id) VALUES (?, ?, ?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"}); ps.setString(1, reservation.getName()); ps.setDate(2, Date.valueOf(reservation.getDate())); - ps.setTime(3, Time.valueOf(reservation.getTime())); + ps.setLong(3, reservation.getTime().getId()); return ps; }, keyHolder); diff --git a/src/main/java/roomescape/time/Time.java b/src/main/java/roomescape/time/Time.java new file mode 100644 index 000000000..fca77e337 --- /dev/null +++ b/src/main/java/roomescape/time/Time.java @@ -0,0 +1,31 @@ +package roomescape.time; + +import java.time.LocalTime; + +public class Time { + + private Long id; + + private LocalTime time; + + private Time(Long id, LocalTime time) { + this.id = id; + this.time = time; + } + + public static Time ofNew(LocalTime time) { + return new Time(null, time); + } + + public static Time ofExist(Long id, LocalTime time) { + return new Time(id, time); + } + + public Long getId() { + return id; + } + + public LocalTime getTime() { + return time; + } +} diff --git a/src/main/java/roomescape/time/TimeDao.java b/src/main/java/roomescape/time/TimeDao.java new file mode 100644 index 000000000..1adc744cd --- /dev/null +++ b/src/main/java/roomescape/time/TimeDao.java @@ -0,0 +1,17 @@ +package roomescape.time; + +import java.util.List; +import java.util.Optional; + +public interface TimeDao { + + Optional