CSV에서 JSON 변환: 이 페이지의 근본적인 차이점
CSV 파일을 JSON으로 변환하는 것은 겉보기에는 단순하지만, 데이터 타입과 구조에서 근본적인 문제를 일으킵니다. 이 페이지가 다른 변환 도구와 다른 점은 세 가지입니다. 첫째, CSV는 모든 값을 문자열로 저장하지만 JSON은 숫자, 불리언, null을 지원합니다. 그러나 이 변환은 어떤 타입 추론도 수행하지 않습니다. 가격(1234), 수량(5), 우편번호(00123) 모두 JSON 출력에서 문자열("1234", "5", "00123")로 그대로 남습니다. 둘째, CSV는 엄격한 평면 테이블이므로 중첩 JSON(객체 안의 객체)을 만들 수 없습니다. 셋째, 구분자(쉼표, 세미콜론, 탭)를 수동으로 지정해야 합니다. JSON이나 Excel 입력에서는 필요 없는 선택입니다. 또한 CSV의 인용 규칙은 보편적으로 지켜지지 않아, 필드 내 쉼표나 줄바꿈이 포함된 경우 파싱 실패의 주요 원인이 됩니다.
CSV와 JSON의 구조적 차이: 평면 테이블 vs 키-값 배열
CSV는 행과 열로 구성된 평면 데이터 형식입니다. 각 행은 하나의 레코드, 각 열은 속성을 나타냅니다. JSON 변환 시 이 구조는 객체의 배열로 변환됩니다. 예를 들어 CSV 파일:
이름,가격,수량
사과,1000,5
바나나,2000,3
이 JSON으로 변환되면:
[
{
"이름": "사과",
"가격": "1000",
"수량": "5"
},
{
"이름": "바나나",
"가격": "2000",
"수량": "3"
}
]
모든 객체는 동일한 키(첫 번째 행의 헤더)를 가집니다. CSV는 중첩 구조를 표현할 수 없기 때문에, 고객-주문 관계 같은 계층 데이터를 평탄화해야 합니다. 역방향 변환(JSON→CSV)은 중첩된 JSON을 강제로 평탄화해야 하므로 더 복잡하지만, 이 방향은 단순합니다.
입력 처리와 사용자 선택
입력은 단일 CSV 파일입니다(또는 JSON/XLSX 파일도 자동 감지되지만, 이 페이지의 주 시나리오는 CSV→JSON). 도구는 파일 선택 후 자동으로 입력 형식을 감지합니다. 사용자는 출력 형식을 JSON으로 설정하고, CSV 구분자를 선택해야 합니다: 쉼표, 세미콜론, 탭. 구분자를 잘못 선택하면 데이터가 깨집니다. 예를 들어 세미콜론으로 구분된 유럽 형식 CSV를 쉼표로 지정하면 모든 값이 하나의 필드로 합쳐집니다. 도구는 변환된 데이터의 미리보기, 행(row) 수와 열(column) 수, 출력 파일 크기를 표시합니다. 변환은 전적으로 브라우저에서 실행되며, 데이터가 서버로 업로드되지 않습니다.
주요 오류 조건과 메시지
도구는 정해진 조건에서 명확한 오류 메시지를 표시합니다:
- 파싱 불가: "이 CSV를 파싱할 수 없습니다." (인용 오류, 일관되지 않은 열 수)
- 데이터 없음: "이 파일에는 테이블 행이 없습니다."
- 행/열 초과: "이 테이블은 ‹max›개 이상의 행을 가지고 있습니다." / "이 테이블은 ‹max›개 이상의 열을 가지고 있습니다." (정확한 제한 수치는 팩트 시트에 명시되지 않았으나, 도구에 하드코딩된 한계가 있습니다.)
- 파일 크기 초과: "이 파일이 너무 큽니다. ‹max› 미만의 파일을 사용하세요."
- 파일 미선택: "먼저 파일 하나를 선택하세요."
- 잘못된 파일 형식: "CSV, JSON 또는 XLSX 파일을 선택하세요."
- 변환 시간 초과: "이 변환이 너무 오래 걸립니다. 더 작은 파일을 시도하세요."
이러한 오류는 CSV 파싱의 일반적인 실패 지점을 직접 반영합니다. 특히 인용된 필드 내 줄바꿈은 보존되어 \n으로 JSON 문자열에 포함됩니다.
실무에서의 주의사항: 타입과 선행 0
CSV는 타입 정보를 저장하지 않습니다. 모든 필드는 텍스트입니다. 도구는 이 사실을 존중하여 절대적으로 모든 값을 문자열로 유지합니다. 이는 두 가지 실제 문제를 해결합니다:
- 숫자와 불리언: 가격 열의 "1,000"은 그대로 ",1000"이 아닌 "1000" 문자열로 나옵니다(쉼표가 천 단위 구분자인 경우 혼동 가능). 그러나 "true"나 "false"는 JSON 불리언으로 변환되지 않고 문자열 "true"/"false"로 유지됩니다.
- 선행 0: 우편번호 "00123"은 중요합니다. CSV에서 "00123"으로 저장된 값은 JSON에서
"00123"로 유지됩니다. 만약 도구가 자동으로 숫자로 변환했다면,123이 되어 선행 0이 손실됩니다. 도구는 이 손실을 방지합니다.
단, JSON을 로드하는 환경(예: JavaScript의 JSON.parse)이 자동 타입 캐스팅을 수행하면 선행 0이 사라질 수 있습니다. 예를 들어 "00123"을 Number()로 변환하면 123이 됩니다. 이는 도구의 책임이 아니라 수신 코드의 책임입니다.
대상 사용자와 활용 사례
이 도구는 다음과 같은 사용자를 위해 설계되었습니다:
- 개발자: 데이터베이스에서 CSV 내보내기를 받아 JavaScript API나 애플리케이션에 JSON으로 전달해야 하는 경우. 타입 변환을 직접 제어해야 합니다.
- 데이터 분석가: 레거시 CSV 주소 파일(선행 0 포함 우편번호)을 JSON으로 변환하면서 무결성을 유지하려는 경우.
- 비기술 동료와 협업: Excel/CSV를 사용하는 동료와 JSON 스택을 사용하는 기술팀 간 데이터 교환. 민감 정보를 서버에 업로드하지 않고 변환.
- 학생이나 연구자: 단발성 CSV를 프로그래밍 과제에 필요한 JSON으로 변환. 예: 제품 카탈로그, 연락처, 로그 데이터.
자주 묻는 질문 (FAQ)
Q: CSV에 쉼표가 포함된 필드는 어떻게 처리하나요? A: CSV 표준은 큰따옴표("")로 필드를 감싸도록 규정합니다. 도구는 이 규칙을 따르는 파일을 올바르게 파싱합니다. 그러나 규칙이 지켜지지 않은 파일(예: 따옴표 없이 쉼표 포함)은 파싱 오류가 발생하며 "이 CSV를 파싱할 수 없습니다." 메시지가 표시됩니다.
Q: JSON 출력에서 모든 값이 문자열로 나오는 이유는 무엇인가요? A: CSV는 타입 정보를 저장하지 않기 때문에, 최대한 안전하게 모든 값을 문자열로 유지합니다. 숫자, 불리언, 날짜로 자동 변환하지 않습니다. 이는 선행 0 보존 등 데이터 무결성을 위해 의도된 설계입니다. 필요한 경우 다운로드 후 수동 변환하거나, 수신 코드에서 타입 캐스팅을 수행해야 합니다.
Q: 중첩된 JSON(객체 안의 객체)을 만들 수 있나요? A: 불가능합니다. CSV는 엄격한 평면 테이블이므로, 변환 결과는 항상 객체의 배열(모든 객체가 동일한 키를 가짐)입니다. 중첩 구조가 필요한 경우 JSON→CSV 변환 후 추가 가공이 필요합니다.
Q: 파일 크기 제한은 어떻게 되나요? A: 페이지에 하드코딩된 제한이 있습니다. 제한을 초과하면 "이 파일이 너무 큽니다. ‹max› 미만의 파일을 사용하세요." 오류가 표시됩니다. 정확한 ‹max› 값은 도구 버전에 따라 다르지만, 일반적으로 수 메가바이트에서 수십 메가바이트 사이입니다.
Q: 인용된 필드 안에 줄바꿈이 있으면 어떻게 되나요?
A: CSV 표준에 따라 큰따옴표로 감싸진 필드 내 줄바꿈은 유효합니다. 도구는 이 줄바꿈을 JSON 문자열 값에 \n 이스케이프 시퀀스로 보존합니다. 줄바꿈이 포함된 JSON을 파싱할 때는 주의가 필요합니다.
Q: 변환이 클라이언트 측에서만 이루어지나요? 데이터는 어디로 전송되나요? A: 변환은 전적으로 브라우저의 JavaScript 엔진 내에서 실행됩니다. 파일이 서버로 업로드되거나 네트워크를 통해 전송되지 않습니다. 따라서 민감한 데이터(개인정보, 기업 데이터)를 안전하게 처리할 수 있습니다.