CSV ↔ JSON 변환 가이드: 엑셀을 API로 바꾸는 법
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
목차
스프레드시트 데이터를 API로 보내야 하거나,
반대로 API 응답을 엑셀로 열어야 할 때마다 CSV ↔ JSON 변환이 필요합니다. 두 형식의 차이를 이해하고 변환 도구를 활용하면 복잡한 코딩 없이 몇 초 만에 처리할 수 있습니다. 다만 한글 인코딩과 쉼표·줄바꿈 이스케이프 같은 함정이 있어 원리 이해가 중요합니다.
이 글은 CSV·JSON 형식 비교, 상호 변환 방법, 한국에서 가장 흔한 인코딩 문제(EUC-KR vs UTF-8),
특수문자 이스케이프 규칙, 대용량 데이터 처리 패턴까지 한 번에 정리합니다.
CSV와 JSON이란?#
CSV(Comma-Separated Values)#
쉼표로 값을 구분하는 텍스트 형식입니다. RFC 4180이 비공식 표준이지만, 실제로는 도구마다 미세하게 다르게 처리합니다. 엑셀, 구글 시트에서 내보낼 때 가장 많이 쓰입니다.
이름,나이,도시
홍길동,30,서울
김철수,25,부산
특징:
- 사람이 읽기 쉽고 용량이 작음
- 데이터 구조가 단순한 표 형식에 적합
- 중첩 구조(배열 속 객체 등) 표현 불가
- 자료형 정보 없음(모든 값이 문자열)
JSON(JavaScript Object Notation)#
키-값 쌍으로 구성된 계층형 데이터 형식입니다. RFC 8259가 표준이며, REST API·웹 애플리케이션·설정 파일에서 사실상 표준입니다.
[
{ "이름": "홍길동", "나이": 30, "도시": "서울" },
{ "이름": "김철수", "나이": 25, "도시": "부산" }
]
특징:
- 중첩 구조, 배열, 다양한 데이터 타입(string, number, boolean, null) 지원
- API 통신·설정 파일에 널리 사용
- 사람이 읽기는 CSV보다 약간 복잡
- 표준 명세 명확
언제 어떤 형식을 쓰나?#
| 상황 | 권장 형식 | 이유 |
|---|---|---|
| 엑셀로 데이터 분석 | CSV | 직접 열기 가능 |
| API 요청/응답 | JSON | 자료형·중첩 구조 |
| 데이터베이스 내보내기 | CSV | 단순 테이블 |
| 설정 파일 | JSON | 복잡한 옵션 트리 |
| 대용량 로그 데이터 | CSV(또는 JSON Lines) | 용량 효율 |
| 중첩 데이터 구조 | JSON | 표현력 |
| 빅데이터 ETL | Parquet/JSON Lines | 스트리밍 처리 |
| 비개발자 공유 | CSV | 엑셀 호환 |
변환 도구 사용법#
CSV → JSON#
- CSV 텍스트를 도구에 붙여넣기
- 첫 번째 행을 헤더(키)로 인식
- JSON 배열 형태로 변환 결과 확인
- 복사 또는 다운로드
입력 (CSV):
name,score,pass
Alice,92,true
Bob,45,false
출력 (JSON):
[
{ "name": "Alice", "score": "92", "pass": "true" },
{ "name": "Bob", "score": "45", "pass": "false" }
]
주의: CSV는 모든 값을 문자열로 처리합니다. 숫자나 불리언이 필요하다면 변환 후 파싱이 추가로 필요합니다.
JSON → CSV#
- JSON 배열을 도구에 붙여넣기
- 최상위 키들이 자동으로 헤더 행으로 변환
- 중첩 객체는 펼쳐지거나 문자열로 직렬화됨
- 다운로드 또는 복사 후 엑셀에 붙여넣기
자주 겪는 문제와 해결법#
1. 한글 인코딩 문제(EUC-KR vs UTF-8)#
엑셀에서 저장한 CSV를 열면 한글이 깨지는 경우가 많습니다.
원인: Microsoft Excel(특히 Windows 한글 버전)의 기본 CSV 인코딩이 EUC-KR/CP949인 반면,
대부분의 도구·웹은 UTF-8 기준으로 처리합니다.
해결법:
- 엑셀 저장 시: "다른 이름으로 저장" → 형식 "CSV UTF-8(쉼표로 분리)" 선택
- 메모장 활용: 메모장에서 열어 "다른 이름으로 저장" → 인코딩 "UTF-8" 선택
- 코드로 변환: PowerShell이나 Python으로 인코딩 변환
# PowerShell
Get-Content .\input.csv -Encoding Default | Set-Content .\output.csv -Encoding UTF8
# Python
import codecs
with codecs.open("input.csv", "r", "cp949") as f_in, \
codecs.open("output.csv", "w", "utf-8") as f_out:
f_out.write(f_in.read())
BOM(Byte Order Mark) 이슈: 엑셀이 UTF-8 CSV를 정확히 열려면 파일 앞에 BOM(EF BB BF)이 있어야 합니다. UTF-8 BOM 없이 저장된 CSV는 한글이 깨질 수 있습니다.
2. 쉼표가 포함된 필드#
값 안에 쉼표가 있으면 필드 구분이 깨집니다.
잘못된 예: 서울,경기,인천,30세 이상,남성 (필드 5개)
올바른 예: "서울,경기,인천",30세 이상,남성 (필드 3개)
쉼표를 포함하는 필드는 큰따옴표(")로 감싸야 합니다. 변환 도구는 이 규칙을 자동으로 처리합니다.
3. 큰따옴표가 포함된 필드#
값 안에 큰따옴표가 있으면 큰따옴표 두 개("")로 이스케이프합니다.
원본: 그가 말하길 "안녕하세요"
CSV: "그가 말하길 ""안녕하세요"""
4. 줄바꿈이 포함된 텍스트#
셀 안에 줄바꿈이 있는 경우도 큰따옴표로 감싸는 것이 표준입니다.
"첫 번째 줄
두 번째 줄",다음필드
엑셀 셀에서 Alt+Enter로 줄바꿈한 텍스트를 CSV로 저장하면 자동으로 큰따옴표 처리됩니다.
5. JSON 배열이 아닌 경우#
JSON → CSV 변환은 최상위가 배열일 때 가장 자연스럽게 동작합니다. 단일 객체({})는 1행 CSV로 변환하거나, 중첩 구조를 평탄화해야 합니다.
변환 어려움:
{
"users": [
{ "id": 1, "name": "홍길동" }
],
"meta": { "total": 1 }
}
해결: users 배열만 추출
[{ "id": 1, "name": "홍길동" }]
6. 중첩 객체 평탄화#
입력:
[
{ "id": 1, "user": { "name": "홍길동", "age": 30 } }
]
출력 옵션 A (평탄화):
id,user.name,user.age
1,홍길동,30
출력 옵션 B (JSON 문자열):
id,user
1,"{""name"":""홍길동"",""age"":30}"
대부분의 변환 도구는 옵션 A(점 표기 평탄화)를 기본값으로 사용합니다.
7. null·undefined 처리#
JSON의 null은 CSV에서 빈 칸으로 변환됩니다. 데이터 분석 시 빈 값이 진짜 빈 값인지 누락된 값인지 구분이 어렵습니다.
입력: { "name": "홍길동", "phone": null }
CSV: 홍길동,
데이터 정제 시 null을 명시적으로 "NULL" 또는 빈 문자열 ""로 처리하는 것이 좋습니다.
자료형 자동 추론(Auto Type)#
일부 변환 도구는 CSV → JSON 시 숫자·불리언을 자동 추론합니다.
입력:
name,age,active
Alice,30,true
자동 추론 ON:
[{ "name": "Alice", "age": 30, "active": true }]
자동 추론 OFF:
[{ "name": "Alice", "age": "30", "active": "true" }]
자동 추론은 편리하지만 의도치 않은 변환이 일어날 수 있습니다(예: 우편번호 "01234"가 숫자 1234가 됨). 정확성이 중요한 데이터는 OFF로 두고 후처리합니다.
대용량 데이터 처리#
JSON Lines(NDJSON) 형식#
대용량 데이터는 표준 JSON 배열 대신 JSON Lines를 사용합니다. 한 줄에 하나의 JSON 객체로, 스트리밍 처리에 적합합니다.
{"id": 1, "name": "홍길동"}
{"id": 2, "name": "김철수"}
{"id": 3, "name": "이영희"}
빅데이터 도구(Spark·Hive·Athena 등), 로그 파이프라인, AI 모델 학습 데이터 형식의 표준입니다.
메모리 효율 변환#
수백 MB 이상의 CSV를 한 번에 메모리에 로드하면 OOM(Out of Memory)이 발생합니다. 스트리밍 변환 라이브러리를 활용합니다.
- Node.js:
fast-csv,csv-parser - Python:
pandas.read_csv(chunksize=10000) - Go:
encoding/csv(라인별 스캔)
브라우저 기반 변환 도구는 보통 수 MB까지가 안정적입니다. 그 이상은 서버 측 또는 명령줄 도구를 사용합니다.
보안: CSV Injection#
CSV 파일에 =, +, -, @로 시작하는 값을 넣으면 엑셀에서 수식으로 해석되어
의도치 않은 동작을 합니다(CSV Injection / Formula Injection).
악의적 예:
name,formula
Alice,=cmd|'/c calc'!A1
엑셀로 열면 계산기가 실행될 수 있습니다(설정에 따라 차단 가능). 사용자 입력을 CSV로 내보낼 때는 다음 처리가 필요합니다.
- 첫 글자가
=,+,-,@이면 앞에 작은따옴표(') 추가 - 또는 큰따옴표로 감싸고 첫 글자 앞 공백 추가
OWASP가 권장하는 보안 처리이며, 사용자 데이터를 CSV로 내보내는 모든 서비스에 적용해야 합니다.
라이브러리 비교(개발자용)#
JavaScript / TypeScript#
| 라이브러리 | 특징 | 권장 상황 |
|---|---|---|
papaparse | 가장 인기, 다양한 옵션 | 일반 웹 |
csv-parser | Node.js 스트리밍 | 대용량 |
fast-csv | 스트리밍 + Promise | Node.js 서버 |
JSON.parse / JSON.stringify | 내장 | 작은 JSON |
Python#
| 라이브러리 | 특징 | 권장 상황 |
|---|---|---|
csv(내장) | 표준, 충분히 강력 | 일반 |
pandas.read_csv | 데이터 분석용 | 분석·통계 |
polars | 최신, 빠름 | 대용량 |
예시(Python pandas)#
import pandas as pd
# CSV → JSON
df = pd.read_csv("data.csv", encoding="utf-8")
df.to_json("data.json", orient="records", force_ascii=False)
# JSON → CSV
df = pd.read_json("data.json")
df.to_csv("data.csv", index=False, encoding="utf-8-sig") # BOM 포함
실무 활용 예시#
마케팅 담당자#
구글 시트의 고객 데이터 → CSV 내보내기 → JSON 변환 → CRM API 업로드
개발자#
API 테스트 결과(JSON) → CSV 변환 → 엑셀로 열어 기획팀에 전달
데이터 분석가#
데이터베이스 쿼리 결과(CSV) → JSON 변환 → 프론트엔드 차트 라이브러리에 바로 사용
QA 엔지니어#
테스트 데이터(CSV) → JSON 변환 → API 자동화 테스트 input
자주 묻는 질문#
Q. 엑셀에서 직접 JSON으로 저장할 수는 없나요?
A. 엑셀 자체에는 JSON 내보내기 기능이 기본 제공되지 않습니다. CSV로 저장 후 변환 도구를 거치는 방식이 일반적입니다. Microsoft 365 Excel은 Power Query를 통해 JSON 임포트/익스포트가 가능합니다.
Q. JSON 파일을 엑셀에서 열려면 어떻게 하나요?
A. 두 가지 방법이 있습니다.
- JSON → CSV 변환 후 엑셀로 열기
- 엑셀의 데이터 → JSON에서 가져오기(Get Data → From File → From JSON)
Q. 큰 CSV를 변환하려면 어떻게 해야 하나요?
A. 브라우저 기반 도구는 보통 5–10MB까지 안정적입니다. 그 이상은 명령줄(csvkit, jq) 또는 Python 스크립트를 권장합니다.
Q. CSV의 구분자가 쉼표가 아닌 경우(세미콜론·탭)는?
A. CSV의 변형으로 TSV(Tab-Separated Values), SSV(Semicolon)가 있습니다. 변환 도구에서 구분자 옵션을 변경하거나, 텍스트 에디터에서 일괄 치환 후 처리합니다. 유럽 일부 국가는 쉼표를 소수점에 사용해 세미콜론을 구분자로 씁니다.
Q. 한글이 깨진 CSV를 복구할 수 있나요?
A. 인코딩이 명확하면 가능합니다. 텍스트 에디터(VS Code, Notepad++)에서 인코딩을 EUC-KR/CP949로 다시 열어 보세요. 한 번 잘못된 인코딩으로 저장된 파일은 복구가 어렵습니다.
Q. JSON에 주석을 넣을 수 있나요?
A. 표준 JSON은 주석을 지원하지 않습니다. 주석이 필요하면 JSON5나 JSONC(JSON with Comments) 같은 변형을 사용합니다. CSV는 일부 도구에서 #으로 시작하는 주석 행을 지원합니다.
CSV ↔ JSON 변환 도구 활용#
CSV ↔ JSON 변환 도구에 텍스트를 붙여넣으면 양방향 변환을 즉시 처리합니다. UTF-8 인코딩 기본, 쉼표·줄바꿈 이스케이프 자동 처리, 대용량 텍스트도 빠르게 변환합니다.
텍스트 작업이 더 필요하다면 글자 수 세기 가이드에서 분량 관리를,
대소문자 변환 가이드에서 명명 규칙 변환을,
텍스트 비교(Diff) 활용법에서 데이터 변경 추적을 확인할 수 있습니다.