좌석 서비스를 예약 도중 버그를 발견을 해서 기록을 남기고자 작성한 글입니다.
예시 상황을 들겠습니다.
A라는 사용자와 B라는 사용자가 있습니다.
둘다 좌석 예약 페이지를 보고 있습니다.
만약 A 사용자가 1번 좌석을 예약 했지만 B 사용자는 페이지 새로고침이 안되어 있는 상황이라 1번 좌석이 비어있는 것으로 나오고 있습니다.
이 상황에서 B사용자가 1번 좌석을 예약하면 똑같은 좌석이 동시에 두번 예약이 되는 상황이였습니다.
위 gif 파일을 보시면 알 수 있듯이 좌석테이블에 예약테이블을 JOIN 해서 갖고오기 때문에 하나의 좌석이 두번 표시되고 있었습니다.
그래서 검증 프로세스를 하나 더 추가했습니다
- 로그인을 했는지
- 예약을 할 그 자리가 비어 있는지(추가)
- 로그인한 사람이 이미 다른 좌석을 예약 했는지
먼저 결과부터 보여드리겠습니다.
이미 예약된 좌석은 예약되지 않는걸 보실 수 있습니다.
Controller 코드 입니다.
@PostMapping(value= "/seat/{seatId}", produces = "application/json; charset=UTF-8")
public ResponseEntity<String> seatReservation(
Principal principal,
@PathVariable int seatId) throws Exception {
Long studentNumber = Long.valueOf( principal.getName() );
this.seatReservationService.seatReservation(studentNumber, seatId);
return new ResponseEntity<String>("열람실 예약에 성공하였습니다.", HttpStatus.CREATED);
}
Service 코드 입니다.
@Override
@Transactional
public void seatReservation(Long studentNumber, int seatId) throws Exception {
// 로그인을 했는지
if (studentNumber == null) {
throw new Exception();
}
// 그 자리에 예약이 있는지
if (this.homeMapper.isSeatReservation(seatId) == 1) {
throw new SeatReservationException("already reservation", ErrorCode.ALREADY_SEAT_RESERVATION);
}
// 로그인한 사람이 예약을 했는지
if (this.homeMapper.checkReservation(studentNumber) == 1) {
throw new SeatReservationException("already user reservation", ErrorCode.ALREADY_USER_SEAT_RESERVATION);
}
int seatReservationCnt = this.homeMapper.seatReservation(studentNumber, seatId);
} // seatReservation
검증 프로세스를 추가하니
1. 하나의 좌석이 두번 예약이 되던 버그가 다시 발생하지 않았습니다.
2. Controller에서 검증하던 코드들을 한번에 검증할 수 있도록 Service 코드에서 검증할 수 있도록 개선했습니다.
3. Exception을 Custom화 해서 개선했습니다.
'Projects > 열람실 & 도서관 프로젝트' 카테고리의 다른 글
[Spring](도서관/열람실 프로젝트) 좌석 예약 서비스 구현 (0) | 2024.04.22 |
---|