2023-10-24-TIL
Today I Learned
예약 시스템
링크한 글은 Spring Boot로 좌석 예약 기능을 만드는 연재의 첫 편이다. 좌석 선택, 연·월·일 표시, 날짜 선택, 가능한 시간 표시, 예약 완료 순서로 흐름을 잡고, LocalDate와 YearMonth로 달의 길이와 1일의 요일을 계산해 달력을 그린다. 지난 날짜, 이미 마감된 날짜, 지난 시간대는 선택할 수 없게 막는다. 마감 여부는 날짜별 예약 수를 세어서 최대 인원과 비교하는 방식으로 판단한다.
예약 시스템에서 화면 다음으로 고민할 부분은 동시성이다. “예약 수를 세고, 자리가 남았으면 저장한다”는 두 단계 사이에 다른 요청이 끼어들면, 둘 다 자리가 남았다고 판단하고 정원을 넘겨 저장할 수 있다. 버튼을 비활성화하는 것은 화면 차원의 안내일 뿐이고, 서버에서 막아야 한다. 대표적인 방법은 다음과 같다.
- 잠금 읽기: MySQL에서는
SELECT ... FOR UPDATE로 읽은 행을 트랜잭션이 끝날 때까지 잠근다. 다른 트랜잭션은 그 행을 고치거나 잠금 읽기를 할 수 없다(MySQL 문서). - 유니크 제약: 좌석과 시간대 조합에 유니크 인덱스를 두면, 같은 자리를 두 번 저장하려는 두 번째 요청은 DB가 거부한다.
- 줄 세우기: 예약 요청을 큐에 넣고 하나씩 처리한다.
정원이 1명인 좌석이면 유니크 제약이 가장 단순하고, 정원이 여러 명이면 잔여 수량 행을 잠그고 줄이는 방식이 맞다.
- https://cordingmonster.tistory.com/138
Can I Use?
Can I use는 웹 기술의 브라우저 지원 현황을 표로 보여 주는 사이트다. 소개 페이지에 따르면 지원 데이터는 GitHub의 커뮤니티 기여로 관리하고, 브라우저 사용 비율은 StatCounter GlobalStats 데이터를 쓴다. CSS 속성이나 JavaScript API 이름을 검색하면 브라우저와 버전별로 지원 여부가 나오고, 그 기능을 쓸 수 있는 사용자 비율도 함께 보여 준다. 새 API를 도입하기 전에 대상 사용자 환경에서 동작하는지, 폴리필이 필요한지 판단하는 근거로 쓴다.
- https://caniuse.com/
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.
댓글
아직 댓글이 없습니다