pile·
기타·마켓컬리마켓컬리 Hello World·

개발자들이 꺼려하는 까칠한 규식이 형

주문자 이름의 특수 문자를 막는 요구를 계기로 JavaScript 정규표현식의 기본 문법과 실제 필터 개선 과정을 설명한다. 키보드에 보이는 특수 문자를 하나씩 나열한 첫 방식은 예상하지 못한 Unicode 문자에 다시 뚫렸다. 허용할 한글·영문·숫자·공백 집합을 정의하고 나머지를 제거하는 방식으로 전환한 뒤, 모바일 천지인 문자까지 팀 리뷰로 보완했다.

핵심 포인트
  • 정규표현식은 패턴과 i·g·m 같은 플래그로 구성되며 문자 클래스, 그룹, 앵커, 수량자 조합으로 문자열을 찾고 바꾼다.
  • 특수 문자를 블랙리스트로 직접 나열하면 문자 공간이 너무 커 누락을 피하기 어렵다.
  • 필터 관점을 뒤집어 허용할 한글·영문·숫자·공백만 남기는 allowlist 방식으로 바꿨다.
  • 한글은 완성형 가-힣뿐 아니라 자음·모음 Unicode 범위도 포함해야 입력 중인 문자열을 보존할 수 있다.
  • 팀과 QA 검토를 거쳐 천지인 키보드에서 사용하는 추가 문자까지 허용 목록에 넣고 공통 함수로 만들었다.
상세 정리
  • 장애 배경: 주문자 이름에 특수 문자가 들어가면 백엔드 시스템에서 오류가 발생해 프론트 입력 단계에서 제거해야 했다.
  • 기본 형식: /pattern/flags 구조에서 i는 대소문자 무시, g는 전체 일치, m은 여러 줄 기준 동작을 지정한다.
  • 문자 선택: 대괄호는 한 문자 집합, x|y는 대안, ^와 달러 기호는 줄의 시작과 끝을 뜻한다. 괄호는 일치 내용을 캡처하고 비캡처 그룹은 저장 없이 묶는다.
  • 축약 클래스: \d는 숫자, \w는 영문·숫자·밑줄, \s는 공백·탭·줄바꿈과 일치한다. 대문자 \D와 \S는 각각 반대 집합이다.
  • 수량자: 물음표는 0~1회, 더하기 기호는 1회 이상, 별표는 0회 이상 반복을 뜻한다.
  • 실용 예제: 그룹 치환으로 단어 순서를 바꾸고, Windows와 Unix 줄바꿈을 함께 분리하며, 숫자 뒤에 원이 붙은 금액만 찾아 합산하는 식을 보여준다.
  • 첫 구현: 키보드에서 떠올릴 수 있는 괄호·구두점·연산자 같은 특수 문자를 문자 클래스에 나열하고 모두 빈 문자열로 치환했다.
  • 첫 실패: 서버 배포 며칠 뒤에도 특수 문자가 들어왔다. 블랙리스트에 포함되지 않은 문자가 훨씬 많아 열거 방식 자체가 확장되지 않았다.
  • 관점 전환: 제거할 문자를 늘리는 대신 한글, 영문, 숫자, 공백이 아닌 문자를 제외하기로 했다.
  • Unicode 범위: 한글 완성형은 U+AC00~U+D7A3, 자음은 U+3131~U+314E, 모음은 U+314F~U+3163 범위로 지정했다.
  • 중간 식 검토: 처음 만든 allowlist 식에서 ^와 파이프 문자가 예상대로 걸러지지 않아 개발팀 Slack에 도움을 요청했다.
  • 협업 보완: 여러 개발자와 QA가 하루 안에 식을 단순화하고 천지인 키보드 입력에 필요한 문자를 추가했다.
  • 최종 함수: 허용 범위 밖 문자 또는 밑줄이 연속으로 나오면 전역 치환으로 제거하고, 실제 일치가 있을 때만 replace를 실행한다.
  • 호환성 주의: 글은 가-힣 범위 표현이 EUC-KR 환경에서는 동작하지 않는 문제도 주석으로 남겼다.
  • 교훈: 입력 검증은 눈에 보이는 예외를 쫓기보다 유효한 도메인 문자 집합을 먼저 정의하고 다양한 입력기와 인코딩을 검증해야 한다.
왜 읽나이름·주소 같은 사용자 입력을 정규식으로 정제할 때 블랙리스트의 한계와 Unicode·모바일 키보드까지 고려한 allowlist 설계를 배울 수 있다.
마켓컬리
마켓컬리 Hello World 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 기타·stackoverflow-blogStack Overflow Blog·

    Selenium vs Cypress vs Playwright — 테스트 자동화 프레임워크 선택 가이드 2026

    2026년 기준 Selenium, Cypress, Playwright 세 가지 테스트 자동화 프레임워크를 아키텍처, 안정성, 비용, 브라우저 지원, 언어 지원 측면에서 비교한다. 세 프레임워크는 브라우저 제어 방식에서 근본적으로 다르며, 각각의 강점이 다른 사용 시나리오에 최적화되어 있다.

    #e2e-testing#test-automation#selenium+2