CSV → JSON 변환이란 무엇인가요?
CSV(Comma-Separated Values, RFC 4180)는 납작한 표 형식의 텍스트 형식이고, JSON(JavaScript Object Notation, RFC 8259)은 구조화된 데이터를 위한 트리 형태의 텍스트 형식입니다. CSV를 JSON으로 변환하면 스프레드시트에 친화적인 표가 API에 친화적인 객체 배열로 변환됩니다 — 한 행이 하나의 객체, 헤더 행이 키를 제공하며, 셀을 다시 입력할 필요가 없습니다.
CSV → JSON 변환은 어떻게 작동하나요?
모든 변환은 브라우저에서 로컬로 실행됩니다. 큰 흐름은 다음과 같습니다:
- CSV를 입력 패널에 붙여넣고 변환을 누르면, 도구가 텍스트를 파싱하고 JSON 객체 배열을 출력 패널에 표시합니다.
- 문자 단위 상태 머신(FIELD_START → IN_UNQUOTED_FIELD 또는 IN_QUOTED_FIELD)이 입력을 따라가면서
""인용 부호 이스케이프를 지키고,\r\n과\n을 모두 행 종결자로 인식하며, 중간 표현으로 2차원 문자열 배열을 만듭니다. - 첫 행이 헤더로 지정된 경우 해당 셀이 객체 키가 됩니다. 그렇지 않으면 도구가 합성 키
field0,field1, …을 생성하여 모든 행이 완전한 객체에 매핑되도록 합니다. - 구분자(쉼표, 세미콜론, 탭, 파이프 또는 자동 감지)와 타입 추론(숫자 / 불리언 /
null)은 모두 설정할 수 있습니다. 추론이 켜지면30은 숫자 30이 되고true는 불리언이 됩니다. 꺼지면 각 셀은 문자열로 유지됩니다. - 결과는
JSON.stringify형식의 텍스트로 읽기 전용 텍스트 영역에 기록되고, 다운로드 링크는 MIME 타입application/json;charset=utf-8의Blob을 만들어 한 번의 클릭으로 결과를 저장할 수 있게 합니다.
이 도구로 CSV를 JSON으로 변환해야 하는 이유는?
- 프라이버시: 모든 파싱과 변환 과정이 브라우저에서 일어납니다. 데이터는 절대 서버에 도달하지 않습니다.
- 정확성: CSV 파서는 진짜 상태 머신입니다. 인용된 쉼표(
"Bob, Jr."), 내부 줄바꿈, 이스케이프된 인용 부호가 들어 있는 필드는 세 칸이 아니라 한 칸으로 파싱됩니다 — 단순한split(',')구현은 모두 여기에서 틀립니다. - 타입 충실도: 선택적 타입 추론이 숫자 및 불리언 셀을 실제 JSON 숫자와 불리언으로 변환하므로, 얻은 배열을 두 번째 정리 없이 바로 사용할 수 있습니다.
- 유연성: 쉼표 이외의 CSV 방언을 위해 어떤 구분자든 선택할 수 있고, 첫 행을 헤더로 할지 선택할 수 있으며, 모든 셀이 문자열이어야 할 때는 타입 추론을 끌 수 있습니다.
CSV → JSON 변환의 일반적인 활용 사례는 무엇인가요?
CSV를 JSON으로 파싱하는 작업은 데이터 작업과 도구 작업 곳곳에서 등장합니다:
- API 모킹: 스프레드시트에서 내보낸 CSV 픽스처를 붙여넣어 JSON 배열로 변환한 뒤, 로컬 서버가 모킹된 엔드포인트로 응답하게 합니다.
- 데이터 가져오기: 스프레드시트 내보내기(연락처, 재고, 설문 결과)를 CSV 파서 의존성 없이 애플리케이션이나 스크립트가 순회할 수 있는 JSON 배열로 변환합니다.
- 설정 편집: 비기술 검토자가 스프레드시트에서 설정이나 기능 플래그를 셀 단위로 편집한 뒤, 저장된 CSV를 앱이 실제로 로드하는 JSON으로 변환합니다.
CSV → JSON 변환 예시는 어떻게 생겼나요?
첫 줄에 name,age, 두 번째 줄에 Alice,30, 세 번째 줄에 "Bob, Jr.",25를 붙여넣고 쉼표 구분자, 첫 행을 키로, 타입 추론 켜기로 변환을 누르면 [{"name":"Alice","age":30},{"name":"Bob, Jr.","age":25}]가 나옵니다 — "Bob, Jr."의 인용된 쉼표는 하나의 필드 안에 머물고, 나이는 실제 JSON 숫자가 됩니다.
이 CSV → JSON 변환기는 전적으로 브라우저에서 실행되나요?
네. 모든 파싱과 변환 과정이 브라우저 탭 안의 JavaScript로 로컬에서 실행됩니다. 이 도구는 fetch, XMLHttpRequest, navigator.sendBeacon을 전혀 호출하지 않습니다 — 여러분의 CSV 페이로드는 저희 서버, 제3자 변환 서비스, 어떤 분석 파이프라인에도 전달되지 않습니다. 페이지를 한 번 로드한 뒤에는 오프라인에서도 동작합니다. 런타임 API 의존성이 없는 정적 HTML/CSS/JS 번들이기 때문입니다.
이 변환기가 처리할 수 있는 최대 입력 크기는 얼마인가요?
변환기는 전체 입력을 메모리에 버퍼링하고 메인 스레드에서 동기적으로 실행하므로 실제 한계는 기기 성능에 좌우됩니다. 최신 노트북에서는 약 10 MB의 CSV(약 10만 건의 일반적인 레코드)를 눈에 띄는 지연 없이 변환합니다. 그 이상에서는 UI가 멈출 수 있습니다. Web Worker와 청크 파서를 활용한 스트리밍 변환은 다음 단계로 예정되어 있습니다 — 지금은 매우 큰 데이터셋은 붙여넣기 전에 잘라서 사용하세요.
CSV → JSON 파서는 인용된 쉼표와 내부 줄바꿈을 어떻게 처리하나요?
파서는 세 가지 상태(FIELD_START, IN_UNQUOTED_FIELD, IN_QUOTED_FIELD)를 가진 문자 단위 상태 머신이며, 단순한 split(',')이 아닙니다. 큰따옴표로 감싼 필드 안에는 구분자, CR, LF, 또는 ""로 이스케이프된 리터럴 큰따옴표가 들어 있어도 필드 경계가 깨지지 않습니다. 그래서 "Bob, Jr.",25는 세 필드가 아니라 두 필드로 파싱되며, 행을 가로질러 인용된 여러 줄짜리 설명도 단일 셀로 파싱됩니다.
숫자, 불리언, 빈 셀은 JSON 출력에서 어떻게 타입이 지정되나요?
타입 지정은 타입 추론 토글이 제어합니다. 추론이 켜짐(기본값)일 때 숫자처럼 보이는 셀은 JSON 숫자가 되고, true/false는 불리언이 되며, 리터럴 null은 JSON null이 됩니다. 나머지는 문자열로 유지됩니다. 추론이 꺼짐일 때는 내용에 관계없이 모든 값이 문자열로 유지됩니다 — 선행 0, 전화번호, ID 코드가 그대로 보존되어야 할 때 유용합니다. 짧은 행에서 누락된 끝 셀은 빈 문자열로 출력되어 모든 객체가 전체 키 세트를 갖추게 됩니다.
CSV 측은 어떤 구분자를 지원하나요?
네 가지 구분자를 명시적으로 지원합니다: 쉼표(,, RFC 4180 기본값), 세미콜론(;, 유럽 로케일에서 흔함), 탭(\t, TSV 방언), 파이프(|). 자동 감지도 선택할 수 있으며, 이는 입력의 처음 4 KB 중 인용 영역 밖에서 각 후보가 나타나는 횟수를 세어 첫 다섯 줄에서 열 수가 일관되게 유지되는 후보 중 가장 잦은 것을 고릅니다.
이 CSV → JSON 변환기는 진짜 상태 머신으로 파싱하고 깨끗한 즉시 사용 가능한 JSON을 만들어 API 호출, 스크립트, 코드 리뷰에 바로 붙여넣을 수 있게 합니다 — 단 한 바이트도 업로드하지 않고.