데이터 교환 형식 (XML, JSON, YAML, CSV)

데이터 교환 형식의 필요성

  • 서로 다른 환경의 시스템들이 데이터를 온전히 주고받으려면, 메모리 속 객체를 전송 가능한 형태로 변환하는 직렬화(Serialization)와 이를 다시 복원하는 역직렬화(Deserialization) 과정이 필수적으로 동반됨
  • 데이터 교환 형식은 이 과정에서 이기종 플랫폼 간의 상호 운용성(Interoperability)을 보장하고 데이터 누락이나 왜곡을 방지하기 위한 표준 규격의 역할 수행

 

1. 사용자가 태그를 정의, XML

  • XML: eXtensible Markup Language

(1) XML의 개념 및 특징

개념특징
사용자가 직접 태그를 정의하여 데이터의 구조와 의미를 기술하는 확장 가능한 데이터 교환 형식– 텍스트 기반 높은 가독성
– H/W나 OS에 독립적 사용
– 사람이 태그를 정의해서 사용
– DTD 등 유효성 검증 가능

(2) XML의 사례 기반 문법 및 구조

사례
<?xml version="1.0" encoding="UTF-8"?>
<user>
  <name>홍길동</name>
  <age>25</age>
  <isEmployee>true</isEmployee>
  <skills>
    <skill>Java</skill>
    <skill>JavaScript</skill>
  </skills>
  <address>
    <city>서울</city>
    <zipcode>12345</zipcode>
  </address>
</user>
문법
/구조
  • 태그(<tag>)의 시작과 끝으로 데이터 표현
  • 명시적 데이터 타입 없이 텍스트로 표현 (“25″는 코드 내 숫자 형식으로 변환 필요)
  • 배열과 하위 객체는 태그를 중첩 (<skills> 태그 내 하위에 <skill> 태그)
  • 선택적인 선언문(Prolog)과 속성(Attribute)
    • <?xml version=”1.0″ …> 같이 인코딩 형식 등 선언
    • 필요 시 <user id=”1″> 처럼 태그 내 속성 부여 가능
  • XML은 W3C 표준 기반 공공데이터 연동, 엔터프라이즈 레거시 시스템, 전자문서 교환에 다수 사용

 

2. 키-쌍 기반 경량 데이터 교환, JSON

  • JSON: JavaScript Object Notation

(1) JSON의 개념 및 특징

개념특징
데이터를 키-값 쌍으로 표현하는 가볍고 읽기 쉬운 표준 텍스트 기반 데이터 교환 형식– 텍스트 기반: 사람이 읽기 쉬움
– 독립적 형식: 언어에 종속 안 됨
– 키-값 구조: 데이터 검색 용이
– 가벼운 용량: 고속 데이터 전송

(2) JSON의 사례 기반 문법 및 구조

사례
{
  "name": "홍길동",
  "age": 25,
  "isEmployee": true,
  "skills": ["Java", "JavaScript"],
  "address": {
    "city": "서울",
    "zipcode": "12345"
  }
}
문법
/구조
  • 중괄호(‘{‘, ‘}’)를 이용하여 데이터 객체의 시작 및 종료를 정의
  • 데이터는 키(Key):값(Value) 쌍으로 존재
  • 데이터가 여러 개일 때는 쉼표(‘,’)로 각각의 데이터를 구분
  • 다양한 타입의 값(Value)을 가질 수 있음
    • 문자열 형식: “홍길동” (쌍따옴표 필수)
    • 숫자 형식: 25 (따옴표 없음)
    • Boolean 형식: true / false (소문자로 작성)
    • 배열: [“Java”, “JavaScript”] (대괄호 ‘[‘, ‘]’ 사용)
    • 하위 객체(중첩): {“city”: “서울”, …} (구조화된 하위 데이터 표현)
  • JSON은 ECMA-404와 RFC 8259 표준 기반 웹/앱과 서버 간의 데이터 통신에 다수 사용

 

3. 가독성 최우선 데이터 표현, YAML

(1) YAML의 개념 및 특징

  • YAML: YAML Ain’t Markup Language (또는 Yet Another Markup Language)
개념특징
가독성을 최우선 고려하여 들여쓰기(공백)와 줄바꿈만으로 계층 구조를 표현하는 데이터 교환 형식– 기호 없이 줄바꿈과 들여쓰기만 사용
– H/W, OS 독립적, JSON 호환
– ‘#’ 주석을 사용하여 협업 가능
– 앵커(&), 알리아스(*) 기반 재사용

(2) YAML의 사례 기반 문법 및 구조

사례
# 개발팀원 홍길동의 정보
name: 홍길동
age: 25
isEmployee: true
skills:
  - Java
  - JavaScript
address:
  city: 서울
  zipcode: "12345"
문법
/구조
  • 줄바꿈과 들여쓰기만을 사용하여 해당 데이터 객체의 시작과 종료를 표현
  • 주석은 “#”으로 표현, 데이터는 “키: 값”으로 표현 (콜론 뒤에 공백 필수)
  • 유연한 타입 표현과 데이터 구조화
    • 따옴표 없이 문자/숫자/Boolean 형식 자동 인식
    • 쌍따옴표(“) 사용 시 강제로 문자 형식으로 인식
    • 배열은 하이픈과 공백(“- “)을 앞에 붙여서 나열
    • 하위 객체는 아래 행에 추가 들여쓰기로 하위 구조 표현
  • YAML은 De Facto 표준으로 IT시스템 인프라 및 애플리케이션의 환경 설정에 다수 사용

 

4. 대용량 데이터 구조화, CSV

  • CSV: Comma-Separated Values

(1) CSV의 개념 및 특징

개념특징
일부 규칙과 줄바꿈, 쉼표(,)를 사용하여 표 형태(Tabular)의 대용량 데이터를 구조화하는 데이터 교환 형식– 첫 행에 헤더, 둘째 행부터 데이터
– 각종 스프레드시트 프로그램과 호환
– 표(Table) 형태 2차원 평면 구조
– 스키마 없는 고속 대용량 처리

(2) CSV의 사례 기반 문법 및 구조

사례
name,age,isEmployee,skills,city,zipcode
홍길동,25,true,"Java, JavaScript",서울,12345
김철수,27,true,"C++, Python",대전,34567
문법
/구조
  • 첫 행(Row)은 헤더, 둘째 행(Row)부터 레코드로 인식
  • 레코드는 첫 행 헤더의 열 순서에 따라 쉼표로 구분하여 각각의 값를 인식
  • 데이터 타입 구분 없이 모두 텍스트로 처리되므로 필요 시 코드 내 변환 필요
  • 배열과 하위 객체는 기본적으로 표현 불가능
    • 여러 값 필요 시 쌍따옴표(“)로 감싸서 하나의 값으로 표현 필요
    • 하위 객체 처리 불가로 헤더 자체를 풀어서 일렬로 나열
      (city, zipcode 하위 객체 처리 불가)
  • CSV는 RFC 4180 규격 기반 대용량 표 형태 데이터의 일괄 저장 및 시스템 간 데이터 마이그레이션에 다수 사용

 

5. 각 데이터 교환 형식 비교

비교 항목XMLJSONYAMLCSV
주요 문법태그중괄호들여쓰기쉼표
구조 형태계층형계층형계층형평면형
가독성낮음보통높음보통
오버헤드높음보통낮음낮음
파싱 속도느림빠름보통빠름
주석 지원가능불가가능불가
주 사용처레거시 연동웹 통신환경설정대용량
  • 과거 오래된 기관 연동 방식은 대부분 XML을 사용하고, 최근 웹/앱 데이터 교환 시 JSON을 사용, 인프라/APP 환경 설정은 YAML을 사용하고 표 형식의 대용량 데이터는 CSV를 주로 사용

 

[참고]

콘텐츠 사용 시 출처 표기 부탁 드리고, 댓글은 큰 힘이 됩니다^^