초록 스터디 3기 4주차 - JDBC를 활용한 방탈출 API 작성 (2)

코코코딩을 합시다·2024년 4월 9일
post-thumbnail

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 객체의 필드로 넣으면 된다.

잘 돌아간당 ㅎㅎ

profile
좋아하는 걸로 밥 벌어먹기

0개의 댓글