처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.07.01 27

내 PostgreSQL 데이터는 디스크 어디에, 어떤 모양으로 저장될까?

Hacker News 원문 보기
내 PostgreSQL 데이터는 디스크 어디에, 어떤 모양으로 저장될까?

ORM이나 SQL로 데이터를 넣고 빼는 건 익숙해도, "그래서 내가 저장한 이 데이터가 디스크 어디에 어떤 모양으로 들어가는 거지?"라는 질문엔 막상 답하기 어려운 분들 많을 거예요. PostgreSQL의 내부 저장 구조를 한 겹씩 들춰보면, 데이터베이스가 결국 '잘 정리된 파일 더미'라는 걸 알 수 있거든요. 한번 디스크 속으로 따라 내려가 볼게요.

모든 것은 PGDATA에서 시작해요

PostgreSQL을 설치하면 데이터를 보관하는 폴더가 하나 정해지는데, 이걸 데이터 디렉터리, 흔히 환경변수 이름을 따서 'PGDATA'라고 불러요. 이 폴더 하나가 하나의 '클러스터(cluster)'예요. 여기서 클러스터라는 말이 좀 헷갈리는데, 여러 서버를 묶은 그 클러스터가 아니라 "하나의 PostgreSQL 인스턴스가 관리하는 데이터베이스들의 묶음"을 뜻해요. 그 안을 열어보면 base, global, pg_wal 같은 하위 폴더들이 보이는데, 우리가 만든 테이블 데이터가 실제로 사는 곳은 base 폴더예요.

데이터베이스는 폴더, 테이블은 파일

base 폴더를 열면 16384, 16385처럼 숫자로 된 폴더들이 들어 있어요. 이 숫자 하나하나가 데이터베이스 하나예요. 이름이 아니라 숫자인 이유는, PostgreSQL이 내부적으로 모든 객체에 OID(Object Identifier)라는 고유 번호를 붙여서 관리하기 때문이에요. 사람은 'mydb'라는 이름으로 부르지만, 디스크는 그 데이터베이스의 OID 번호로 폴더를 만드는 거죠.

그 숫자 폴더 안으로 또 들어가면, 역시 숫자로 된 파일들이 잔뜩 있어요. 이 파일 하나하나가 테이블(또는 인덱스)이에요. 여기서 재밌는 건, 파일 이름에 쓰이는 번호가 OID가 아니라 'relfilenode'라는 또 다른 번호라는 점이에요. 보통은 OID와 같지만, 테이블을 VACUUM FULL 하거나 TRUNCATE 하면 relfilenode가 바뀔 수 있어요. 그래서 "논리적 정체성(OID)"과 "디스크상의 실제 파일(relfilenode)"을 따로 두는 거예요.

1GB마다 파일이 쪼개져요

테이블에 데이터를 계속 넣어서 파일이 1GB를 넘으면 어떻게 될까요? PostgreSQL은 파일 하나를 무한정 키우지 않고, 1GB마다 새 파일로 쪼개요. 12345라는 테이블 파일이 커지면 12345.1, 12345.2 같은 세그먼트 파일이 생기는 식이에요. 오래된 파일 시스템의 용량 한계를 피하고 관리도 쉽게 하려는 설계죠. 그리고 각 파일 안은 기본 8KB 크기의 '페이지(page)' 또는 '블록(block)' 단위로 잘게 나뉘어 있어서, PostgreSQL은 데이터를 읽고 쓸 때 이 8KB 덩어리째로 주고받아요.

이름과 번호를 이어주는 카탈로그

그럼 "mydb 데이터베이스의 users 테이블"이 디스크의 어느 파일인지는 어떻게 알까요? 그 연결 정보가 '시스템 카탈로그(system catalog)'라는 특별한 테이블들에 들어 있어요. 데이터베이스 목록은 pg_database에, 테이블 목록과 relfilenode는 pg_class에 적혀 있죠. 직접 찾고 싶으면 SELECT pg_relation_filepath('users'); 한 줄이면 그 테이블의 파일 경로가 바로 나와요. oid2name 같은 도구로 숫자 폴더가 어떤 DB인지 역추적할 수도 있고요.

한국 개발자에게

이런 내부 구조를 알면 실무에서 의외로 도움이 돼요. 디스크 용량이 갑자기 찼을 때 어느 테이블이 범인인지 파일 크기로 추적할 수 있고, VACUUM이나 TRUNCATE가 왜 그렇게 동작하는지 감이 잡히거든요. 백업이나 복제, 장애 복구를 다룰 때도 "데이터가 결국 base 폴더의 파일들"이라는 그림이 머릿속에 있으면 훨씬 든든해요. 당장 외울 필요는 없어도, 한번 직접 PGDATA 폴더를 열어보고 pg_relation_filepath로 내 테이블 파일을 찾아보는 경험은 꼭 해보길 권해요.

여러분은 평소 쓰는 데이터베이스의 내부 저장 구조를 들여다본 적 있나요? MySQL이나 SQLite는 또 어떻게 다른지 비교해보면 재밌을 것 같아요.


🔗 출처: Hacker News

이 뉴스가 유용했나요?

TTJ 코딩클래스 정규반

월급 외 수입,
코딩으로 만들 수 있습니다

17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.

144+실전 강의
17개수익 모델
4.9수강생 평점
정규반 자세히 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.