우편번호 형식은 서로 호환되지 않으며, 다섯 자리 숫자를 가정하는 검증기는 전 세계 대부분을 거부합니다. 차이는 겉모습이 아니라 구조에 있습니다. 어떤 체계는 앞자리 0이 있는 숫자형이고, 어떤 체계는 문자와 숫자를 섞으며, 어떤 체계는 도시 앞에 코드를 두고, 이 사이트의 픽스처 세트에 포함된 두 국가는 우편번호가 아예 없습니다.
이 레퍼런스는 주소 폼을 만드는 개발자에게 중요한 패턴을 직접 테스트할 수 있는 정규식과 함께 정리합니다. 또한 이 사이트 자체가 긋는 선도 분명히 합니다. 여기서 우편번호 검증은 모든 국가에 대한 구조 검사이며, US ZIP의 경우 40,979행 데이터셋과 대조하는 존재 검사입니다. 이 가이드의 어떤 내용도 일치하는 코드가 실제로 할당되었거나 배달 가능하다는 것을 의미하지 않습니다.
우편번호가 숫자 필드가 아닌 이유
미국은 다섯 자리 또는 ZIP+4를 사용하기 때문에 개발자들이 우편번호를 정수로 모델링하기 쉽습니다. 하지만 이 모델은 캐나다, 영국, 네덜란드, 아일랜드, 몰타, 아르헨티나에서 문자를 포함하므로 즉시 깨집니다. 독일, 프랑스, 스페인, 이탈리아, 폴란드에서는 앞자리 0이 의미를 가지는데 정수 컬럼이 이를 조용히 없애기 때문에 역시 깨집니다.
두 번째 부류의 버그는 위치에서 비롯됩니다. 대부분의 서구 국가는 도시 뒤에 우편번호를 두지만, 독일, 프랑스, 네덜란드, 일본은 도시 앞에 두며, 일본은 전체 코드를 주소의 맨 앞에 둡니다. 폼이 고정 템플릿을 렌더링하면 모든 필드가 채워져 있어도 현지 독자에게 명백히 잘못된 주소가 생성됩니다.
- 우편번호는 항상 텍스트로 저장하고 절대 정수로 저장하지 마세요
- CSV 내보내기를 포함한 모든 계층에서 앞자리 0을 유지하세요
- 국가가 엄격히 숫자형이 아니라면 문자를 허용하세요
- 우편번호가 도시 뒤에 온다고 가정하지 마세요
- 구분자는 구조가 아니라 표시 방식으로 취급하세요
숫자형 체계와 그 범위
유럽 대부분은 고정 길이 숫자 코드를 사용합니다. 독일, 프랑스, 스페인, 이탈리아, 그리스, 터키, 사우디아라비아는 다섯 자리, 오스트리아, 벨기에, 스위스, 덴마크, 노르웨이, 헝가리, 남아프리카공화국은 네 자리, 폴란드와 포르투갈은 하이픈을 추가합니다. 스웨덴은 세 자리, 공백, 두 자리를 사용합니다. 체코는 다섯 자리이며 보통 세 번째 자리 뒤에 공백을 둡니다.
아시아와 라틴아메리카는 대부분 숫자형이지만 길이가 다릅니다. 인도, 중국, 러시아, 싱가포르, 나이지리아는 여섯 자리, 일본은 일곱 자리이며 관례적으로 세 번째 뒤에 하이픈을 둡니다. 한국은 다섯 자리, 브라질은 여덟 자리이며 다섯 번째 뒤에 하이픈을 둡니다. 칠레는 일곱 자리, 콜롬비아는 여섯 자리, 페루와 멕시코는 다섯 자리입니다. 길이만으로는 국가를 식별할 수 없으므로 검증기는 무엇이든 검증하기 전에 국가 필드가 필요합니다.
| 국가 | 길이 | 표준 형식 | 정규식 |
|---|---|---|---|
| 독일 | 5자리 | 10115 | ^\d{5}$ |
| 프랑스 | 5자리 | 75008 | ^\d{5}$ |
| 스페인 | 5자리 | 28013 | ^\d{5}$ |
| 오스트리아 | 4자리 | 1010 | ^\d{4}$ |
| 폴란드 | 하이픈 포함 5자리 | 00-001 | ^\d{2}-\d{3}$ |
| 포르투갈 | 하이픈 포함 7자리 | 1250-096 | ^\d{4}-\d{3}$ |
| 스웨덴 | 공백 포함 5자리 | 114 55 | ^\d{3}\s\d{2}$ |
| 일본 | 하이픈 포함 7자리 | 100-0001 | ^\d{3}-\d{4}$ |
| 브라질 | 하이픈 포함 8자리 | 01310-100 | ^\d{5}-\d{3}$ |
| 인도 | 6자리 | 110001 | ^\d{6}$ |
| 한국 | 5자리 | 04524 | ^\d{5}$ |
| 멕시코 | 5자리 | 06600 | ^\d{5}$ |
영숫자형 체계와 문자 규칙
캐나다는 A1A 1A1 패턴을 사용하며 문자에 제한이 있습니다. 첫 문자는 D, F, I, O, Q, U, W, Z가 될 수 없고, 나머지 문자는 D, F, I, O, Q, U가 될 수 없습니다. 두 삼중자 사이의 공백은 관례입니다. 아무 문자나 허용하는 검증기는 Canada Post가 절대 발급하지 않는 코드를 받아들입니다.
영국은 2~4자리의 아우트워드 코드, 단일 공백, 3자리 인워드 코드를 사용합니다(예: SW1A 1AA). 네덜란드는 네 자리, 공백, 두 개의 대문자입니다. 아일랜드는 7자리 Eircode를 3자리 라우팅 키와 4자리 고유 식별자로 나눕니다. 몰타는 세 글자, 공백, 네 자리입니다. 아르헨티나는 8자리 CPA를 사용하며, 문자 하나, 네 자리, 세 글자입니다(예: C1425ABC).
| 국가 | 패턴 | 예시 | 정규식 |
|---|---|---|---|
| 캐나다 | 제한 문자를 포함한 A1A 1A1 | K1A 0B1 | ^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$ |
| 영국 | 2-4자 아우트워드, 3자 인워드 | SW1A 1AA | ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$ |
| 네덜란드 | 4자리, 2글자 | 1012 AB | ^\d{4} ?[A-Z]{2}$ |
| 아일랜드 | 3자 라우팅 키, 4자 식별자 | D02 X285 | ^(?:[A-Z]\d{2}|D6W) ?[A-Z0-9]{4}$ |
| 몰타 | 3글자, 4자리 | VLT 1117 | ^[A-Z]{3} ?\d{4}$ |
| 아르헨티나 | 문자, 4자리, 3글자 | C1425ABC | ^[A-Z]\d{4}[A-Z]{3}$ |
우편번호가 없는 국가
홍콩과 아랍에미리트는 우편번호 체계가 없습니다. 둘 다 이 사이트의 38개국 픽스처 세트에 포함되어 있으며, 생성기는 숫자를 만들어내지 않고 빈 우편번호 값을 반환합니다. 이것이 올바른 동작이며 유용한 테스트 케이스이기도 합니다. 우편번호를 필수로 표시하는 폼은 두 시장 모두에서 깨지기 때문입니다.
아랍에미리트의 관례는 P.O. Box 번호이며, 이는 우편번호가 아니므로 해당 필드에 강제로 넣어서는 안 됩니다. 홍콩 주소는 구역과 거리를 사용하며 우편물은 코드 없이 배달됩니다. 데이터 모델이 null이 아닌 우편번호 값을 요구한다면 가짜 코드가 아니라 국가 수준 플래그 같은 명시적 센티널을 사용하세요. 가짜 코드는 검증을 통과한 뒤 실제 코드를 가정하는 모든 다운스트림 검사에서 실패하기 때문입니다.
- 홍콩: 우편번호 없음, 구역과 거리가 주소
- 아랍에미리트: 우편번호 없음, P.O. Box가 일반적 관례
- 두 국가 중 하나가 선택되면 우편번호 필드를 선택 사항으로 만드세요
- 우편번호 컬럼에 00000이나 N/A를 절대 대입하지 마세요
- 내보내기가 누락 데이터처럼 보이지 않도록 부재를 명시적으로 기록하세요
구조 검사와 존재 검사
구조 검사는 문자열이 국가 패턴과 일치하는지 답합니다. 존재 검사는 코드가 참조 데이터셋에 나타나는지 답합니다. 두 번째만이 코드가 한 번도 할당되지 않았음을 알려줄 수 있습니다. 이 사이트는 38개국 모두에 구조 검사를 수행하고, US ZIP에 대해서는 40,979행과 대조하는 존재 검사를 수행하며, 누구도 하나를 다른 것으로 혼동하지 않도록 다르게 표시합니다.
어느 검사도 배달 가능성을 증명하지 않습니다. 다섯 자리 US ZIP은 존재할 수 있지만 그 아래의 도로명 주소는 존재하지 않을 수 있고, 구조적으로 유효한 독일 코드는 제공된 도시와 다른 도시에 속할 수 있습니다. 그 수준의 보증이 필요하다면 우편번호 참조 데이터셋과 도로 수준 데이터베이스가 필요하며, 이는 형식 검사기와는 다른 제품입니다.
| 검사 유형 | 범위 | 증명하는 것 | 증명하지 않는 것 |
|---|---|---|---|
| 패턴 일치 | 38개국 전체 | 해당 국가에 대해 형식이 올바름 | 코드가 할당되었는지 |
| US ZIP 존재 | 40,979개 US ZIP 행 | 코드가 데이터셋에 있음 | 도시 또는 거리 일치 |
| 필수 필드 규칙 | 폼 수준 | 제출이 진행될 수 있음 | 실제 세계의 유효성 |
| 길이 및 문자 집합 | 필드 수준 | 저장 공간이 넘치지 않음 | 국가 정확성 |
프로덕션 버그를 일으키는 정규식 세부 사항
모든 패턴을 앵커링하세요. 앵커가 없는 /\d{5}/는 아홉 자리 문자열 안의 다섯 자리와 일치하여 성공을 보고합니다. ^와 $ 또는 동등한 전체 일치 API를 사용하세요. JavaScript에서 \d는 ASCII 숫자만 일치하지만, Python에서 \d는 기본적으로 유니코드 숫자를 일치하므로 re.ASCII로 컴파일하거나 [0-9]를 쓰지 않으면 패턴이 동아라비아 숫자를 받아들일 수 있습니다.
구분자가 필수인지 명시적으로 결정하세요. 표시할 때는 표준 구분자를 직접 삽입하세요. 입력에서는 공백이나 하이픈 0개 또는 1개를 허용하고 정규화하세요. 문자 클래스 내부의 하이픈은 이스케이프하거나 마지막에 두지 않으면 범위를 정의하므로 주의하세요. 그리고 정규화 버그를 덮으려고 대소문자 무시 플래그를 사용하지 마세요. 쓰기 시 값을 대문자로 바꾸고 표시 형식은 표준형으로 유지하세요.
- ^와 $로 앵커링하거나 전체 일치 함수를 사용하세요
- ASCII 숫자를 의미할 때는 [0-9]를 사용하세요
- 입력에서는 선택적 구분자를 허용하고 표시할 때는 표준 구분자를 출력하세요
- 하이픈을 이스케이프하거나 문자 클래스 내부에서 마지막에 두세요
- 대소문자 플래그를 여기저기 흩뿌리는 대신 일치 전에 대문자로 바꾸세요
- 줄바꿈 없는 공백과 제로 폭 문자를 명시적으로 거부하세요
쓰기 시 정규화, 표시 시 포맷
하나의 표준형을 저장하고 표시형을 파생하세요. 표준형은 보통 표준 구분자를 포함한 대문자이거나, 구분자가 순전히 관례일 때는 숫자만입니다. 정규화는 손실이 있으므로 감사 추적이 필요하면 원본 사용자 입력을 별도 컬럼에 보관하세요. 지원 담당자가 정확히 무엇이 입력되었는지 볼 필요가 있을 수 있습니다.
국가별 정규화는 작지만 실질적입니다. 캐나다는 대문자-숫자-대문자, 공백, 숫자-대문자-숫자를 원합니다. 네덜란드는 숫자 뒤 대문자를 원합니다. 영국은 단일 공백과 대문자를 원합니다. 브라질과 일본은 사용자가 자주 생략하는 하이픈을 사용하므로 하이픈 형식으로 정규화하세요. 독일은 구분자를 전혀 원하지 않으며 앞자리 0을 반드시 유지해야 합니다.
| 국가 | 원본 입력 | 저장 표준형 | 표시 |
|---|---|---|---|
| 캐나다 | k1a0b1 | K1A 0B1 | K1A 0B1 |
| 네덜란드 | 1012ab | 1012 AB | 1012 AB |
| 영국 | sw1a1aa | SW1A 1AA | SW1A 1AA |
| 브라질 | 01310100 | 01310-100 | 01310-100 |
| 일본 | 1000001 | 100-0001 | 100-0001 |
| 독일 | 10115 | 10115 | 10115 |
| 스웨덴 | 11455 | 114 55 | 114 55 |
복사해서 쓸 수 있는 테스트 코퍼스
모든 검증기에는 국가별로 최소 하나의 유효 사례와 하나의 무효 사례, 그리고 정규화와 저장을 특별히 테스트하는 사례가 필요합니다. 아래 표는 시작 세트입니다. 여러 무효 사례가 일반적이지 않고 국가별 이유로 무효라는 점에 주목하세요. 대부분의 손으로 작성한 테스트가 너무 일찍 멈추는 지점입니다.
우편번호가 없는 국가, 앞자리 0, 사용자가 실제로 입력하는 구분자 변형에 대한 사례를 추가하세요. 검증기가 클라이언트와 서버에서 공유된다면 동일한 코퍼스를 두 구현 모두에 대해 실행하세요. 관대한 클라이언트와 엄격한 서버 사이의 불일치는 "폼은 받아들였는데 API가 거부했다"는 보고의 가장 흔한 원인입니다.
| 사례 | 값 | 국가 | 기대 |
|---|---|---|---|
| 유효한 ZIP+4 | 97205-2515 | 미국 | 허용 |
| 무효한 ZIP+4 | 97205-251 | 미국 | 거부 |
| 유효한 캐나다 | K1A 0B1 | 캐나다 | 허용 |
| 잘못된 캐나다 문자 | D1A 0B1 | 캐나다 | 거부 |
| 유효한 영국 | SW1A 1AA | 영국 | 허용 |
| 영국 인워드 누락 | SW1A | 영국 | 거부 |
| 독일 앞자리 0 | 01067 | 독일 | 허용 및 보존 |
| 숫자형 체계의 문자 | 1011A | 독일 | 거부 |
| 코드 없음 | 홍콩 | 빈 값으로 허용 | |
| 만들어낸 코드 | 99999 | 아랍에미리트 | 필드 거부 |
질문
- 홍콩과 아랍에미리트에는 없으며, 둘 다 이 사이트의 38개국 픽스처 세트에 포함되어 있습니다. 생성기는 값을 만들어내지 않고 빈 우편번호 필드를 반환합니다.
- 아닙니다. 구조 일치는 값의 형식이 올바르다는 것만 의미합니다. 여기서는 US ZIP만 40,979행과 대조하는 존재 검사를 받으며, 어떤 국가도 배달 가능성 주장을 받지 않습니다.
- 절대 아닙니다. 캐나다, 영국, 네덜란드, 아일랜드, 몰타, 아르헨티나는 문자를 사용하고, 독일, 프랑스, 스페인, 이탈리아, 폴란드는 의미 있는 앞자리 0을 가집니다.
- 네덜란드 코드는 네 자리 뒤에 두 개의 대문자가 오는 형식입니다(예: 1012 AB). 문자는 지역 접미사가 아니라 코드의 일부이며, 숫자만 허용하는 정규식은 유효한 주소를 거부합니다.
- 공백 0개 또는 1개가 포함된 입력을 허용하고 대문자로 바꾼 뒤 단일 표준 구분자를 저장하세요. 사용자가 입력한 그대로를 되돌려주지 말고 표시할 때 표준형을 출력하세요.
우편번호가 없는 국가는 어디인가요?+
유효한 우편번호는 주소가 실제임을 의미하나요?+
우편번호를 정수로 저장해야 하나요?+
네덜란드는 왜 숫자 뒤에 문자를 두나요?+
영국이나 캐나다 코드의 공백은 어떻게 처리해야 하나요?+
예시는 합성 데이터입니다. 생성된 주소를 신원 확인, 계정 등록 또는 배송에 사용하지 마세요.