Skip to content

제1.3장: JSON 형식

학습 시간: 35분


1. JSON: 우주 통신 언어

우주 탐사선과 관제 센터가 서로 다른 언어로 말한다고 상상해 보세요. JSON (JavaScript Object Notation)은 사람과 기계 모두가 이해할 수 있는 범용 데이터 언어입니다. 마치 우주 비행사들의 국제어와 같습니다!

주요 특징:

  • 🪶 경량성: 약한 신호에서도 빠른 전송
  • 👀 가독성: 육안으로 구조 파악 용이
  • 🔄 범용성: 모든 프로그래밍 언어에서 지원

💡 우주 비유:

JSON은 별 데이터가 담긴 디지털 전보와 같습니다. 모스 부호 대신 {키: 값} 형태의 명확한 구조를 사용합니다.


2. JSON 메시지의 해부

JSON은 두 가지 유형의 구조로 구성됩니다:

A. 객체 (우주선)

{
  "name": "Voyager-1",
  "launch_year": 1977,
  "is_active": true,
  "position": [-19.1, 42.7, 0.3]
}

B. 배열 (성단)

[
  {"name": "Sirius", "magnitude": -1.46},
  {"name": "Canopus", "magnitude": -0.74},
  {"name": "Arcturus", "magnitude": -0.05}
]

구문 규칙:

  • 키는 따옴표 " " 안에
  • 값: 문자열, 숫자, 불리언 (true/false), null
  • 데이터는 쉼표로 구분
  • 객체는 중괄호 {}, 배열은 대괄호 [] 사용

3. JSON vs XML: 형식의 대결

매개변수 JSON (현대 위성) XML (오래된 망원경)
가독성 높음 (필드에 직접 접근) 낮음 (태그 <planet>...</planet>)
크기 간결함 번거로움 (크기 +30%)
처리 속도 빠름 느림
예시 {"planet": "Mars"} <planet>Mars</planet>

🔭 JSON이 우주에서 승리한 이유?

NASA, SpaceX, ESA의 API는 JSON을 사용합니다 — 데이터 전송에 이상적이기 때문입니다!


4. 코드에서 JSON 사용하기

Python 예시 (달 데이터 가져오기):

import requests
import json

# 실제 API 사용 예시: 태양계 데이터를 가져오기 위해
# The Solar System OpenData API에서
try:
    response = requests.get("https://api.le-systeme-solaire.net/rest/bodies/terre")
    response.raise_for_status() # HTTP 오류 (4xx, 5xx) 확인

    planet_data = response.json()

    print(f"이름: {planet_data['englishName']}")
    print(f"위성: {[moon['moon'] for moon in planet_data['moons']]}")

    # Python 딕셔너리를 JSON 문자열로 변환하여 저장
    planet_json_str = json.dumps(planet_data, indent=2, ensure_ascii=False) # ensure_ascii=False는 키릴 문자 지원을 위함
    print("\n--- 형식화된 JSON ---")
    print(planet_json_str)

except requests.exceptions.RequestException as e:
    print(f"요청 오류: {e}")

JavaScript 예시 (망원경 데이터 처리):

const Data = `{
  "id": "terre",
  "name": "La Terre",
  "englishName": "Earth",
  "isPlanet": true,
  "moons": [
    {
      "moon": "La Lune",
      "rel": "https://api.le-systeme-solaire.net/rest/bodies/lune"
    }
  ],
  "semimajorAxis": 149598023,
  "perihelion": 147095000,
  "aphelion": 152100000,
  "eccentricity": 0.0167,
  "inclination": 0,
  "mass": {
    "massValue": 5.97237,
    "massExponent": 24
  },
  "vol": {
    "volValue": 1.08321,
    "volExponent": 12
  },
  "density": 5.5136,
  "gravity": 9.8,
  "escape": 11190,
  "meanRadius": 6371.0084,
  "equaRadius": 6378.1366,
  "polarRadius": 6356.8,
  "flattening": 0.00335,
  "dimension": "",
  "sideralOrbit": 365.256,
  "sideralRotation": 23.9345,
  "aroundPlanet": null,
  "discoveredBy": "",
  "discoveryDate": "",
  "alternativeName": "",
  "axialTilt": 23.4393,
  "avgTemp": 288,
  "mainAnomaly": 358.617,
  "argPeriapsis": 85.901,
  "longAscNode": 18.272,
  "bodyType": "Planet"
}`;

const dataObj = JSON.parse(Data);
console.log(dataObj.target);


5. JSON 유효성 검사: "신호" 확인

데이터를 사용하기 전에 JSON이 다음을 만족하는지 확인하세요:

  1. 올바른 구조를 가졌는지 (괄호를 확인하세요!)

  2. 예상 필드를 포함하는지

  3. 구문 오류가 없는지

도구: - JSONLint (JSON을 위한 우주 쓰레기 탐지기처럼) - 내장 언어 파서 (잘못된 형식일 경우 오류 발생)

⚠️ 오류 예시:

{"planet": "Mars" → 닫는 괄호가 없습니다!

해결책: Python에서는 json.loads()를, JS에서는 JSON.parse()를 항상 사용하여 검증하세요.


복습 퀴즈

1. JSON은 다음의 약자입니다...

2. JSON에서 객체는 어떻게 표현되나요:

3. 다음 중 JSON에서 유효한 값이 아닌 것은 무엇입니까?

4. 우주 API에 JSON이 XML보다 더 나은 이유는 무엇인가요?

5. JSON 문자열을 Python 객체로 변환하는 방법은 무엇입니까?


🚀 장 요약:

JSON은 API 세계의 "우주 에스페란토"입니다. 그 구조를 알면 다음을 수행할 수 있습니다:

  • 📡 망원경과 탐사선에서 데이터 수신

  • 🔧 시스템 간 정보 변환

  • 🛰️ 과학 데이터 파일 저장

도킹을 준비하세요! 다음 장에서는 서버의 "우주 정거장" 관리 시스템인 REST API 아키텍처를 학습할 것입니다.

📌 실습: NASA Open APIs에 접속하여 소행성 API (Asteroids NeoWs)를 찾아 응답의 JSON 구조를 살펴보세요!