본문 바로가기

clone toy projects/node_expresss_chat

스케쥴링 구현 및 프로젝트 마무리 [흐름만 보기]

카운트다운이 끝나면 더 이상 경매를 진행할 수는 없지만, 아직 낙찰자가 정해지지 않았습니다.

경매 종료를 24시간 후로 정했으므로 경매가 생성되고 24시간이 지난 후에 낙찰자를 정하는 시스템을 구현해야 합니다.

이럴 때 node-schedule 모듈을 사용합니다. 

npm i node-schedule

schedule 객체의 scheduleJob 메서드로 일정을 예약할 수 있습니다. 

첫 번째 인수로 실행될 시각을 넣고, 두 번째 인수로 해당 시각이 되었을 때 수행할 콜백 함수를 넣습니다. 

 

경매 모델에서 가장 높은 가격으로 입찰한 사람을 찾아 상품 모델의 낙찰자 아이디에 넣어주도록 정의했습니다. 

또한, 낙찰자의 보유 자산을 낙찰 금액만큼 뺍니다. 

{컬럼: sequelize.literal(컬럼 - 숫자)}는 시퀄라이즈에서 해당 컬럼의 숫자를 줄이는 방법입니다. 

숫자를 늘리려면 - 대신 +를 하면 됩니다.

node-schedule 패키지의 단점은 스케줄링이 노드 기반으로 작동하므로 노드가 종료되면 스케줄 예약도 같이 종료된다는 점입니다. 

노드를 계속 켜두면 되지만, 서버가 어떤 에러로 인해 종료될지 예측하기는 매우 어렵습니다. 

따라서 이를 보완하기 위한 방법이 필요합니다. 

서버가 시작될 때 경매 시작 후 24시간이 지났지만 낙찰자가 없는 경매를 찾아서 낙찰자를 지정하는 코드를 추가해보겠습니다.

 

낙찰자가 없으면서 생성된 지 24시간이 지난 경매를 찾아 낙찰자를 정합니다.

여기서 주의할 점은 success가 undefined인 경우 에러가 발생한다는 것입니다.

아무도 입찰하지 않은 채 경 매가 끝나면 success가 undefined가 됩니다.

이 경우에 어떻게 대처할지는 직접 코드를 작성 해보세요(13.4.1절 '스스로 해보기' 참조).

낙찰자가 없으면서 생성된 지 24시간이 지나지 않은 경매들은 다시 스케줄링을 등록합니다.
경매 생성일에 24시간을 더한 시간이 종료 시간이 됩니다. 

여기에서도 success가 undefined 인 경우에 대처해야 합니다.
이제 checkAuction을 서버에 연결합니다.

 

 

 

서버를 재시작하면 앞으로 서버를 시작할 때마다 낙찰자를 지정하는 작업을 수행합니다.
checkAuction의 코드는 app.js에 직접 작성해도 되지만 코드가 길어지므로 분리했습니다.
하루가 지나 경매가 마무리되면 node-schedule 모듈이 예정된 스케줄에 따라 낙찰자를 지정합 니다. 

단, 서버가 계속 켜져 있어야 합니다. 서버가 중간에 꺼졌다면,

다시 켤 때 checkAuction.is 코드에 따라 낙찰자를 선정하게 됩니다.
네로가 10,000원에 낙찰받았으므로 보유 자산이 10,000원 차감되고 경매 진행 목록에서 상품이 사라집니다.