csv와 xls의 차이를 잘 몰랐고, 이를 정리하기 위해 글을 작성하게 되었습니다.
아직 작성 중입니다.
1. csv와 xls의 차이
CSV와 XLS(XLSX)의 차이는 파일이 무엇을 저장 대상으로 설계되었는지에 따라 나뉩니다.
1-1. CSV
CSV는 데이터 교환을 위한 포맷 입니다. 하나의 CSV 파일은 행과 열로 구성된 표 형태의 데이터를 문자열로 직렬화한 결과물로, 각 행은 줄바꿈 문자로 구분되고, 각 열은 쉼표 또는 세미콜론, 탭 등 구분자로 구분됩니다.
Comma-separated values(CSV) is a plain text data format for storing tabular data where the fields (values) of a record are separated by a comma and each record is a line.
CSV 파일에는 이 값이 숫자인지, 이 셀이 날짜인지, 어떤 서식을 적용해야 하는지 같은 타입 정보가 없습니다. 모든 값은 파일 수준에서는 단순한 문자열 바이트 시퀀스 일 뿐이며, 파일을 읽는 프로그램의 책임입니다.
Casually, CSV refers to data that is plain text and consists of one record per line where each line has the same sequence of fields separated by a comma. The format is more formally described in the 2005 technical standard RFC 4180 which codifies the CSV format and defines the MIME type text/csv for the handling of text-based fields.
타입은 CSV 파일을 읽는 순간 에 생깁니다. CSV에는 타입 정보가 없기 때문에, 이를 읽는 파서는 문자열을 어떤 타입으로 다룰지 결정 해야 합니다. 이 과정에서 문자열은 파서의 정책에 따라 자동으로 추론되거나, 명시적으로 변환됩니다. 중요한 점은 타입은 CSV에 있는 것이 아니라, CSV를 읽는 사용자/파서가 부여한 결과 라는 점입니다. 예를 들어, Pandas는 기본적으로 자동 타입 추론 을 수행합니다. CSV를 읽을 때 각 컬럼의 값 패턴을 분석해 정수, 실수, 날짜 타입으로 변환합니다. 아래와 같은 CSV 파일이 있을 때 1000은 int64, “2025-01-01”은 datetime64 로 해석합니다.
1
2
amount,created_at
1000,2025-01-01
CSV 파일 자체는 변하지 않지만, Pandas가 데이터를 읽는 과정에서 타입을 부여했기 때문에 달라지는 것입니다.
1
2
df = pd.read_csv("data.csv")
print(df.dtypes)
1
2
amount int64
created_at datetime64[ns]
반면 자바는 개발자가 타입을 직접 명시하는데, 예를 들어, 스프링 배치의 FlatFileItemReader는 CSV를 읽는 단계에서 어떤 계산이나 타입 해석도 수행하지 않습니다. 숫자나 날짜처럼 보이더라도 모든 값은 문자열 그대로 전달 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Configuration
public class CsvReaderConfig {
......
@Bean
public FlatFileItemReader<FieldSet> csvItemReader() {
return new FlatFileItemReaderBuilder<FieldSet>()
.name("csvItemReader")
.resource(new ClassPathResource("data.csv"))
.linesToSkip(1)
.lineMapper(lineMapper())
.build();
}
private LineMapper<FieldSet> lineMapper() {
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("amount", "created_at");
DefaultLineMapper<FieldSet> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(tokenizer);
lineMapper.setFieldSetMapper(fieldSet -> fieldSet); // 그대로 반환
return lineMapper;
}
}
이 상태에서는 값은 단순한 문자열일 뿐이며, 합계 연산이나 날짜 비교 같은 작업은 할 수 없습니다. 이 작업은 FieldSetMapper에서 각 필드를 정의된 타입으로 변환 후 할 수 있는데, 즉, 개발자가 지정한 타입 규칙을 파서가 그대로 적용한 후 입니다. 타입 변환은 파서에 의해 수행되지만, 타입 정책은 개발자가 명시적으로 정의한 것이죠.
1
2
int amount = fieldSet.readInt("amount");
LocalDate createdAt = fieldSet.readLocalDate("created_at");
마찬가지로 CSV에는 셀 병합, 글꼴, 색상, 정렬, 수식, 차트, 여러 시트 같은 개념 자체가 존재하지 않습니다. 숫자 100과 문자열 “100”은 파일 내부에서는 동일한 문자 시퀀스로 저장되며, 날짜 역시 2025-01-01이라는 문자열일 뿐입니다. CSV는 값의 의미나 표현 방식에 대해 아무런 정보를 갖지 않기 때문입니다.
1
2
3
# CSV 내부에서는 둘 다 같은 문자열로 취급
100
"100"
인코딩 또한 CSV 포맷이 강제하지 않습니다. CSV는 단순한 텍스트 파일이기 때문에, 파일이 어떤 문자 인코딩으로 저장되었는지는 파일 외부의 환경이나 생성 프로그램에 전적으로 의존합니다. 가장 흔한 인코딩은 UTF-8이지만, 과거 윈도우 환경에서는 EUC-KR이나 CP949(ANSI)로 저장되는 경우도 많습니다. 그래서 한글이 포함된 CSV 파일을 열 때 인코딩 문제로 깨지는 경우가 자주 발생합니다. 예를 들어 EUC-KR로 저장된 CSV를 UTF-8로 읽으면, 데이터 자체는 올바르더라도 문자열이 정상적으로 해석되지 않습니다. CSV에는 인코딩 메타데이터가 없기 때문에, 읽는 쪽에서 인코딩을 정확히 알고 지정해 주어야 합니다.
1
��맹��
1-2. XLS/XLSX
반면 XLS/XLSX는 사용자 인터랙션과 분석을 전제로 설계된 문서 포맷 입니다. XLS는 바이너리 기반, XLSX는 XML 기반이지만 공통적으로 하나의 파일 안에 데이터 + 메타데이터 + 표현 규칙 을 함께 저장합니다. 각 셀에는 값뿐만 아니라 데이터 타입, 서식 정보, 수식 정의, 참조 관계가 함께 기록됩니다.
Up until the 2007 version, Microsoft Excel used a proprietary binary file format called Excel Binary File Format (.XLS) as its primary format. Excel 2007 uses Office Open XML as its primary file format, an XML-based format that followed after a previous XML-based format called “XML Spreadsheet” (“XMLSS”), first introduced in Excel 2002
예를 들어 어떤 셀에 =A1+B1 이라는 수식이 있다면, 그 계산식과 참조 대상이 명시적으로 파일 내부 구조에 포함됩니다. 또한 셀 병합, 조건부 서식, 필터, 정렬 규칙, 차트 정의, 피벗 테이블 정보까지 모두 파일에 포함됩니다. XLSX는 단일 파일처럼 보이지만 내부적으로는 여러 XML 파일과 리소스를 ZIP으로 묶은 구조입니다. 시트별 데이터, 스타일 정의, 공유 문자열 테이블, 계산 체인 등이 분리되어 관리됩니다.
엑셀은 파일을 열었을 때 단순히 값을 보여주는 것이 아니라, 어떻게 보여주고, 어떻게 계산해야 하는지 까지 재현할 수 있습니다. 대신 구조가 복잡하고, 파일 크기가 커지며, 엑셀이나 이를 해석할 수 있는 라이브러리가 없으면 직접 다루기 어렵습니다.
CSV는 기계 친화적이고, XLSX는 사람 친화적입니다. CSV는 대량 데이터를 빠르게 생성하고 스트리밍하거나, DB에 적재하거나, 다른 시스템으로 전달하기에 적합합니다. 반대로 XLSX는 사람이 직접 열어서 보고, 필터링하고, 계산하고, 시각화하는 작업에 적합합니다. 그래서 백엔드 시스템에서는 CSV를 선호하고, 관리자나 비즈니스 사용자를 위한 다운로드 파일은 XLSX로 제공하는 경우가 많습니다.
결론적으로 CSV는 “값의 나열”만을 책임지는 형식이고, XLS/XLSX는 “값 + 의미 + 표현”을 함께 담는 형식입니다. 이 차이를 이해하지 못하면, 왜 어떤 시스템은 CSV만 허용하고, 왜 어떤 보고서는 굳이 XLSX로 만들어야 하는지 이해하기 어렵습니다. 둘은 상호 대체 관계가 아니라, 목적이 완전히 다른 파일 형식입니다.
2. 차이점
CSV와 XLSX의 두 번째 본질적인 차이는 파일을 처리하는 방식, 즉 스트리밍 가능 여부와 메모리 사용 모델에 있습니다.
2-1. 저장 대상
CSV와 XLSX의 가장 근본적인 차이는 파일이 무엇을 저장 대상으로 삼는가에 있습니다. CSV는 값 그 자체만을 저장하는 포맷이고, XLSX는 값과 함께 계산 정의와 실행 상태를 저장하는 포맷입니다.
CSV는 단순한 텍스트 파일로, 각 행과 열에는 해석이 완료된 값만 존재합니다. 셀 간의 관계, 계산 규칙, 계산 순서와 같은 개념은 포함하지 않습니다. 파일에는 오직 문자열 집합만 기록되며, 이 값들은 이미 확정된 결과입니다. CSV를 읽는 프로그램은 계산을 수행하지 않고, 기록된 값을 그대로 해석합니다.
반면 XLSX는 계산 가능한 문서를 저장하는 포맷입니다. 각 셀에는 값뿐 아니라 수식이 저장될 수 있으며, 계산 순서와 의존 관계에 대한 정보도 함께 포함됩니다. 또한 마지막으로 계산된 결과 값이 캐시 형태로 저장되어 있어, 파일에는 “계산식”과 “계산 결과”가 동시에 존재합니다.
이로 인해 CSV는 완결된 데이터의 저장소에 가깝고, XLSX는 엑셀 계산 엔진의 실행 상태를 직렬화한 파일에 가깝습니다. CSV는 데이터를 설명하지 않고 기록하지만, XLSX는 데이터가 어떻게 계산되었는지에 대한 맥락까지 함께 저장합니다.
이 차이는 이후에 설명되는 스트리밍 처리 가능성, 재현성, 버전 관리, 보안 특성의 차이로 그대로 이어집니다.
2-2. 데이터 정합성과 계산 재현성
세 번째 차이는 데이터 정합성과 결과 재현성입니다. 이 차이는 단순한 포맷 차이를 넘어, 시스템 신뢰성과 직접적으로 연결됩니다.
CSV는 값만 저장합니다. 파일에 기록된 값은 그 자체로 완결된 데이터이며, 해석 과정에서 추가적인 계산이나 변환이 개입하지 않습니다. 동일한 CSV 파일은 어떤 프로그램, 어떤 운영체제, 어떤 라이브러리에서 읽더라도 동일한 값 집합으로 해석됩니다. 이로 인해 CSV는 입력 데이터와 출력 결과의 관계가 명확하며, 결과의 재현성이 보장됩니다.
반면 XLSX는 계산을 포함한 포맷입니다. 셀에 저장된 값은 수식의 결과일 수 있으며, 이 결과는 계산 엔진, 계산 옵션, 엑셀 버전, 로케일 설정에 따라 달라질 수 있습니다. 같은 수식이라도 반올림 규칙, 날짜 처리 방식, 함수 구현 차이에 따라 결과가 달라질 수 있습니다.
또한 XLSX에는 마지막 계산 결과가 캐시로 저장되기 때문에, 파일을 열었을 때 실제 수식을 다시 계산한 결과와 저장된 값이 서로 다를 수 있습니다. 사용자는 이를 인지하지 못한 채 캐시된 값을 신뢰하게 될 가능성이 있습니다. 이 경우 데이터의 출처와 계산 경로를 명확히 설명하기 어렵습니다.
이러한 특성 때문에 XLSX는 “고정된 데이터”라기보다 “계산 가능한 문서”에 가깝습니다. 반면 CSV는 계산 개념이 제거된 순수 데이터 포맷이기 때문에, 회계, 정산, 로그 보관처럼 결과의 재현성이 중요한 영역에서 더 신뢰할 수 있습니다.
2-3. 버전 관리와 변경 이력 추적의 차이
네 번째 차이는 버전 관리와 변경 추적 가능성입니다. 이는 협업 환경과 감사 요구 사항에서 매우 중요한 요소입니다.
CSV는 텍스트 파일입니다. Git과 같은 버전 관리 시스템에서 변경 사항을 줄 단위로 비교할 수 있으며, 어떤 행이 추가되었는지, 어떤 값이 변경되었는지를 명확하게 확인할 수 있습니다. 변경 이력은 사람이 직접 읽고 이해할 수 있는 형태로 남습니다.
이로 인해 CSV는 변경 사유와 변경 내용을 명확히 추적해야 하는 환경에 적합합니다. 데이터 수정에 대한 리뷰, 감사, 롤백이 모두 용이합니다. 특정 시점의 데이터 상태를 정확히 복원하는 것도 어렵지 않습니다.
반면 XLSX는 구조적으로 변경 추적이 어렵습니다. 파일은 바이너리이거나 복잡한 XML 묶음 형태이기 때문에, Git diff 결과가 사람이 이해하기 어려운 형태로 나타납니다. 실제로 어떤 셀이 변경되었는지, 계산 결과가 바뀐 것인지, 스타일이나 메타데이터가 수정된 것인지를 구분하기 어렵습니다.
이 때문에 XLSX는 변경 이력을 체계적으로 관리해야 하는 데이터 저장소로는 적합하지 않습니다. 감사 로그, 이력 관리, 데이터 변경 검증이 필요한 시스템에서는 XLSX 사용이 구조적인 한계를 가집니다.
2-4. 보안과 운영 안정성
다섯 번째 차이는 보안과 운영 안정성입니다. 이 차이는 포맷 자체가 가지는 실행 가능성에서 비롯됩니다.
CSV는 실행 개념이 없는 포맷입니다. 파일에는 값만 존재하며, 이를 해석하는 과정에서 코드가 실행될 여지가 없습니다. 매크로, 스크립트, 자동 실행 로직을 포함할 수 없기 때문에, 파일을 열거나 파싱하는 행위 자체가 보안 위협으로 이어지지 않습니다.
반면 XLS 및 XLSX는 VBA 매크로를 포함할 수 있으며, 사용자의 환경에 따라 코드가 실행될 수 있습니다. 이는 악성 코드 유포의 주요 경로 중 하나로 활용되어 왔습니다. 실제로 많은 보안 사고에서 엑셀 파일은 공격 벡터로 사용되었습니다.
이러한 이유로 서버 시스템, 금융 시스템, 공공 기관에서는 XLS 계열 파일의 업로드나 처리를 제한하는 경우가 많습니다. 자동 처리 파이프라인에서 XLSX를 허용할 경우, 보안 검증과 샌드박싱 같은 추가적인 보호 장치가 필요합니다. 반면 CSV는 이러한 부담 없이 비교적 안전하게 처리할 수 있습니다.