게시판 개편 작업을 하면서 S3에 게시글의 첨부 파일 저장을 하기위해 경로를 어떻게 해야할 지 고민이 되어 파일 시스템에 대해 알아보았다.
운영 체제가 디스크에 데이터를 저장하고 관리하는 방식
파일과 디렉토리를 체계적으로 구성
파일 시스템은 ext4, NTFS, APFS 등 다양한 종류가 있으며, 각 시스템은 inode와 블록을 활용해 효율적으로 데이터를 관리한다.
디렉토리에 파일이 많아지면 성능 저하가 발생하는데, 이는 inode와 디렉토리 구조와 관련이 있다
디렉토리 구조
디렉토리는 파일 이름과 해당 inode 번호를 매핑한 테이블을 유지하는데, 파일이 많아질수록 이 테이블이 커져 탐색 시간이 증가한다.
inode 조회
파일 접근 시 디렉토리 엔트리를 순회하며 inode를 찾음. 파일이 수 천개 이상이면 선형 탐색이나 캐시 미스로 인해 지연이 발생한다.
파일 시스템 종류
ext4 같은 파일 시스템은 대량의 파일이 단일 디렉토리에 있을 때 디렉토리 인덱싱이 비효율적일 수 있다. Btrfs나 XFS는 트리 기반 인덱싱으로 이 문제를 완화하지만, 여전히 한계가 있다.
디스크 I/O
파일 목록을 읽거나 쓰는 작업이 많아지면 디스크 I/O 부하가 증가한다.
결과적으로, 디렉토리 내 파일이 많으면 파일 열기, 삭제, 생성 같은 작업이 느려진다.
디렉토리에 파일이 과도하게 쌓이는 문제를 해결하기 위해 개발자들은 디렉토리를 계층적으로 나누는 방식을 사용한다.
연월일 구조
/data/YYYY/MM/DD/
(예: /logs/2025/05/09/)는 로그 파일, 백업, 사용자 업로드 파일 등에 자주 사용됨.
해시 기반 분할
파일 이름을 해시하여 디렉토리를 나눔 (예: /images/a/ab/abc123.jpg). S3 같은 객체 스토리지에서도 유사한 방식 사용.
카테고리 기반
주제나 유형별로 나눔 (예: /uploads/images/, /uploads/videos/).
숫자 기반
파일 ID를 기준으로 나눔 (예: /files/001/, /files/002/).
연월일 구조는 특히 시간 기반 데이터(로그, 이벤트 데이터)에 적합하며, 관습적으로 가장 널리 사용됨. 예를 들어, Apache나 Nginx 로그는 기본적으로 날짜별 디렉토리에 저장됨.
성능 최적화: 디렉토리당 파일 수를 줄여 탐색 속도를 높임.
예를 들어, /logs/2025/05/09/처럼 나누면 각 디렉토리에 파일이 분산된다.
관리 용이성: 날짜별로 데이터를 분류하면 로그나 백업 파일을 찾거나 아카이빙하기 쉬움.
확장성: 시간이 지남에 따라 파일이 계속 추가되더라도 디렉토리 크기가 제한적임.