[React] 주민등록번호 조건을 챗GPT 보다 깐깐하게 검사해보자

SeonDal·2023년 4월 21일
1

🕊️ 기록기룩 

목록 보기
6/7
post-custom-banner

🌱 프롤로그

챗지피티 너마저....

주민등록번호 앞자리의 날짜 유효성과 뒷자리 성별 번호가 연도에 맞는지까지 함께 검사하면서
보다 깐깐하게 주민등록번호의 유효성을 검사해보자!


⭐️ 주민등록번호의 구성과 조건

모든 자리는 기본적으로 숫자로 구성되어 있는 문자열

1. 연도

  • 첫번째, 두번째 자리가 연도의 끝 두자리를 나타낸다
  • 제한 없음

2. 월

  • 세번째, 네번째 자리
  • 01 이상 12 이하

3. 일

  • 다섯번째, 여섯번째 자리
  • 01 이상 31 이하
  • 경우에 따라 월에 따라 일의 조건을 다르게 할 수는 있으나 (ex. 2월 30일은 존재하지 않음.) 로직이 너무 복잡해지기에 여기서는 다루지 않았다

4. 성별

  • 일곱번째 자리 (대시가 포함된 경우 여덟번째 자리)
  • 연도에 해당하는 두자리가 현재 연도 두 자리보다 크다면 1 또는 2
  • 연도에 해당하는 두자리가 현재 연도 두 자리보다 작다면 1 또는 2

2번과 3번 조건은 정규식으로,
4번 조건 (1번과 연동)은 함수로 구현했다.


👀 구현을 해보자


1️⃣ 월과 일 조건 처리하는 정규식

대시 없는 경우

const regex = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{7}$/

대시 있는 경우
(ex. 030412-3xxxxxx)

const regex = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[-]\d{7}$/
  • ^: 문자열의 시작
  • \d: 숫자
  • {2}: 바로 앞의 표현식이 두 번 반복되어야 함. 여기서는 /d{2} 니까 두자리 숫자
  • (0[1-9]|1[0-2]): 01~09 또는 10~12의 두 자리 숫자
  • (0[1-9]|[1-2][0-9]|3[0-1]): 01~09 또는 10~29 또는 30, 31 중 하나의 두 자리 숫자
  • [-] : 대시가 포함되어야 함.
  • \d{7}: 7자리 숫자
  • $: 문자열의 끝

2️⃣ 올해 연도 끝 두자리 구하기

const TODAY_YEAR = parseInt(new Date().getFullYear().toString().substr(-2));
  • new Date() : 현재 날짜 가져오기
  • getFullyear() : date 타입에서 연도를 반환
  • toString() : date 타입을 string 으로 변경 (substr() 연산을 위해)
  • substr(-2) : 문자열의 끝 두자리를 가져온다
  • parseInt : 문자열로 반환된걸 숫자로 변경 (추후 비교 연산해야하므로)

3️⃣ 조건에 맞는지 여부 반환하는 함수 만들기

  function getIsRegistFieldRight(registNum: string) {
    if(registNum.length !== 13) // 대시 있는경우 14로 변경
      return false;
    
    // 연도에 해당하는 숫자와 성별에 해당하는 숫자 비교
    const yearNum = parseInt(registNum.slice(0, 2));
    const sexNum = registNum.slice(6); // 대시 있는경우 7로 변경
    if (sexNum === '1' || sexNum === '2') {
      if (yearNum < TODAY_YEAR) return false;
    } else if (sexNum === '3' || sexNum === '4') {
      if (yearNum > TODAY_YEAR) return false;
    } else return false;

    // 월과 일에 해당하는 숫자 조건 검사 (정규식으로)
    if (!regex.test(registNum)) return false;

    return true;
  }
  • .test()
    : 특정 문자열이 정규식에 맞는지 true false로 반환한다
    문자열.test(정규식)
profile
김선달 개발블로그
post-custom-banner

0개의 댓글