안녕하세요 @realmankwon입니다.
빨리 끝날 줄 알았던 SVC 보팅 자동화가 생각보다 오랫동안 작업을 하게 되었습니다.
기존에 반환 로직이 없었는데 생각보다 잦은 중복 전송으로 추가를 하게 되면서 작업량이 좀 늘었습니다.
아무래도 키체인에서 연속으로 2번을 누르게 되는 경우가 많이 발생을 하는 듯 합니다.
어쨌든 끝날 듯 끝나지 않는 반환 로직 때문에 며칠 정도 고심에 고심을 하고 있었습니다.
그러다 보니 며칠동안 계속 SVC 자동화로 비슷한 내용을 포스팅하게 되어 조금은 머슥합니다. ^^;;
기존 SVC 로직은 다음과 같습니다.
- 보팅 마나 98% 이상 확인
- 최근 전송 내역 50건 조회
- 보팅 여부 확인(API 에서 확인)
- 소각 여부 확인(DB 에서 확인)
- 둘다 해당 사항이 없으면 보팅 후 소각
- ^^ 댓글 작성
이때 중복 전송 처리가 어려웠던 이유는 바로 최근 전송 내역 50건 조회 때문입니다.
보팅 마나가 98%가 되어 최근 전송 내역 50건을 조회하면 그 중에 보팅 & 소각되지 않은 가장 오래된 건이 보팅 후 소각이 됩니다.
그 다음 다시 보팅 마나가 98%가 되어 또 50건을 조회하면 그 50건에는 이전에 보팅되고 소각된 정보가 똑같이 가져와지기 때문에 단순히 포스팅 주소로만 해 버리면 2건이 반환이 될수 있기 때문입니다.
즉 보팅 & 소각 여부의 판단은 쉬우나 이건이 반환을 해야하는 건인지의 판단은 중복으로 가지고 온 전송내역으로는 판단하기 어려운 것입니다.
이것을 해결하기 위해서 결국은 DB에 가장 마지막에 보팅한 포스팅의 timestamp를 입력하고 최근 50건을 조회한 후 timestamp 이후의 정보만 필터링하여 처리하도록 로직을 전면 수정하였습니다.
이후 보팅 & 소각이 되었는데 동일한 포스팅 주소라면 해당 timestamp값으로 반환된 내역을 확인하고 반환된 내역이 없으면 반환처리를 하도록 변경하였습니다.
let svclist = await getScotTokenTransferAsync(svcQuery);
svclist = svclist.filter(data => data.to == 'svc.refund');
svclist = svclist.filter(data => new Date(data.timestamp) > new Date(last_voting_date.read_dte));
svclist = svclist.sort((a, b) => {
return new Date(a.timestamp) - new Date(b.timestamp);
})
위와같이 소스를 변경하였습니다.
또한 반환 로직과 보팅 로직을 별도의 트랜잭션으로 분리시켜서 반환로직에서 exception 이 발생하더라도 보팅은 정상적으로 이루어지게 처리하였습니다.
반환이 되지 않은게 확인되면 추후 처리하면 되지만 보팅은 지속적으로 이루져야 하니까요.
테스트를 통해서 총 3건의 반환이 이루어졌습니다.
아래 2건은 테스트를 위해서 전송한 것인데 테스트 중 로컬과 서버의 시간대역이 달라서 엉뚱한 포스팅으로 반환이 되었지만 개수에는 문제가 없어서 그대로 두었습니다.
소스는 서버에 반영을 하였고 이제부터는 정상적으로 완전 자동 반환이 이루어질 것 같습니다.
그래도 내일까지 계속 지켜봐야겠습니다.