findTimeByCond(): restaurantId, date, seatType, headCount를 파라미터로 받아 조건에 부합하는 예약 가능 좌석의 시간 리스트를 반환
updatePastDates(): date, today를 파라미터로 받아 availableDate 컬럼 값이 today 이전인 경우 값을 date로 변경하고, 해당 로우의 availableQuantity의 값도 quantity의 값으로 초기화
Service
SeatRepository를 의존성으로 갖는 SeatService 클래스를 추가함
add(): 자리 신규 등록
이 때 클라이언트는 날짜가 아닌 시간만 골라서 넘겨주면, 등록일 포함 RESERVABLE_DATE_LIMIT일치의 예약 가능 날짜 데이터를 포함해서 Seat을 생성 후 저장함.
search(): 예약 가능한 자리의 시간 검색
updatePastDates(): 매일 오전 3시에 자동 실행됨. 지나간 날짜를 가진 자리 데이터를 자체적으로 업데이트
@Scheduled를 사용해서 특정한 시간 주기로 자동 실행될 수 있게 설정함.
Controller
SeatService를 의존성으로 갖는 SeatController 클래스를 추가함
API 상세
Method
Endpoint
Parameters
Authorities
Success
Fail
POST
/restaurants/{restaurantId}/seats
없음
OWNER
200
400
GET
/restaurants/{restaurantId}/seats
date, seatType, headCount
CUSTOMER, OWNER
200
404
@PreAuthorize로 Seat 등록에 대해서는 OWNER 권한이 있는 사용자만 접근할 수 있도록 제한
Seat은 Restaurant에 종속적인 개념이기 때문에 API Endpoint를 restaurants 하위로 오게 설계함
테스트 코드
SeatServiceTest: SeatService의 메서드에 대한 단위 테스트 진행
SeatControllerTest: SeatController의 메서드에 대한 단위 테스트 진행 (WebMvcTest)
기타
Seat의 데이터를 수정하거나 삭제하는 기능을 구현하지 않음
updatePastDates()는 클라이언트 요청에 의해 호출되는 것이 아닌 내부적으로 호출되는 메서드이므로 논외
Seat은 Reservation과 1대1 연관 관계를 가지고 있기 때문에, 특정 Seat에 대한 Reservation이 생성된 뒤에 Seat 데이터가 변경되면 Reservation 조회 시의 데이터에도 문제가 생길 수 있다고 판단함. 이 부분은 추후 Reservation API 구현 과정에서 적절한 해결책을 찾아야할 것으로 보임.
구현 내용
Repository
Spring Data JPA 방식의 SeatRepository 인터페이스를 추가함
findTimeByCond()
:restaurantId
,date
,seatType
,headCount
를 파라미터로 받아 조건에 부합하는 예약 가능 좌석의 시간 리스트를 반환updatePastDates()
:date
,today
를 파라미터로 받아availableDate
컬럼 값이today
이전인 경우 값을date
로 변경하고, 해당 로우의availableQuantity
의 값도quantity
의 값으로 초기화Service
SeatRepository를 의존성으로 갖는 SeatService 클래스를 추가함
add()
: 자리 신규 등록search()
: 예약 가능한 자리의 시간 검색updatePastDates()
: 매일 오전 3시에 자동 실행됨. 지나간 날짜를 가진 자리 데이터를 자체적으로 업데이트Controller
SeatService를 의존성으로 갖는 SeatController 클래스를 추가함
API 상세
테스트 코드
기타
Seat의 데이터를 수정하거나 삭제하는 기능을 구현하지 않음
Seat은 Reservation과 1대1 연관 관계를 가지고 있기 때문에, 특정 Seat에 대한 Reservation이 생성된 뒤에 Seat 데이터가 변경되면 Reservation 조회 시의 데이터에도 문제가 생길 수 있다고 판단함. 이 부분은 추후 Reservation API 구현 과정에서 적절한 해결책을 찾아야할 것으로 보임.