Discord 봇 버튼 클릭 경쟁 조건과 결제대행사 동기화 문제 해결
목차
Discord 봇 기능 작업. 등급봇 race 잔여 차단 — 버튼 즉시 제거 + 결제대행사 sync afterCommit 비동기.
배경
Discord를 내부 운영 도구로 활용 중. 슬래시 커맨드로 특정 동작을 트리거하거나, 시스템 이벤트를 채널에 알림으로 보내는 용도. 개발팀 채널에 커밋/배포 알림을 자동으로 보내면 별도로 공유하는 수고를 덜 수 있음.
구현 내용
- 버튼 클릭 이벤트의 race condition 수정
- 중복 처리 방어를 위한 버튼 즉시 비활성화
- 외부 API 동기화를 afterCommit 훅으로 비동기 처리
멀티 WAS 고려사항
WAS가 여러 대일 때 봇도 여러 인스턴스가 동시에 이벤트를 처리할 수 있음. Leader Election 패턴으로 하나의 인스턴스만 이벤트를 처리하도록 해야 중복 알림이 방지됨.
// Redis를 활용한 간단한 Leader Election
// 인스턴스 중 하나만 "leader" 키를 획득
// leader만 이벤트 처리, 나머지는 skip
설정 변경 시 reload API를 통해 서버 재시작 없이 봇을 갱신할 수 있도록 했음. 멀티 WAS에서는 각 서버에 reload 요청을 보내야 함.
다음
작업 후기
사내 서비스를 만들다 보면 기능 하나가 단순히 화면에 버튼 하나 추가하는 것으로 끝나지 않는다는 걸 계속 체감함. SQL 집계, 상태 머신, 예외 처리, 화면 렌더링, 권한 체크가 모두 엮여 있어서 어느 하나만 빠뜨려도 숫자가 맞지 않거나 특정 사용자에게 이상한 화면이 나타남.
특히 금융/결제 도메인은 숫자 하나가 틀리면 신뢰가 무너질 수 있어서 꼼꼼함이 기본값이어야 함. "대충 맞는 것 같다"로 넘어가면 나중에 반드시 다시 돌아옴.
개발 방식
- 변경 전 현재 동작 스크린샷이나 수치 메모
- 수정 후 같은 케이스로 확인
- 관련 화면이 있으면 숫자 cross-check
- 커밋 메시지는 "무엇을" 보다 "왜"를 담으려고 노력
작은 커밋을 자주 하면 문제가 생겼을 때 어느 변경에서 깨졌는지 찾기 훨씬 쉬움. 그래서 논리적으로 독립된 단위로 커밋을 쪼개는 습관을 유지 중.
다음
댓글 0
첫 댓글 달아줘.