# Flat File란 무엇인가?

> Clean Markdown view of GeekNews topic #19733. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19733](https://news.hada.io/topic?id=19733)
- GeekNews Markdown: [https://news.hada.io/topic/19733.md](https://news.hada.io/topic/19733.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-03-13T23:25:23+09:00
- Updated: 2025-03-13T23:25:23+09:00
- Original source: [evidence.dev](https://evidence.dev/blog/what-is-a-flat-file)
- Points: 5
- Comments: 0

## Summary

플랫 파일은 데이터베이스에서 데이터를 추출하여 처리할 때 주로 사용되며, CSV와 같은 단순한 텍스트 파일 형태로 각 행이 레코드를 나타내고 필드는 쉼표로 구분됩니다. 플랫 파일은 텍스트 및 숫자만 저장하고, 특별한 소프트웨어 없이 쉽게 출력, 수정, 처리할 수 있는 특징이 있으며, CSV, JSON, YAML 등 다양한 유형이 존재합니다. 플랫 파일은 데이터 교환, ETL에서의 데이터 통합, 아카이브 및 백업 등 다양한 사용 사례에 활용되며, 관계형 데이터베이스와 비교하여 이동성은 높지만 확장성이나 인덱스 지원은 제한적입니다.

## Topic Body

- **플랫 파일**은 데이터 분석에서 매우 일반적인 형식임   
- 이 **완벽 가이드**는 플랫 파일이 무엇인지, 어떤 종류가 있는지, 어떤 걸 선택해야 하는지 부터 유스 케이스, 포맷 특징 및 non-플랫파일 데이터베이스와 관계형 DBMS와의 비교등을 설명함  
### 정의하긴 어려움  
- **Flat File**은 주로 데이터베이스에서 데이터를 추출하여 처리할 때 사용됨  
- CSV와 같은 단순한 텍스트 파일 형태로 각 행이 레코드를 나타내고 필드는 쉼표로 구분됨  
- 그러나 "Flat File"의 정의는 명확하지 않으며 다음과 같은 공통 특성이 있음:  
  - **Text-only**: 이진 데이터(Blob)가 아닌 텍스트 및 숫자만 저장  
  - **표(Tabular) 형식**: 파일당 하나의 테이블, 행 기반 레코드 구성  
  - **포터블**: 특별한 소프트웨어 없이 쉽게 출력, 수정, 처리 가능  
  - **비구조적**: 일반적으로 레코드 간에 계층 구조나 관계 없음  
  - **압축 없음**: 기본적으로 스마트 압축 없음 (단, DuckDB, Spark 등에서 zip 파일 허용)  
  - **인덱스 없음**: 특정 레코드를 찾는 내장 인덱스 없음  
  - **설명 없음**: 일반적으로 메타데이터나 스키마 정보 없음  
- JSON 및 YAML은 계층 구조와 스키마를 포함할 수 있기 때문에 이 정의에서 벗어남  
- 매우 다양한 사용 사례에 사용될 수 있다는 사실도 실제로 도움이 되지 않음   
  - **CSV**: 데이터 저장 및 교환 형식  
  - **JSON**: 대규모 데이터 교환, 구성 관리, API 반환 형식  
  - **YAML**: 구성 관리 및 파이프라인 정의 파일  
  
### Flat File의 유형  
- 데이터가 구성 및 저장되는 방식에 따라 다양한 유형 존재  
- **필드 및 레코드 구성 방식**  
  - **비구조적 Flat File**: CSV와 같이 단일 테이블 구조  
  - **구조적 Flat File**: JSON, YAML, XML 등은 계층 구조 존재  
- **필드 구분 기호 유형**  
  - 행이 하나의 레코드를 나타내며 구분 기호로 필드 구분  
  - 쉼표(`,`), 탭(`\t`), 파이프(`|`) 사용  
- **고정 너비 vs 비고정 너비 형식**  
  - 고정 너비 형식은 필드가 일정한 길이를 가짐 → 처리 속도 빠름  
  - 비고정 너비 형식은 처리 유연성이 높음  
- **데이터 구분자**  
  - CSV는 탭 및 줄바꿈 저장 가능 (이스케이프 처리)  
  - TSV는 탭 및 줄바꿈 불가  
- **사람의 읽기 용이성**  
  - Flat File은 사람이 읽을 수 있는 경우가 많음  
  - 일부 플랫폼에서는 Excel 파일도 Flat File로 분류함  
- **메타데이터 포함 여부**  
  - CSV 같은 파일은 메타데이터 없음  
  - JSON은 자체 메타데이터 및 스키마 포함 가능  
  
### Flat File의 사용 사례  
- **저장 및 교환**  
  - **데이터 교환**: CSV, JSON은 서로 다른 플랫폼 간 데이터 교환에 유용  
  - **ETL에서 데이터 통합**: Flat File은 ETL에서 원본 및 대상 데이터로 자주 사용됨  
  - **아카이브 및 백업**: Flat File은 텍스트 기반으로 장기 보관에 유리  
- **유틸리티 사용**  
  - **구성 관리**: YAML, JSON, INI 등은 환경 변수, 데이터베이스 연결 등에 사용  
  - **데이터 파이프라인 정의**: JSON, YAML 등은 파이프라인 구조 정의에 사용  
  - **데이터셋 메타데이터**: JSON은 CSV의 변환 및 유효성 검사 정의 가능  
  
### Flat File의 예제  
  
#### CSV (Comma-Separated Values)  
- **확장자**: `.csv`  
- **구분 기호**: 쉼표 `,`  
- **구조**: 평면 (Flat)  
- **사람이 읽기 쉬움**  
- **예제**:  
  ```csv  
  name, country, age  
  Alice, USA, 22  
  Bob, Canada, 34  
  Charlie, UK, 28  
  ```  
- **선택 기준**:  
  - 구조화된 테이블 형식 데이터에 적합  
  - BI 시스템, Excel/Google Sheets에서 출력 시 유용  
- **회피 기준**:  
  - 복잡한 계층 구조 필요 시 부적합  
  - 쉼표 포함 데이터 처리 시 문제 발생 가능  
  
#### TSV (Tab-Separated Values)  
- **확장자**: `.tsv`  
- **구분 기호**: 탭 `\t`  
- **구조**: 평면 (Flat)  
- **사람이 읽기 쉬움**  
- **예제**:  
  ```tsv  
  name	country	age  
  Alice	USA	22  
  Bob	Canada	34  
  Charlie	UK	28  
  ```  
- **선택 기준**:  
  - 쉼표 포함 데이터를 처리해야 할 경우 유용  
  - Unix CLI 도구에서 쉽게 처리 가능  
- **회피 기준**:  
  - 탭 포함 데이터 처리 시 문제 발생  
  
#### JSON (JavaScript Object Notation)  
- **확장자**: `.json`  
- **구조**: 계층 구조  
- **사람이 읽기 쉬움**  
- **예제**:  
  ```json  
  [  
    {"name": "Alice", "country": "USA", "age": 22},  
    {"name": "Bob", "country": "Canada", "age": 34},  
    {"name": "Charlie", "country": "UK", "age": 28}  
  ]  
  ```  
- **선택 기준**:  
  - 계층적 데이터 구조 필요 시 적합  
- **회피 기준**:  
  - 속도 우선 처리 시 부적합  
  
#### YAML (YAML Ain’t Markup Language)  
- **확장자**: .yaml  
- **구조**: 계층 구조  
- **사람이 읽기 쉬움**  
- **예제**:  
  ```yaml  
  name: Alice  
  country: USA  
  age: 22  
  ```  
- **선택 기준**:  
  - 사람이 읽기 쉬운 구성 파일 필요 시 적합  
- **회피 기준**:  
  - 대규모 데이터 저장 시 부적합  
  
### ENV Files  
- **확장자**: .env  
- **구조**: 평면 (Flat)  
- **사람이 읽기 쉬움**  
- **예제**:  
  ```ini  
  APP_NAME=MyApp  
  ENVIRONMENT=production  
  ```  
- **선택 기준**:  
  - 배포 및 로컬 환경에서 설정 파일 필요 시 적합  
- **회피 기준**:  
  - 복잡한 데이터 구조 저장 시 부적합  
  
### Flat File vs Non-Flat File vs DBMS 비교  
  
Flat File은 관계형 데이터베이스(RDBMS)와 자주 비교되며, Avro, Parquet, ORC와 같은 중간 형식도 존재함. 다음은 주요 형식의 특성 비교임:  
  
- # 레코드 구성 방식  
  - **CSV**: 행(Row) 기반 데이터 저장  
  - **JSON**: 키-값 쌍 기반 저장  
  - **Parquet**: 컬럼(Column) 기반 저장  
  - **관계형 DBMS**: 행(Row) 기반 저장  
- # 사람이 읽을 수 있는 형식 여부  
  - **CSV**와 **JSON**: 텍스트 기반 → 사람이 읽기 쉬움  
  - **Parquet**와 **DBMS**: 바이너리 기반 → 사람이 읽기 어려움  
- # 이동성(Portability)  
  - **CSV**, **JSON**, **Parquet**: 플랫폼 간 호환성 높음  
  - **DBMS**: 특정 소프트웨어에서만 사용 가능  
- # 계층 구조 지원  
  - **CSV**: 계층 구조 없음  
  - **JSON**: 계층 구조 지원  
  - **Parquet**: 중첩된 구조 지원  
  - **DBMS**: 여러 테이블 및 관계형 구조 지원  
- # 확장성(Scalability)  
  - **CSV**, **JSON**: 확장성 낮음  
  - **Parquet**, **DBMS**: 확장성 높음  
- # 인덱스 지원 여부  
  - **CSV**, **JSON**: 인덱스 없음  
  - **Parquet**: 파일 수준 및 컬럼 수준 메타데이터로 빠른 검색 가능  
  - **DBMS**: 인덱스 지원  
- # 스키마 지원 여부  
  - **CSV**: 스키마 없음  
  - **JSON**: 스키마 포함 가능  
  - **Parquet**, **DBMS**: 스키마 강제 적용  
  
* Parquet은 B-Tree나 해시 인덱스를 사용하지 않음. 대신 파일, 행 그룹 및 컬럼 수준의 메타데이터를 통해 데이터 검색 속도를 높임  
  
### 올바른 Flat File 형식 선택하기  
- **CSV, TSV** → 데이터를 아카이브하거나 플랫폼 간에 이동할 때등 간단한 데이터 교환 및 저장  
- **JSON** → 계층 구조가 있는 자체 설명 파일 형식이 필요할 때 사용  
- **YAML** → 구성 및 파이프라인 설정에 적합  
- **Parquet** → 작은 파일 크기, 빠른 쿼리, 복잡한 데이터 유형 지원이 필요할 때 고려

## Comments



_No public comments on this page._
