
ISO 3166-1 alpha-2 코드
ISO 3166-1 alpha-2 코드는 두 글자로 이뤄진 국가 코드로, 국가와 그 지방을 지명하기 위해 사용하는 국제적 문자 코드로써 사용된다. 현재는 전세계 국가들을 각각 지칭하기 위해 총 249개의 코드가 공식적으로 사용되고 있다.
ISO 3166-1 alpha-2 코드는 국가 코드 뒤에 지방 코드까지 붙여서 표현할 수 있는 방식을 지원한다. 예를 들어, ID-RI는 인도네시아의 리아우 지방을, ,NG-RI는 나이지리아의 Rivers 지방을 의미한다.

ISO 639-2 코드
ISO 639-2 코드는 3자리 언어 식별 코드 표준으로, ISO 639-1의 2자리 코드보다 더 많은 언어를 포괄한다.
주로 도서관학, 정보 및 문서화 분야에서 사용된다.
I18N 처리 시 주로 사용되는 BCP 47 코드
1. I18N이란?
I18N (Internationalization, 국제화)은 코드를 고치지 않고도 여러 언어와 지역에 대응할 수 있게 소프트웨어를 설계하는 일이다.
| 용어 | 의미 | 담당 |
| I18N (Internationalization) | 다국어 대응이 가능한 구조를 만드는 작업 | 개발 |
| L10N (Localization) | 특정 언어 / 지역에 맞게 번역하고 현지화하는 작업 | 번역 / 현지화 |
| G11N (Globalization) | I18N과 L10N을 합친 개념 | 전체 |
I18N의 주요 처리 대상은 다음과 같다.
- UI 문자열을 코드에서 분리해 리소스 파일로 관리
- 날짜 / 시간 / 숫자 / 통화 형식 (예: 2026.10.5와 10/5/2026)
- 복수형 규칙, 정렬 (collation), RTL (오른쪽에서 왼쪽으로 쓰는 언어) 구조
- 문자 인코딩 (UTF-8)
이런 처리를 할 때 어떤 언어와 지역인지 식별하는 표준 키가 BCP 47 언어 태그다.

2. BCP 47 코드
IETF의 Best Current Practice 47번 문서로, RFC 5656(태그 문법)과 RFC 4647(태그 매칭 규칙)으로 구성된다.
각 하위 태그(subtag)는 IANA Language Subtag Registry에 등록된 값만 유효하다.
구조는 다음과 같다.
language [-extlang] [-script] [-region] [-variant] [-extension] [-privateuse]
ko Hant KR -u-ca-dangi
| 하위 태그 | 기준 표준 | 형식 | 예시 |
| language | ISO 639 | 영문 2 ~ 3자, 소문자 | ko, en, yue |
| script | ISO 15924 | 영문 4자, 첫 글자만 대문자 | Hans, Hant, Latn, Cyrl |
| region | ISO 3166-1 alpha-2 / UN M.49 | 영문 대문자 2자 도는 숫자 3자 | KR, US, 419 |
| extension | RFC 6067 등 | 단일 문자 + 값 | -u-ca-dangi, -u-nu-thai |
- 대소문자를 구분하지 않지만, 위 표기 관례를 따르는 것이 권장된다.
- 구분자는 "Hyphen(-)"이다. Java나 POSIX나 ko_KR처럼 underscore(_)를 쓰는 형식은 BCP 47이 아니다.
2단계 코드 : language-region
BCP 47 2단계 코드는 하나의 언어가 하나의 문자 체계만 쓸 때 사용한다.
| 태그 | 의미 |
| ko-KR | 한국어 (대한민국) |
| en-US / en-GB | 영어 (미국 / 영국) |
| ja-JP | 일본어 (일본) |
| pt-BR / pt-PT | 포르투갈어 (브라질 / 포르투갈) |
| es-ES / es-419 | 스페인어 (스페인 / 중남미 전체, UN M.49 코드) |
| fr-CA | 프랑스어 (캐나다) |
3단계 코드 : language-script-region
BCP 47 3단계 코드는 같은 언어가 여러 문자 체계로 쓰일 때 필요하다.
| 태그 | 의미 |
| zh-Hans-CN | 중국어 간체 (중국 본토) |
| zh-Hant-TW | 중국어 번체 (대만) |
| zh-Hant-HK | 중국어 번체 (홍콩) |
| sr-Latn-RS / sr-Cyrl-RS | 세르비아어 (라틴 문자 / 키릴 문자) |
- 3단계 코드 사용 시 기본 문자는 생략한다. 레지스트리의 Suppress-Script 값에 해당하는 문자는 붙이지 않는다.
- 예를 들어 ko-Kore-KR은 ko-KR로, en-Latn-US는 en-US로 쓴다.
- RFC 5646의 원칙은 "필요한 만큼만 길게, 가능한 한 짧게"다.
- 중국어는 script를 명시하는 것이 안전하다.
- 폴백(RFC 4647 Lookup)은 오른쪽부터 하위 태그를 하나씩 제거하는 방식이다.
- 예 : zh-Hant-TW → zh-Hant → zh → 기본값
언어 코드 자체의 2자 / 3자 구분
- ISO 639-1 2자 코드가 있으면 반드시 그것을 쓴다. 예를 들어 kor이 아니라 ko, eng가 아니라 en이다.
- 2자 코드가 없는 언어만 ISO 639-2/3의 3자 코드를 쓴다. 예: yeu (광둥어), fil (필리핀어), haw (하와이어)
- 국가 코드의 3자 형식(KOR, USA, ISO 3166 alpha-3)은 BCP 47에서는 유효하지 않다.
- 폐기된 코드가 있으니 주의해야 한다.
실무 권장 사항
내부 저장과 API 교환에는 BCP 47 표준형(ko-KR, zh-Hant-TW)을 쓰고, 플랫폼별 형식 변환은 경계 계층에서만 처리하는 구성이 일반적이다.
| 플랫폼 | 표기 예 |
| Web (HTML, JS, HTTP) | zh-Hant-TW (BCP 47 그대로) |
| Java Locale | Locale.forLanguageTag("zh-Hant-TW") 권장 |
| Android resources | values-ko-rKR, 3단계는 values-b+zh+Hant+TW |
| iOS / macOS | zh-Hant, ko 등 (.lproj 디렉터리) |
| POSIX locale | ko_KR.UTF-8 (BCP 47 아님) |
참고 자료
- ISO 3166-1 alpha-2 - Wikipedia
- ISO 639.2 - Codes for the Representation of Names of Languages
'Backend' 카테고리의 다른 글
| [Backend] Prometheus & Grafana를 사용한 Kafka Dashboard 구현하기 (0) | 2026.10.03 |
|---|---|
| [Kafka] auto.offset.reset 개념 이해하기 (0) | 2026.09.26 |
| Prompt engineering vs. Tool calling (0) | 2026.08.05 |
| Kubernetes Probes (Liveness, Readiness, Startup) (0) | 2026.06.28 |
| 무중단 배포 전략 : Rolling update, Blue/Green, Canary (0) | 2026.06.24 |