VIN 디코딩 패턴을 위한 커뮤니티 기여 시스템 구축

발행: (2026년 3월 13일 오전 09:25 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

Overview

Cover image for Building a Community Contribution System for VIN Decoding Patterns

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: RWD

Validation 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:
0 조회
Back to Blog

관련 글

더 보기 »

Jemalloc, Meta가 포기하지 않음

- Meta는 소프트웨어 인프라에서 고성능 메모리 할당기인 jemalloc의 장기적인 이점을 인식하고 있습니다. - 우리는 jemalloc에 대한 관심을 새롭게 하고 있습니다…