[Spring](도서관/열람실 프로젝트) 좌석 예약 서비스 개선기

2024. 4. 22. 22:29·Projects/열람실 & 도서관 프로젝트

좌석 서비스를 예약 도중 버그를 발견을 해서 기록을 남기고자 작성한 글입니다.

​

 

예시 상황을 들겠습니다.

A라는 사용자와 B라는 사용자가 있습니다.

​

둘다 좌석 예약 페이지를 보고 있습니다.

​

만약 A 사용자가 1번 좌석을 예약 했지만 B 사용자는 페이지 새로고침이 안되어 있는 상황이라 1번 좌석이 비어있는 것으로 나오고 있습니다.

​

이 상황에서 B사용자가 1번 좌석을 예약하면 똑같은 좌석이 동시에 두번 예약이 되는 상황이였습니다.

위 gif 파일을 보시면 알 수 있듯이 좌석테이블에 예약테이블을 JOIN 해서 갖고오기 때문에 하나의 좌석이 두번 표시되고 있었습니다.

​

그래서 검증 프로세스를 하나 더 추가했습니다

  1. 로그인을 했는지
  2. 예약을 할 그 자리가 비어 있는지(추가)
  3. 로그인한 사람이 이미 다른 좌석을 예약 했는지

​

먼저 결과부터 보여드리겠습니다.

 

이미 예약된 좌석은 예약되지 않는걸 보실 수 있습니다.

​

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
'Projects/열람실 & 도서관 프로젝트' 카테고리의 다른 글
  • [Spring](도서관/열람실 프로젝트) 좌석 예약 서비스 구현
Economy98
Economy98
공부하고 기록하기
  • Economy98
    Economy_Dev
    Economy98
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • Spring Framework (11)
      • BOJ, Programmers (22)
      • Java (4)
      • JDBC (6)
      • JPA (9)
      • Spring Transaction (3)
      • Algorithm (1)
      • Web (5)
      • Projects (2)
        • 쇼핑몰 프로젝트 (0)
        • 열람실 & 도서관 프로젝트 (2)
      • Network (2)
      • 나의 공부방 (5)
      • 끄적끄적 (1)
      • Error Log (3)
      • CS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    java
    정렬
    트랜잭션
    Spring
    브루트포스 알고리즘
    스프링부트
    propagation
    jdbc
    restful api
    그리디 알고리즘
    스프링
    다이나믹 프로그래밍
    백준 풀이
    자바 문제
    자바
    예외 처리
    백준
    백준 자바 풀이
    JPA
    자바 문제 풀이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Economy98
[Spring](도서관/열람실 프로젝트) 좌석 예약 서비스 개선기
상단으로

티스토리툴바