티스토리 뷰
json과 csv, xml은 모두 데이터를 저장하기 위해 사용하는 데이터 포맷이다.
사실 그냥 개발자가 데이터의 구성요소를 구분할 수 있도록 특정한 규칙을 따라서 저장한다면 txt로 저장한다고 해도 충분히 잘 굴러간다.
그렇다면 이 3가지 포맷이 필요한 이유는 무엇일까.
일단 1차적으로 규격화된 방식이라는 점이 있겠다. 규격화 되어있는 방식이기에 누가 읽어도 이 포맷에 대한 지식 만 있다면 같은 내용을 보게 될 것이고, 이 점을 통해서 작업 공유에 불필요한 과정을 넘겨버릴 수 있게 된다는 장점이 있다.
그리고 2번째로는 호환성이 있다. Excel의 경우 현재는 Excel파일을 작성하면 csv로 저장할 수 있는 기능이 있다.
또한 검색을 해 보면 꽤나 간단하게 찾아낼 수 있는 것이 위 3가지 포맷으로의 직렬화 방법이다.
이런 점을 통해서 이점을 찾을 수 있기 때문에, 일반적으로는 위 3가지 포맷 중 하나를 사용하게 된다.
각 포맷 별 장단점
각 포맷 마다 특화된 분야가 다르긴 하나, 일반적으로는 하나의 포맷을 정해서 그 하나만 쓰는 방식을 많이 사용하는 것으로 알고 있다. 그래도 일단 각 포맷 별 특징과 장점 만 간단하게 설명해 보고자 한다.
XML
XML을 그래프로 나타내면 가장 포괄적인 데이터를 루트로 삼는 트리 형태가 된다.
- 구성 방식
- 각 데이터를 <attribute> value </attribute> 같은 방식으로 줄을 넘겨 가면서 작성한다.
- 배열이나 리스트 등으로 인해서 묶여있는 데이터가 있다면 상위 데이터의 <attribute>와 </attribute> 사이의 줄에 작성한다.
- 장점
- 각 데이터 마다 필드의 이름이 명시되기 때문에 데이터 내용을 파악하기가 용이하다.
- 단점
- 모든 데이터를 줄을 나눠서 작성하기 때문에 데이터가 길어지면 한 눈에 파악하기가 어렵다.
- 데이터의 양 옆에 변수의 위치를 지정하는 문구가 추가되기 때문에 메타데이터의 크기가 크다.
JSON
Day-14에서 작성했던 Dictionary와 유사한 key-value 구조를 가지고 있다.
- 구성 방식
- 구성 객체를 하나의 index와 중괄호로 묶는다.
- 중괄호 안에 작성하고자 하는 데이터의 내용을 서술한다. (ex. valueName: value1,)
- 만약 데이터가 배열이나 리스트일 경우에는 대괄호로 묶어서 하나의 value로 사용한다.
- 이러한 묶음을 객체 이름으로 묶어서 한번 더 묶어서 표시한다.
- 장점
- 구조가 직관적이라 관련 코드를 짜기가 편하다.
- 3가지 방식 중에서 유일하게 C# 자체에 직렬화 및 역직렬화 패키지가 존재한다.
- 단점
- 주석을 쓸 수가 없다.
CSV
CSV파일을 보기 좋게 정렬하면 표(Table) 형태가 된다.
- 구성 방식
- 저장하는 데이터를 모두 구분자(기본값은 ,(쉼표))로 연결하여 문자열을 만든다.
- 배열 등으로 인해 포함 관계를 명시해야 할 경우에는 그에 대한 구분자를 추가로 구비할 수 있다.
- 이 문자열을 하나씩 입력한 뒤 줄을 넘긴다.
- 장점
- 다른 두 방식에 비해서 데이터 크기가 압도적으로 적다.
- Excel을 활용하면 별 다른 기능 구현 없이 csv로 저장할 수 있다.
- 역직렬화가 string.split만 써도 되기 때문에 전체적으로 간단하다.
- 단점
- 데이터가 다닥다닥 붙어있기 때문에 이 파일으로 정보를 파악하기는 힘들다.
- 구분자에 해당하는 문자를 데이터로 사용하면 이상하게 작동한다.
최근 가장 자주 사용되는 방식은 CSV다. 아무래도 구조 자체가 간단해서 역직렬화가 간단하기 때문일 것이다.
그렇다고 해도 JSON이나 XML이 쓰이지 않는 것은 아니기에, 나머지 포맷도 잘 익혀 두면 좋을 것이다.
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day 17 [Quaternion] (0) | 2024.10.07 |
---|---|
Today I Learned - Day 16 [파일 구성 설계법에 대하여] (4) | 2024.10.04 |
Today I Learned - Day 14 [사전(Dictionary) 구조에 대하여] (3) | 2024.10.01 |
Today I Learned - Day 13 [콘솔창 UI 작업에 관하여 - 2] (1) | 2024.09.30 |
Today I Learned - Day 12 [제너릭] (0) | 2024.09.27 |