문제
이번 주차를 지나며 겪었던 문제가 무엇이었나요?
-> 대기열 구현이 가장 어려웠던 것 같습니다.
시도
문제를 해결하기 위해 어떤 시도를 하셨나요?
-> 대기열 구현을 위해 처음에는 수동으로 대기열을 확인하는 API를 풀링으로 호출할 때 마다 대기열 순서대로 활성화를 시키려고 했습니다. 다만, 이 방법을 사용하면 풀링을 하지 않으면 계속 활성화 할 수 있는 공간이 남아서, 문제가 발생할 수 있다는 걸 알았습니다.
해결
문제를 어떻게 해결하셨나요?
-> 스케줄러를 사용해보기로 하였습니다. 정해진 시각마다 순차적으로 대기열에서 활성화열로 옮기는 작업을 진행하였습니다. 그러면 풀링을 하지 않아도 계속해서 빈자리가 발생할 때 마다 토큰을 활성화 시키게 됩니다.
@Component
@RequiredArgsConstructor
@Slf4j
public class SeatScheduler { //좌석 관련 스케줄러
private final ReservationFacade reservationFacade;
@Scheduled(fixedRate = 5000) // 매 5초마다 스케줄러 실행
public void checkOccupiedSeat() {
log.info("5초 마다 예약 후, 5분이 지났는지 체크하는 스케줄러 실행");
reservationFacade.checkOccupiedSeat();
}
}
@Component
@RequiredArgsConstructor
@Slf4j
public class WaitingQueueScheduler { // 대기열 관련 스케줄러
private final WaitingQueueFacade waitingQueueFacade;
@Scheduled(fixedRate = 5000) // 매 5초마다 스케줄러 실행
public void activeToken() {
log.info("token을 active하는 스케줄러 실행");
waitingQueueFacade.active();
}
@Scheduled(cron = "0 0 0 * * *") // 매일 자정마다 스케줄러 실행
public void deleteAllExpireWaitingQueue() {
log.info("expired 된 토큰 삭제 스케줄러 실행");
waitingQueueFacade.deleteAllExpireToken();
}
}
이런식으로 스케줄러를 돌려서 예약하고 5분이 지나면 좌석 점유가 풀리는 것과 주기적으로 토큰을 활성화 시키는 로직을 모두 해결할 수 있었습니다. 다만 정해진 시각마다 스케줄러가 돌기 때문에 조금의 오차가 발생할 것으로 예상됩니다.
알게된 것
문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요?
-> 스케줄러를 통해 정해진 로직을 반복적으로 수행하면 대기열을 구현할 수 있다는 것을 알았습니다.
지난 목표 회고
지난 주에 설정해두었던 목표는 달성하셨나요? 잘된 것은 무엇이고 안된 것은 무엇인가요?
-> 네 기한 안에 과제 제출을 하여 목표를 달성하였습니다. 그리고 TDD를 통해서 개발을 진행하니 테스트케이스를 좀 더 생각하지 않아도 로직을 다 구현하면 더 생각할게 없다는 것을 깨달았습니다.
다음 목표 설정
반복적인 성장을 위한 실천 가능한 단기적인 목표를 설정해보세요!
-> 객체 지향적으로 어떻게 코드를 짜면 좋을지 좀 더 고민해보겠습니다.