
3주차는 페어프로그래밍을 진행해서 딱히 기록하지 않았고 3주차+4주차 합쳐서 작성하겠다 !
⭐schema.sql 수정
CREATE TABLE time
(
id BIGINT NOT NULL AUTO_INCREMENT,
time VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE reservation
(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
date VARCHAR(255) NOT NULL,
time_id BIGINT,
PRIMARY KEY (id),
FOREIGN KEY (time_id) REFERENCES time(id)
);
DDL에서 알 수 있듯이 time 테이블과 reservation 테이블은 time_id라는 외래키로 JOIN하는 관계이다.
⭐ Time 도메인 작성
package roomescape.Domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Time {
private Long id;
private String time;
public Time(Long id, String time){
this.id=id;
this.time=time;
}
@Override
public String toString(){
return time;
}
}
⭐ Reservation 도메인 수정
@Override
public String toString() {
try {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode reservationJson = objectMapper.createObjectNode();
reservationJson.put("id", this.id);
reservationJson.put("name", this.name);
reservationJson.put("date", this.date);
// time 객체 Json으로 변환
String timeJson = objectMapper.writeValueAsString(this.time);
reservationJson.put("time", timeJson);
return objectMapper.writeValueAsString(reservationJson);
} catch (JsonProcessingException e) {
System.err.println("Error converting Reservation object to JSON: " + e.getMessage());
return "{\"error\": \"Failed to convert object to JSON\"}";
}
}
time 필드의 type을 String에서 Time 도메인으로 변경하였다.
그 다음 toString 메소드를 수정해야한다.
time이 더이상 String 필드가 아닌 time 객체이기 때문에 객체를 받아 String으로 전환한 뒤 mapper에 넣어줘야 한다.
⭐ReservationService 수정
@Override
public ResponseEntity<Reservation> addReservation(Reservation reservation) {
validateReservation(reservation);
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", reservation.getName());
parameters.put("date", reservation.getDate());
parameters.put("time", reservation.getTime());
Number newId = jdbcInsert.executeAndReturnKey(parameters);
Reservation addedReservation = jdbcTemplate.queryForObject(
"SELECT r.id as reservation_id, r.name, r.date, t.id as time_id, t.time as time_value FROM reservation as r inner join time as t on r.time_id = t.id WHERE r.id = ?",
new Object[]{newId},
(resultSet, rowNum) -> {
Time time = new Time(resultSet.getLong("time_id"), resultSet.getString("time_value"));
return new Reservation(
resultSet.getLong("reservation_id"),
resultSet.getString("name"),
resultSet.getString("date"),
time);
}
);
HttpHeaders headers = new HttpHeaders();
headers.add("Location", "/reservations/" + newId);
return new ResponseEntity<>(addedReservation, headers, HttpStatus.CREATED);
}
우선 time 객체로 저장해야 하기 때문에 time 객체를 만들기 위한 요소들을 (t.id, t.time)을 select 해오는 쿼리문으로 변경한다. 그 뒤 new 메소드로 Time 객체를 만든 뒤에 Reservation 객체의 필드로 넣으면 된다.

잘 돌아간당 ㅎㅎ