VIN 디코딩 패턴을 위한 커뮤니티 기여 시스템 구축
Source: Dev.to
Overview

VIN 디코딩은 모든 제조사가 다르게 구현하고, 권위 있는 데이터베이스(NHTSA VPIC)는 미국 시장 차량만을 다루기 때문에 겉보기와 달리 복잡합니다.
우리는 Corgi 라는 오프라인 VIN 디코더를 유지보수하고 있습니다. 국제 차량을 지원하기 위해 커뮤니티 기여 시스템을 구축했습니다. 작동 방식은 다음과 같습니다.
The Problem
VIN(차량 식별 번호)은 17자리로 구성됩니다:
- 1‑3번째 자리: WMI(세계 제조업체 식별자)
- 4‑8번째 자리: 차량 속성(모델, 엔진 등)
- 9번째 자리: 체크 디지털
- 10번째 자리: 연식
- 11번째 자리: 공장 코드
- 12‑17번째 자리: 일련 번호
NHTSA의 VPIC 데이터베이스는 WMI를 제조업체와 매핑하고 4‑8번째 자리 해석 방식을 정의하지만, 미국에서 판매되는 차량만을 포함합니다.
예시:
- 테슬라 상하이 공장은 WMI
LRW를 사용합니다. - 테슬라 베를린 공장은 WMI
XP7를 사용합니다.
두 WMI 모두 VPIC에 존재하지 않습니다.
Our Solution: YAML Patterns
기여자는 새로운 WMI를 설명하는 YAML 파일을 추가합니다:
wmi: LRW
manufacturer: Tesla
make: Tesla
country: China
vehicle_type: Passenger Car
years:
from: 2020
to: null
sources:
- type: service_manual
description: Tesla Model 3/Y VIN decoder
url: https://example.com/source
patterns:
- pattern: "3E****"
element: Model
value: Model 3
- pattern: "YG****"
element: Model
value: Model Y
- pattern: "*D****"
element: Drive Type
value: AWD
- pattern: "*C****"
element: Drive Type
value: RWD
test_vins:
- vin: LRW3E7FA6NC433523
expected:
make: Tesla
model: Model 3
drive_type: RWDValidation Pipeline
PR이 열리면 CI가 여러 검사를 수행합니다.
Schema Validation (Zod)
const wmiFileSchema = z.object({
wmi: z.string().length(3).regex(/^[A-HJ-NPR-Z0-9]{3}$/),
manufacturer: z.string().min(1),
make: z.string().min(1),
country: z.string().min(1),
vehicle_type: z.enum(VALID_VEHICLE_TYPES),
years: yearsSchema,
patterns: z.array(patternSchema).min(1),
test_vins: z.array(testVinSchema).min(1),
});Check Digit Verification
모든 테스트 VIN은 유효한 체크 디지털(9번째 자리)을 가져야 합니다:
function validateCheckDigit(vin: string): boolean {
const weights = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
const transliteration = { A:1, B:2, /* … */ };
let sum = 0;
for (let i = 0 - npm: