사업자등록번호 검증코드를 이용한 유효성검사 알고리즘

mdx-header_profile-img__OIgan-alt
mdx-header_profile-label-img__GDwAD-alt
타카(Taka)

2025년 2월 2일 작성됨

공유
mdx-header_share-img__5dQGv-alt

포인트를 출금 할 수 있게하는 서비스 작업 중에
출금을 하려면 정산 정보가 필요한 상황이다.

그리하여 유저가 직접 정산 정보를 저장할 수 있는 폼을 만들었는데...

해당 폼을 사용하여
유저들이 잘 기입하고
항목별 유효성검사까지 진행되고
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

내 코드를 믿지 못하고
유저도 믿지 못하고
빠르게 확인해볼때 유용했다.