CSV와 JSON 비교: 언제 무엇을 쓰고, 변환할 때 무엇을 조심할까
엑셀에서 내보낸 고객 목록을 API로 보내야 하거나, API 응답을 엑셀로 열어야 할 때 CSV와 JSON 변환이 필요합니다. 두 형식의 차이를 알면 변환 중 데이터가 망가지는 일을 막을 수 있습니다.
표 vs 나무: 구조의 차이
CSV(Comma-Separated Values)는 표입니다. 첫 줄이 열 이름이고 이후 각 줄이 한 행이며, 값은 쉼표로 구분합니다. 모든 행이 같은 열을 갖는 평평한 데이터를 담기에 가장 단순하고 가볍습니다.
JSON은 나무 구조입니다. 객체 안에 배열이, 배열 안에 다시 객체가 들어갈 수 있어 '주문 하나에 상품 여러 개'처럼 계층이 있는 데이터를 자연스럽게 표현합니다. 대신 같은 키 이름이 행마다 반복되어 데이터 크기가 커집니다.
name,city,score
Kim,Seoul,92
Lee,Busan,85
[
{"name": "Kim", "city": "Seoul", "score": 92},
{"name": "Lee", "city": "Busan", "score": 85}
]
언제 무엇을 쓸까
CSV에는 데이터 타입 정보가 없다는 점이 중요합니다. 우편번호 01234를 CSV로 저장하면 엑셀이 숫자로 읽어 앞의 0을 지워 버리고, 긴 카드번호나 주문번호는 1.23E+15 같은 지수 표기로 바뀌기도 합니다.
- 엑셀·구글 시트에서 열어 보거나 사람이 편집해야 하는 데이터: CSV
- 수십만 행의 단순 로그·통계를 주고받을 때: CSV (크기가 작고 줄 단위 처리가 쉬움)
- 웹 API 요청과 응답: JSON
- 항목 안에 목록이 들어가는 계층형 데이터: JSON
- 숫자, 불리언, null을 구분해야 할 때: JSON (CSV는 모든 값이 문자열)
쉼표와 따옴표: CSV 이스케이프 규칙
값 안에 쉼표가 있으면 어떻게 될까요? RFC 4180이 정한 규칙은 그 값을 큰따옴표로 감싸는 것입니다. "Seoul, Korea"처럼요. 값 안에 큰따옴표가 있으면 두 번 써서 이스케이프합니다. 그는 "안녕"이라고 말했다는 "그는 ""안녕""이라고 말했다"가 됩니다. 값 안의 줄바꿈도 따옴표로 감싸면 허용됩니다.
직접 문자열을 split(',')으로 나누는 코드는 이 규칙을 무시하기 때문에 주소나 메모 열이 있는 순간 열이 밀려 버립니다. CSV는 반드시 규칙을 지키는 파서나 변환 도구로 처리해야 합니다.
엑셀에서 한글이 깨지는 이유
UTF-8로 저장한 CSV를 윈도우 엑셀에서 더블클릭해 열면 한글이 깨지는 경우가 많습니다. 엑셀이 파일의 문자 인코딩을 추측할 때 UTF-8 표시(BOM)가 없으면 시스템 기본 인코딩으로 읽기 때문입니다.
해결 방법은 두 가지입니다. 파일 맨 앞에 UTF-8 BOM을 붙여 저장하거나, 엑셀의 '데이터 → 텍스트/CSV 가져오기' 기능으로 열면서 인코딩을 UTF-8로 지정하는 것입니다. 반대로 BOM이 붙은 파일을 프로그램이 읽을 때는 첫 열 이름 앞에 보이지 않는 문자가 붙지 않았는지 확인하세요.
중첩된 JSON을 CSV로 바꿀 때
JSON의 계층 구조를 평평한 표로 바꾸려면 규칙을 정해야 합니다. 흔한 방법은 경로를 점으로 이어 열 이름을 만드는 것입니다. {"user": {"name": "Kim"}}는 user.name 열이 됩니다.
배열은 더 까다롭습니다. 주문 하나에 상품이 세 개라면 행을 세 개로 늘릴지, items 열에 JSON 문자열로 넣을지 결정해야 합니다. 분석용이라면 행을 늘리는 쪽이, 원본 보존이 목적이라면 문자열로 넣는 쪽이 낫습니다.
변환 전 체크리스트
AIBIZAP의 CSV ↔ JSON 변환기로 변환한 뒤 JSON 포맷터로 구조를 확인하면 실수를 줄일 수 있습니다.
- 첫 줄이 헤더인지, 구분자가 쉼표인지(세미콜론·탭인 경우도 있음) 확인합니다.
- 앞자리 0이 중요한 코드 값은 문자열로 유지합니다.
- 셀 앞뒤 공백, 빈 줄은 미리 정리합니다. 공백 제거 도구를 쓰면 편합니다.
- 변환 후 행 수가 원본과 같은지 확인합니다. 다르다면 따옴표나 줄바꿈 처리 문제일 가능성이 큽니다.