블로그 목록으로
사업자등록번호 검증코드를 이용한 유효성검사 알고리즘
포인트를 출금 할 수 있게하는 서비스 작업 중에
출금을 하려면 정산 정보
가 필요한 상황이다.
그리하여 유저가 직접 정산 정보
를 저장할 수 있는 폼을 만들었는데...
해당 폼을 사용하여
유저들이 잘 기입하고
항목별 유효성검사까지 진행되고
DB에 잘 저장되는 도중...
어떤 CS 고객문의가 찾아왔다.
자꾸 저장되지 않고 오류가 발생하신다고~
API 네트워크 로그를 확인해보니
사업자등록번호가 유효하지 않다는 에러가 발생하고 있었다.
나는 분명 코드는 잘 작동할 것이고,
이 유저가 휴먼 에러(실수)를 한 것이 아닐까 했는데
웬걸 사업자등록증 요청을 했더니 파일 증명까지 해주셨다.
결국 사업자등록번호 유효성검사 알고리즘을 디버깅하고~
검증코드에 대한 계산까지 손수 해보고~
보라색 숫자 외 앞자리들을 이용하여 공식 계산식을 다 거치고
마지막 보라색 숫자가 나와야 유효하다는 방식이다.
const multiply = [1, 3, 7, 1, 3, 7, 1, 3, 5];
let checkSum = 0;
for (let i = 0; i < multiply.length; ++i) {
checkSum += multiply[i] * registerationNumberList[i];
}
checkSum += Math.floor((multiply[8] * registerationNumberList[8]) / 10);
const lastNumber = registerationNumberList[9];
const predictedLastNumber = Math.floor(10 - (checkSum % 10)); // 이 곳이 문제
if (lastNumber != predictedLastNumber) {
throw ExpressError({
statusCode: 400,
message: 'Invalid cooperate registeration number',
response: {
registerationNumber,
},
});
}
문제의 부분.
const predictedLastNumber = Math.floor(10 - (checkSum % 10));
즉, 사업자등록번호 마지막 숫자가 0인 사람의 경우
predictedLastNumber
가 10으로 나오게 되어...
사업자등록번호 마지막 숫자 0과 일치하지 않게 되어 자꾸 실패했었다.
0인 사람도 통과되도록 나머지 10을 해주자...
const multiply = [1, 3, 7, 1, 3, 7, 1, 3, 5];
let checkSum = 0;
for (let i = 0; i < multiply.length; ++i) {
checkSum += multiply[i] * registerationNumberList[i];
}
checkSum += Math.floor((multiply[8] * registerationNumberList[8]) / 10);
const lastNumber = registerationNumberList[9];
const predictedLastNumber = Math.floor((10 - (checkSum % 10)) % 10); // 마지막 숫자 검증코드 0일 경우 처리 (한자리 수로만 검증)
if (lastNumber != predictedLastNumber) {
throw ExpressError({
statusCode: 400,
message: 'Invalid cooperate registeration number',
response: {
registerationNumber,
},
});
}
내용을 단순 이거로만 적으려는 것은 아니었고,
이것저것 조사하다보니
대한민국 정부 공공데이터포털에서 제공하는 유효성검사 API
와
비개발자도 확인할 수 있는 엑셀 검증 방법
도 알아내서 함께 포스팅한다.
API 방식
https://www.data.go.kr/data/15081808/openapi.do
엑셀 방식
https://www.data.go.kr/bbs/rcr/selectRecsroom.do?pageIndex=1&originId=PDS_0000000000753
내 코드를 믿지 못하고
유저도 믿지 못하고
빠르게 확인해볼때 유용했다.
채팅 문의