IT

🏠 JSON Schema: 데이터 μœ νš¨μ„± κ²€μ¦μ˜ ν‘œμ€€ 섀계도 πŸ–₯

μ•ˆλ…•ν•˜μ„Έμš”! ν˜„λŒ€ μ›Ή κ°œλ°œμ—μ„œ 데이터 κ΅ν™˜μ˜ 핡심인 JSON(JavaScript Object Notation)을 λ”μš± κ°•λ ₯ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” 도ꡬ, λ°”λ‘œ JSON Schema에 λŒ€ν•΄ 쉽고 깊이 있게 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


1. πŸ” JSON Schemaλž€ λ¬΄μ—‡μΈκ°€μš”?

JSON SchemaλŠ” JSON λ°μ΄ν„°μ˜ ꡬ쑰와 μœ νš¨μ„±μ„ μ„€λͺ…ν•˜κ³  κ²€μ¦ν•˜κΈ° μœ„ν•œ ν‘œμ€€μž…λ‹ˆλ‹€. μ‰½κ²Œ 말해, JSON 데이터가 μ–΄λ–€ λͺ¨μ–‘(데이터 νƒ€μž…, ν•„λ“œ 이름, ν•„μˆ˜ μ—¬λΆ€, κ°’μ˜ λ²”μœ„ λ“±)을 κ°€μ Έμ•Ό ν•˜λŠ”μ§€λ₯Ό μ •μ˜ν•˜λŠ” 섀계 λ„λ©΄μ΄μž κ·œμΉ™μ„œμž…λ‹ˆλ‹€.

  • 핡심 κΈ°λŠ₯:
    1. μ„€λͺ… (Documentation): JSON 데이터가 μ–΄λ–€ ν•„λ“œλ₯Ό κ°€μ§€κ³ , 각 ν•„λ“œμ˜ μ˜λ―Έκ°€ 무엇인지 λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€.
    2. μœ νš¨μ„± 검증 (Validation): λ“€μ–΄μ˜€λŠ” JSON 데이터가 μ •μ˜λœ κ·œμΉ™μ„ μ •ν™•νžˆ λ”°λ₯΄λŠ”μ§€ μžλ™μœΌλ‘œ κ²€μ‚¬ν•©λ‹ˆλ‹€.
  • μ™œ ν•„μš”ν•œκ°€μš”?
    • API μ•ˆμ •μ„±: ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 μ£Όκ³ λ°›λŠ” 데이터가 μ•½μ†λœ ν˜•μ‹μ„ λ”°λ₯΄λ„둝 κ°•μ œν•˜μ—¬, 잘λͺ»λœ λ°μ΄ν„°λ‘œ μΈν•œ μ„œλ²„ 츑의 μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜(Crash)λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
    • μžλ™ λ¬Έμ„œν™”: μŠ€ν‚€λ§ˆ μžμ²΄κ°€ API λͺ…μ„Έμ„œ 역할을 ν•˜μ—¬ 개발자 κ°„μ˜ μ†Œν†΅ λΉ„μš©μ„ μ€„μ—¬μ€λ‹ˆλ‹€.
    • 데이터 일관성: λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κΈ° 전에 λ°μ΄ν„°μ˜ ν’ˆμ§ˆμ„ 보μž₯ν•©λ‹ˆλ‹€.
  • λ”₯ν•˜κ²Œ: JSON SchemaλŠ” JSON 데이터 자체λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON λ°μ΄ν„°μ˜ ꡬ쑰λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 즉, JSON으둜 JSON을 κ²€μ¦ν•˜λŠ” 메타(Meta) μ–Έμ–΄μž…λ‹ˆλ‹€.

2. 🧱 JSON Schema의 핡심 ν‚€μ›Œλ“œ

JSON SchemaλŠ” νŠΉμ • ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°μ˜ κ·œμΉ™μ„ μ •μ˜ν•©λ‹ˆλ‹€.

ν‚€μ›Œλ“œμ—­ν• μ˜ˆμ‹œ
typeλ°μ΄ν„°μ˜ κΈ°λ³Έ μœ ν˜• μ •μ˜ (ν•„μˆ˜)"type": "string", "type": "integer", "type": "array"
properties객체(Object) 내뢀에 포함될 속성(ν•„λ“œ) μ •μ˜"properties": { "name": { ... } }
requiredλ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λŠ” ν•„μˆ˜ 속성 λͺ©λ‘"required": ["id", "name"]
minimum / maximumμˆ«μžν˜• λ°μ΄ν„°μ˜ μ΅œμ†Œ/μ΅œλŒ€κ°’ μ œν•œ"minimum": 0, "maximum": 100
minLength / maxLengthλ¬Έμžμ—΄μ˜ μ΅œμ†Œ/μ΅œλŒ€ 길이 μ œν•œ"minLength": 2
formatλ°μ΄ν„°μ˜ νŠΉμ • ν˜•μ‹ μ§€μ • (이메일, URL, λ‚ μ§œ λ“±)"format": "email"
itemsλ°°μ—΄(Array) μš”μ†Œμ˜ νƒ€μž… μ •μ˜"items": { "type": "string" }

3. 🎯 μ‹€μ œ 적용 μ˜ˆμ‹œ: μ‚¬μš©μž 등둝 데이터 검증

μ‚¬μš©μž 등둝 μ‹œ μ„œλ²„λ‘œ μ „μ†‘λ˜λŠ” JSON λ°μ΄ν„°μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•˜λŠ” JSON Schemaλ₯Ό λ§Œλ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

A. 검증 λŒ€μƒ JSON 데이터 (Instance)

JSON

{
  "id": 1004,
  "username": "tester_kim",
  "email": "test@example.com",
  "age": 25,
  "hobbies": ["reading", "coding"]
}

B. JSON Schema μ •μ˜ (Schema)

JSON

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "User",
  "description": "A user profile in the system",
  "type": "object", // μ΅œμƒμœ„ λ°μ΄ν„°λŠ” 객체여야 함
  "properties": {
    "id": {
      "description": "μ‚¬μš©μž 고유 ID",
      "type": "integer",
      "minimum": 1000 // IDλŠ” 1000 이상이어야 함
    },
    "username": {
      "description": "μ‚¬μš©μž 이름",
      "type": "string",
      "minLength": 4 // μ΅œμ†Œ 4κΈ€μž 이상
    },
    "email": {
      "description": "μ‚¬μš©μž 이메일 μ£Όμ†Œ",
      "type": "string",
      "format": "email" // 이메일 ν˜•μ‹ μ€€μˆ˜
    },
    "age": {
      "description": "μ‚¬μš©μž λ‚˜μ΄",
      "type": "integer",
      "minimum": 18, // μ΅œμ†Œ 18μ„Έ 이상
      "maximum": 99
    },
    "hobbies": {
      "description": "μ·¨λ―Έ λͺ©λ‘",
      "type": "array",
      "items": { // λ°°μ—΄μ˜ 각 μš”μ†ŒλŠ” λ¬Έμžμ—΄μ΄μ–΄μ•Ό 함
        "type": "string"
      },
      "maxItems": 5 // μ΅œλŒ€ 5개의 취미만 ν—ˆμš©
    }
  },
  "required": ["id", "username", "email"] // 이 3κ°€μ§€ ν•„λ“œλŠ” λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄μ•Ό 함
}

C. μœ νš¨μ„± κ²€μ¦μ˜ κ²°κ³Ό (Validation)

μœ„μ˜ μŠ€ν‚€λ§ˆλ₯Ό κΈ°μ€€μœΌλ‘œ μ•„λž˜μ˜ 데이터가 듀어왔을 λ•Œ κ²°κ³Όλ₯Ό μ˜ˆμΈ‘ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

JSON 데이터검증 결과이유
{ "id": 1004, "username": "A" }❌ μ‹€νŒ¨required ν•„λ“œμΈ "email"이 λˆ„λ½λ¨. "username"은 minLength: 4 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•¨.
{ "id": 999, "username": "user123", "email": "a@b.com" }❌ μ‹€νŒ¨"id"κ°€ minimum: 1000 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•¨.
{ "id": 1005, "username": "okuser", "email": "valid@email.net", "age": 16 }❌ μ‹€νŒ¨"age"κ°€ minimum: 18 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•¨.
{ "id": 1005, "username": "okuser", "email": "valid@email.net", "age": 20 }βœ… 성곡λͺ¨λ“  required ν•„λ“œκ°€ ν¬ν•¨λ˜μ—ˆκ³ , 각 속성이 μ •μ˜λœ type 및 constraintsλ₯Ό λ§Œμ‘±ν•¨.

4. πŸ›  JSON Schema의 ν™œμš© 및 λ”₯ν•œ 관점

  • API First 개발: JSON Schemaλ₯Ό λ¨Όμ € μ •μ˜ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°œλ°œμžκ°€ λ™μ‹œμ— μž‘μ—…μ„ μ‹œμž‘ν•  수 있게 ν•©λ‹ˆλ‹€. μ΄λŠ” API의 계약(Contract)을 λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€.
  • 톡합 ν…ŒμŠ€νŠΈ: μŠ€ν‚€λ§ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ API μš”μ²­κ³Ό 응닡을 μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜μ—¬, 데이터 포맷 λ³€κ²½ μ‹œ μ¦‰κ°μ μœΌλ‘œ 였λ₯˜λ₯Ό 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜€ν”ˆμ†ŒμŠ€ μƒνƒœκ³„: μˆ˜λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄(JavaScript, Python, Java λ“±)μ—μ„œ JSON Schemaλ₯Ό κ²€μ¦ν•˜λŠ” 라이브러리(Validator)λ₯Ό μ œκ³΅ν•˜κ³  μžˆμ–΄ 적용이 μš©μ΄ν•©λ‹ˆλ‹€.
  • $ref ν™œμš©: λ³΅μž‘ν•œ μŠ€ν‚€λ§ˆλ₯Ό λ§Œλ“€ λ•Œ, $ref\ ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μŠ€ν‚€λ§ˆ νŒŒμΌμ„ μ°Έμ‘°ν•˜κ±°λ‚˜ μŠ€ν‚€λ§ˆ λ‚΄μ˜ 일뢀뢄을 μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 쀑볡을 μ€„μ—¬μ€λ‹ˆλ‹€.

JSON SchemaλŠ” λ‹¨μˆœνžˆ μ—λŸ¬λ₯Ό μž‘λŠ” 도ꡬλ₯Ό λ„˜μ–΄, λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ λ°μ΄ν„°μ˜ μ‹ λ’°μ„±κ³Ό 개발의 생산성을 λ†’μ΄λŠ” 핡심적인 섀계 λ„κ΅¬μž…λ‹ˆλ‹€. 데이터 μ€‘μ‹¬μ˜ κ°œλ°œμ„ ν•˜μ‹ λ‹€λ©΄ λ°˜λ“œμ‹œ μˆ™μ§€ν•΄μ•Ό ν•  ν‘œμ€€μž…λ‹ˆλ‹€!

infodori1234

Recent Posts

πŸ–₯ NetBIOS over TCP IP NBT μ™„μ „ κ°€μ΄λ“œ

둜컬 λ„€νŠΈμ›Œν¬ ν™˜κ²½μ„ μ‘°κΈˆμ΄λΌλ„ 닀뀄본 μ‚¬λžŒμ΄λΌλ©΄ ν•œ λ²ˆμ―€μ€ λ§ˆμ£ΌμΉ˜λŠ” μ΅μˆ™ν•œ 단어가 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ NetBIOS와 NBTμž…λ‹ˆλ‹€.…

2κ°œμ›” ago

🏠 ECMAScript 3 ν˜Έν™˜μ„± μ™„μ „ 정리 κ°€μ΄λ“œ

❌ ECMAScript 3(E3)λž€ λ¬΄μ—‡μΌκΉŒ ECMAScript 3λŠ” 1999년에 κ³΅μ‹ν™”λœ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€μ΄λ‹€. μ§€κΈˆ 보면 였래된 기술 κ°™μ§€λ§Œ,…

2κ°œμ›” ago

πŸ–₯ CoffeeScript μ™„μ „ κ°€μ΄λ“œ

CoffeeScriptλŠ” ν•œλ•Œ ν”„λ‘ νŠΈμ—”λ“œ 개발 μƒνƒœκ³„μ—μ„œ 맀우 인기 μžˆμ—ˆλ˜ μ–Έμ–΄μ˜€κ³ , μ§€κΈˆλ„ νŠΉμ • ν”„λ‘œμ νŠΈλ‚˜ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œ, κ°„κ²°ν•œ…

2κ°œμ›” ago

🏠 λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak) μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°: πŸ–₯ λ‚­λΉ„λ˜λŠ” μ»΄ν“¨ν„°μ˜ κΈ°μ–΅λ ₯ ❌

ν˜„λŒ€μ μΈ ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λŠ” μ—¬μ „νžˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜μ™€ μΆ©λŒμ„ μΌμœΌν‚€λŠ” μ£Όμš” 원인 쀑…

2κ°œμ›” ago

πŸ–₯️ λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • (CRP) : μ›ΉνŽ˜μ΄μ§€κ°€ λˆˆμ•žμ— λ‚˜νƒ€λ‚˜κΈ°κΉŒμ§€μ˜ λ§ˆλ²•

(Critical Rendering Path, 핡심 λ Œλ”λ§ 경둜 μ™„λ²½ 이해) μ›Ή λΈŒλΌμš°μ €μ— μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ³  μ—”ν„°λ₯Ό λˆ„λ₯΄λŠ” μˆœκ°„,…

2κ°œμ›” ago

πŸ›‘ CORS 였λ₯˜ 원리 μ™„λ²½ ν•΄μ„€: λΈŒλΌμš°μ € λ³΄μ•ˆμ˜ ν•„μˆ˜ κ΄€λ¬Έ! πŸ›‘οΈ

μ›Ή κ°œλ°œμ„ ν•˜λ‹€ 보면 λˆ„κ΅¬λ‚˜ ν•œ 번쯀 뢉은색 κΈ€μ”¨μ˜ CORS 였λ₯˜(Cross-Origin Resource Sharing Error)λ₯Ό λ§Œλ‚˜κ²Œ…

3κ°œμ›” ago