🧐TIL
[다시하는 백엔드 기초 공부] JSON과 그 외 데이터 포맷
데이터 포맷
백엔드 개발을 하다보면 클라이언트와 서버 사이에 데이터를 주고 받거나 환경설정 등을 나타내기 위해 특정 데이터 형식을 사용해야 하는 경우를 자주 접하게 된다. 숫자나 문자열, 바이트 같은 원시 데이터 형태들도 존재하지만 여러 정보를 함축적으로 전달하거나 데이터의 계층 구조를 표현해야 하는 경우들이 있는데 이럴 때 JSON, XML, YAML 등과 같은 데이터 포맷을 사용하게 된다.
JSON (JavaScript Object Notation)
— 자바스크립트의 객체 문법을 기반으로 한 데이터 교환 포맷으로 파이썬 딕셔너리처럼 키-값 페어로 데이터를 표현한다. 현재 웹, 모바일, 서버 API에서 가장 널리 쓰이는 표준 형식이며 자바스크립트 외에도 다양한 프로그래밍 언어에서 지원을 하고 있다.
예시
{
"name": "apple",
"count": 30,
"isFruit": true,
"varieties": [
{"name": "Fuji", "taste": "Sweet, crunchy, and juicy"},
{"name": "McIntosh", "taste": "Tender, mildly tart, and slightly spicy"}
]
}
장점
- 가볍고 직관적이다.
- 거의 모든 프로그래밍 언어에서 지원한다.
- REST API, GraphQL 등 현대 웹 통신의 기본 포맷이다.
단점
- 주석을 쓸 수 없다.
- 데이터 구조가 커지면 가독성이 떨어질 수 있다.
XML (eXtensible Markup Language)
— 데이터를 계층적 구조로 표현하는 마크업 언어로 HTML처럼 태그(<>)로 데이터를 감싸는 것이 특징으로 SOAP, RSS, SVG 등 다양한 표준에서 여전히 사용된다.
예시
<produce>
<name>apple</name>
<count>30</count>
<isFruit>true</isFruit>
<varieties>
<variety>
<name>Fuji</name>
<taste>Sweet, crunchy, and juicy</taste>
</variety>
<variety>
<name>McIntosh</name>
<taste>Tender, mildly tart, and slightly spicy</taste>
</variety>
</varieties>
</produce>
장점
- 문서의 계층 구조가 뚜렷하고 표현력이 풍부하다.
- 데이터와 메타데이터를 모두 표현 할 수 있어 스키마를 통해 데이터 구조를 명확히 정의할 수 있다.
- namespace 지원으로 태그의 중복을 방지할 수 있다.
단점
- 문법이 장황하고, 사람이 읽기 불편하다.
- JSON 대비 데이터 크기가 크다.
YAML (YAML Ain’t Markup Language)
— 사람이 읽기 쉽도록 설계된 설정 파일 포맷으로 파이썬의 들여쓰기 스타일과 비슷하게, 구조를 들여쓰기로 표현하는 것이 특징이다. 주로 설정 파일이나 복잡한 구조를 필요로 하는 경우에 사용되며 Kubernetes, Docker Compose, GitHub Actions 등에서 표준적으로 사용된다.
예시
name: apple
count: 30
isFruit: true
varieties:
- name: Fuji
taste: "Sweet, crunchy, and juicy"
- name: McIntosh
taste: "Tender, mildly tart, and slightly spicy"
장점
- 문법이 간결하여 사람이 읽고 쓰기 편하며 가독성이 좋다.
- 복잡한 데이터 구조를 상대적으로 간결하게 표현할 수 있다.
- 주석을 지원한다.
단점
- 들여쓰기 오류가 있을 경우 파싱이 실패할 수 있다.
- 너무 자유로운 문법 때문에 구조적 제약이 약하다.
- JSON보다 파싱 속도가 약간 느리다.
무엇을 선택할 것인가?
각 데이터 형식의 장단점을 기반으로 사용 목적과 환경에 따라 아래와 같이 선택하여 쓸 수 있다.
- 데이터 전송 중심일 경우 → JSON
- 사람이 자주 편집해야 할 경우 → YAML
- 엄격한 데이터 구조 검증이 필요한 경우 → XML
그 외 기타 포맷들
- TOML(Tom’s Obvious, Minimal Language): 설정 파일용으로 제작된 포맷
- INI: 윈도우 설정 파일에서 유래된 포맷
- MessagePack: JSON과 호환되지만 더 효율적이고 빠르게 데이터를 전송하기 위한 이진 포맷
- Protobuf(Protocol Buffers): 구글에서 개발한 gRPC 용 이진 데이터 포맷
- CSV(Comma-Separated Values): 표 형식 데이터를 쉼표로 구분한 텍스트 포맷
- BSON(Binary JSON): JSON을 이진 인코딩 직렬화한 포맷으로 주로 몽고db에서 활용