공부한것들을 정리하는 블로그 입니다.
DB 시퀀스를 통한 일련번호 채번 시 주의(중복채번, 다중DB) 본문
* 해당 글은 계속 수정 예정입니다.
최초 작성일 2022.12.12
마지막 수정일 2023.04
# 현금영수증 서비스?
현금영수증 서비스는 현금성 결제에 대한 국세청 영수증을 발급해주는 서비스이다.
실시간 계좌이체, 가상계좌 등 현금성 결제 성공 후 서비스가 호출되는 경우도 있고, (이 경우 트랜잭션/ID가 연계)
현금영수증 서비스만 단독으로 호출되는 경우가 있다. (이 경우 트랜잭션/ID가 독립 부여)
현금영수증은 배치 스케줄러를 통해 익일 새벽에 대상건을 파일로 만든 뒤, 국세청으로 FTP 송수신하여 처리되며 서비스가 일단락 된다.
# 일련번호가 중복채번되면?
만약, 현금영수증 서비스에서 DB 시퀀스를 이용해 승인번호(승인취소번호) 채번되고 있다고 가정하면
일련번호가 중복채번 될 경우 익일 국세청으로부터 오류응답을 받게 될 것이다.
DB의 기본키/복합키가 잘 설계되었다면, 일련번호가 중복채번 되더라도 DB Insert 자체에는 문제가 없을 것이다.
(DB의 키는 유니크한 값이더라도 외부에 종속적인 값은 사용하면 안됨 ex) 주민등록번호(x))
# 발생 사유
이런 문제는 다중 DB를 사용하는 환경에서 DB 시퀀스를 각자 가질 경우 발생 가능하다.
주기상으로 중복채번 되지 않도록 시퀀스 넘버를 관리해놓을 테지만.
이를 주기적으로 수행하는것이 아니라면, 결국 중복되는 값이 채번되는 시퀀스 넘버에 도달하게 되기 때문이다.
이에 대한 해결법은,
시퀀스 넘버를 관리하는 것을 주기적으로 수행(혹은 자동화) 하는 것이 있고.
로직 상으로는 배치 내에서 값을 검증하는 방법도 있겠으나,
성능을 고려하여 모든 일련번호를 조회하는 상황은 피하는 것이 좋을 것이다.
(각 시퀀스의 당일 처음 시퀀스들만 이용해 비교한다거나)
후처리는,
DB 보정작업을 통해 일련번호를 신규채번한 번호로 변경해주고,
배치 스케줄러의 조건에 맞도록 날짜 컬럼들 역시 변경해준다.
국세청의 응답을 저장하는 필드가 있다면.
배치 로직상 DB 보정작업시 실패응답 또한 초기화해줘야 되는지 여부도 확인이 필요 할 수 있다.
# 참고
1. 본인 블로그 : (참고사례)
https://drsggg.tistory.com/730
'경력 실무경험 > 실무 주제' 카테고리의 다른 글
DB 날짜데이터 Insert시 반드시 정합성 체크를 할 것(DB Select 오류 ORA-01847 : 달의 날짜는 1에서 말일 사이여야 합니다) (0) | 2023.04.26 |
---|---|
요청헤더 쿠키의 크기로 인한 이슈 발생 및 조치(노티서비스. 가맹점 400 오류응답. 쿠키와 세션) (0) | 2023.04.26 |
DB동기화 점검(지연발생)시 고려사항(개설기관 장애 응답) (0) | 2023.04.26 |
외부API 장애 발생과 대응 예상(카드사 TIMEOUT과 PG/VAN 대응) (0) | 2023.04.26 |
레거시 서버 장비노후 이슈 발생 및 조치 (0) | 2023.04.26 |
배치컨테이너 배포와 스케줄러 실행이 동시에 진행되는 것에 주의(InvalidGlobalDeployVersionException, InvalidGlobalDeployVersion, LinkageError) (0) | 2023.04.25 |
계좌이체 서비스의 은행점검시간으로 인한 딜레이 발생시 해결방안 (은행사 시스템취소) (0) | 2023.04.25 |
SimpleDateFormat 사용시 주의사항 (년도 포맷 주의사항) (0) | 2023.04.25 |