Skip to content

Commit 98a12d4

Browse files
committed
9단계 - 기존 코드 수정
1 parent fb0c928 commit 98a12d4

File tree

4 files changed

+101
-42
lines changed

4 files changed

+101
-42
lines changed

src/main/java/roomescape/controller/ReservationController.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package roomescape.controller;
22

3-
import org.springframework.http.HttpHeaders;
43
import org.springframework.http.HttpStatus;
54
import org.springframework.http.ResponseEntity;
65
import org.springframework.jdbc.core.JdbcTemplate;
@@ -9,10 +8,10 @@
98
import org.springframework.jdbc.support.KeyHolder;
109
import org.springframework.stereotype.Controller;
1110
import org.springframework.web.bind.annotation.*;
12-
import roomescape.exception.InvalidReservationException;
1311
import roomescape.exception.NotFoundReservationException;
1412
import roomescape.model.Reservation;
1513
import roomescape.model.ReservationRequest;
14+
import roomescape.model.Time;
1615

1716
import java.net.URI;
1817
import java.sql.PreparedStatement;
@@ -28,46 +27,63 @@ public ReservationController(JdbcTemplate jdbcTemplate) {
2827
}
2928

3029
private final RowMapper<Reservation> reservationRowMapper = (rs, rowNum) -> new Reservation(
31-
rs.getLong("id"),
30+
rs.getLong("reservation_id"),
3231
rs.getString("name"),
3332
rs.getString("date"),
34-
rs.getString("time")
33+
new Time(rs.getLong("time_id"), rs.getString("time_value"))
3534
);
3635

3736
// 예약 관리 페이지
3837
@GetMapping("/reservation")
3938
public String reservationPage() {
40-
return "reservation";
39+
return "new-reservation";
4140
}
4241

4342
// 예약 조회
4443
@GetMapping("/reservations")
4544
@ResponseBody
46-
public List<Reservation> getReservations() {
47-
String sql = "SELECT id, name, date, time FROM reservation";
48-
return jdbcTemplate.query(sql, reservationRowMapper);
45+
public ResponseEntity<List<Reservation>> getReservations() {
46+
String sql = """
47+
SELECT
48+
r.id as reservation_id,
49+
r.name,
50+
r.date,
51+
t.id as time_id,
52+
t.time as time_value
53+
FROM reservation as r
54+
INNER JOIN time as t
55+
ON r.time_id = t.id
56+
""";
57+
List<Reservation> reservations = jdbcTemplate.query(sql, reservationRowMapper);
58+
return ResponseEntity.ok(reservations);
4959
}
5060

5161
// 예약 추가
5262
@PostMapping("/reservations")
63+
@ResponseBody
5364
public ResponseEntity<Reservation> addReservation(@RequestBody ReservationRequest request) {
54-
request.validate();
55-
56-
Reservation newReservation = new Reservation(null, request.getName(), request.getDate(), request.getTime());
65+
request.validateAndSetTimeId(jdbcTemplate);
5766

58-
String sql = "INSERT INTO reservation (name, date, time) VALUES (?, ?, ?)";
67+
// 예약 추가
68+
String sql = "INSERT INTO reservation (name, date, time_id) VALUES (?, ?, ?)";
5969
KeyHolder keyHolder = new GeneratedKeyHolder();
6070

6171
jdbcTemplate.update(connection -> {
62-
PreparedStatement ps = connection.prepareStatement(sql, new String[] {"id"});
63-
ps.setString(1, newReservation.getName());
64-
ps.setString(2, newReservation.getDate());
65-
ps.setString(3, newReservation.getTime());
72+
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
73+
ps.setString(1, request.getName());
74+
ps.setString(2, request.getDate());
75+
ps.setLong(3, request.getTimeId());
6676
return ps;
6777
}, keyHolder);
6878

6979
Long id = keyHolder.getKey().longValue();
70-
newReservation.setId(id);
80+
81+
String timeQuery = "SELECT time FROM time WHERE id = ?";
82+
String timeValue = jdbcTemplate.queryForObject(timeQuery, String.class, request.getTime());
83+
84+
Reservation newReservation = new Reservation(id, request.getName(), request.getDate(),
85+
new Time(request.getTimeId(), timeValue));
86+
7187

7288
return ResponseEntity.created(URI.create("/reservations/" + id)).body(newReservation);
7389
}

src/main/java/roomescape/model/Reservation.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@ public class Reservation {
44
private Long id;
55
private String name;
66
private String date;
7-
private String time;
7+
private Time time;
88

9-
// 기본 생성자를 추가 하는 이유
10-
// 1. Jackson과의 호환성 및 역직렬화 원활
11-
// 2. 객체를 생성할 때 기본 생서자로 빈 객체를 만든 후 필드를 하나씩 채워 넣는다.
12-
// 기본 생성자를 추가하지 않고 @JsonCreator와 @JsonProperty를 사용하는 방법도 있음.
139
public Reservation() {
1410
}
1511

16-
public Reservation(Long id, String name, String date, String time) {
12+
public Reservation(Long id, String name, String date, Time time) {
1713
this.id = id;
1814
this.name = name;
1915
this.date = date;
@@ -32,11 +28,23 @@ public String getName() {
3228
return name;
3329
}
3430

31+
public void setName(String name) {
32+
this.name = name;
33+
}
34+
3535
public String getDate() {
3636
return date;
3737
}
3838

39-
public String getTime() {
39+
public void setDate(String date) {
40+
this.date = date;
41+
}
42+
43+
public Time getTime() {
4044
return time;
4145
}
46+
47+
public void setTime(Time time) {
48+
this.time = time;
49+
}
4250
}
Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,72 @@
11
package roomescape.model;
22

3+
import org.springframework.dao.EmptyResultDataAccessException;
4+
import org.springframework.jdbc.core.JdbcTemplate;
35
import roomescape.exception.InvalidReservationException;
46

57
public class ReservationRequest {
68
private String name;
79
private String date;
810
private String time;
11+
private Long timeId;
912

10-
public ReservationRequest() {}
13+
public ReservationRequest() {
14+
}
1115

12-
public ReservationRequest(String name, String date, String time) {
16+
public ReservationRequest(String name, String date, String timeId) {
1317
this.name = name;
1418
this.date = date;
15-
this.time = time;
19+
this.time = timeId;
1620
}
1721

1822
public String getName() {
1923
return name;
2024
}
2125

26+
public void setName(String name) {
27+
this.name = name;
28+
}
29+
2230
public String getDate() {
2331
return date;
2432
}
2533

34+
public void setDate(String date) {
35+
this.date = date;
36+
}
37+
2638
public String getTime() {
2739
return time;
2840
}
2941

30-
// 검증 메서드 추가
31-
public void validate() {
32-
if (name == null || name.isEmpty() ||
33-
date == null || date.isEmpty() ||
34-
time == null || time.isEmpty()) {
35-
throw new InvalidReservationException("필요한 인자가 없습니다.");
42+
public void setTime(String time) {
43+
this.time = time;
44+
}
45+
46+
public Long getTimeId() {
47+
return timeId;
48+
}
49+
50+
public void validateAndSetTimeId(JdbcTemplate jdbcTemplate) {
51+
if (name == null || name.isEmpty() || date == null || date.isEmpty() || time == null || time.isEmpty()) {
52+
throw new InvalidReservationException("필수 입력값이 누락되었습니다.");
53+
}
54+
55+
try {
56+
timeId = Long.parseLong(time);
57+
} catch (NumberFormatException e) {
58+
throw new InvalidReservationException("유효하지 않은 timeId입니다: " + time);
59+
}
60+
61+
String timeQuery = "SELECT time FROM time WHERE id = ?";
62+
try {
63+
// timeId로 유효성 검사
64+
String resolvedTime = jdbcTemplate.queryForObject(timeQuery, String.class, timeId);
65+
if (resolvedTime == null) {
66+
throw new InvalidReservationException("유효하지 않은 timeId입니다: " + timeId);
67+
}
68+
} catch (EmptyResultDataAccessException e) {
69+
throw new InvalidReservationException("유효하지 않은 시간입니다: " + timeId);
3670
}
3771
}
3872
}

src/main/resources/schema.sql

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
CREATE TABLE reservation
2-
(
3-
id BIGINT NOT NULL AUTO_INCREMENT,
4-
name VARCHAR(255) NOT NULL,
5-
date VARCHAR(255) NOT NULL,
6-
time VARCHAR(255) NOT NULL,
7-
PRIMARY KEY (id)
8-
);
9-
101
CREATE TABLE time
112
(
123
id BIGINT NOT NULL AUTO_INCREMENT,
134
time VARCHAR(255) NOT NULL,
145
PRIMARY KEY (id)
6+
);
7+
8+
CREATE TABLE reservation
9+
(
10+
id BIGINT NOT NULL AUTO_INCREMENT,
11+
name VARCHAR(255) NOT NULL,
12+
date VARCHAR(255) NOT NULL,
13+
time_id BIGINT,
14+
PRIMARY KEY (id),
15+
FOREIGN KEY (time_id) REFERENCES time(id)
1516
);

0 commit comments

Comments
 (0)