PostgreSQL 기초 강좌 #1 PostgreSQL이란: 널리 쓰이는 데이터베이스가 된 이유, 설치와 psql 첫 사용

4 분 소요

백엔드를 만들다 보면 데이터베이스는 어느새 PostgreSQL로 정해져 있는 경우가 많습니다. 프레임워크 문서의 예제도, 클라우드의 관리형 서비스도, 새 오픈소스 도구의 지원 목록 첫 줄도 PostgreSQL입니다. 이 시리즈는 그 “어느새 쓰고 있는” DB를 바닥부터 제대로 배우는 기초 9편입니다. 자료형과 설계, 조인, 인덱스와 실행 계획, 트랜잭션, JSONB를 거쳐 권한과 백업까지 올라가고, 이어지는 실전 9편에서 성장하는 서비스의 DB 운영(커넥션 풀, 성능 진단, VACUUM, 복제)을 다루겠습니다. SQL을 처음 보는 분보다는 “쿼리는 쓰는데 DB를 배운 적은 없는” 개발자를 독자로 전제합니다.

왜 PostgreSQL이 기본값이 됐나 #

몇 년 사이 “특별한 이유가 없으면 PostgreSQL"이 업계의 기본 감각이 됐습니다. 이유는 축적입니다.

  • 표준 준수와 엄격함: SQL 표준을 성실히 따르고, 데이터 무결성에 엄격합니다. 잘못된 날짜를 조용히 받아 주는 대신 에러를 냅니다. 이 깐깐함이 서비스가 커질수록 자산이 됩니다.
  • 자료형과 기능의 폭: JSONB, 배열, 범위 타입, 전문 검색, 윈도 함수까지 “그건 별도 시스템이 필요하다"던 것들이 상당 부분 내장되어 있습니다.
  • 확장(extension) 생태계: 벡터 검색의 pgvector, 지리 정보의 PostGIS, 시계열의 TimescaleDB처럼, 코어를 바꾸지 않고 기능을 꽂는 구조가 “일단 PostgreSQL로 시작하면 어디든 갈 수 있다"는 신뢰를 만들었습니다. 임베딩 검색에서 다뤘던 pgvector가 대표적인 예입니다.
  • 라이선스와 거버넌스: 관대한 오픈소스 라이선스에 특정 기업 소유가 아닌 커뮤니티 프로젝트라서, 상용 DB나 라이선스가 요동친 다른 오픈소스 DB와 대비되는 안정감이 있습니다.

버전은 매년 가을 메이저가 하나씩 나옵니다. 이 강좌는 현행 안정판(PostgreSQL 18, 비동기 I/O로 읽기 성능이 크게 오른 버전) 기준으로 쓰되, 버전에 따라 달라지는 내용은 그때마다 명시하겠습니다. 참고로 NoSQL과의 선택 기준은 DynamoDB vs RDS에서, 운영을 맡기는 관리형 서비스 이야기는 RDS vs 자체 운영에서 다뤘습니다. 학습 단계에서는 로컬에 직접 띄우는 것이 가장 많이 배웁니다.

설치: 도커 한 줄이면 됩니다 #

로컬 학습 환경으로는 도커가 가장 깔끔합니다. 설치 흔적 없이 지우고 다시 만들 수 있습니다.

컨테이너 실행
docker run --name pg-lab -e POSTGRES_PASSWORD=devpass -p 5432:5432 -d postgres:18

이 한 줄로 PostgreSQL 18 서버가 5432 포트에 뜹니다. 접속 클라이언트는 GUI 도구도 많지만, 이 강좌에서는 psql(공식 CLI)을 기본으로 씁니다. 어떤 서버에나 있고, 어떤 GUI보다 빠르며, 문제 상황에서 최후에 남는 도구이기 때문입니다.

psql 접속
docker exec -it pg-lab psql -U postgres

psql 첫 사용: 메타 명령 다섯 개 #

psql에는 SQL과 별도로 백슬래시로 시작하는 메타 명령이 있습니다. 다섯 개면 시작할 수 있습니다.

명령하는 일
\l데이터베이스 목록
\c mydb데이터베이스 전환
\dt현재 DB의 테이블 목록
\d users테이블 구조(컬럼·인덱스·제약) 보기
\x세로 출력 토글(넓은 결과를 볼 때)

특히 \d는 이 강좌 내내 쓰게 됩니다. 테이블에 어떤 인덱스와 제약이 걸려 있는지가 한 화면에 나오는, 가장 기본적인 관찰 도구입니다.

첫 사이클: 만들고, 넣고, 조회하기 #

만들고 넣고 조회하기
CREATE DATABASE lab;
\c lab

CREATE TABLE users (
    id         bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email      text NOT NULL UNIQUE,
    name       text NOT NULL,
    created_at timestamptz NOT NULL DEFAULT now()
);

INSERT INTO users (email, name) VALUES
    ('kim@example.com', '김개발'),
    ('lee@example.com', '이백엔드');

SELECT id, email, name, created_at FROM users WHERE email = 'kim@example.com';

짧은 예제지만 이 강좌의 습관 세 가지가 이미 들어 있습니다. PK는 bigint IDENTITY(왜 이것이 기본값인지, UUID는 언제 쓰는지는 다음 편에서), 시각은 timestamptz(그냥 timestamp가 아닙니다. 이것도 다음 편의 주제입니다), 그리고 NOT NULL을 기본으로 두고 예외적으로 푸는 방향입니다. 애플리케이션에서의 사용은 ORM을 거치는 경우가 많을 텐데, 그 계층은 SQLAlchemy 강좌 같은 자료에 맡기고 이 시리즈는 그 아래의 DB 자체에 집중합니다.

정리 #

  • PostgreSQL은 표준 준수, 자료형·기능의 폭, 확장 생태계, 안정된 거버넌스의 축적으로 신규 프로젝트의 기본값이 됐습니다.
  • 학습 환경은 도커 한 줄로 충분합니다. 클라이언트는 psql을 기본기로 익혀 두는 것이 오래 남습니다.
  • 메타 명령 다섯 개(\l, \c, \dt, \d, \x)가 관찰의 시작입니다. 특히 \d는 강좌 내내 쓰입니다.
  • 첫 테이블에 이미 세 가지 습관을 심었습니다. bigint IDENTITY PK, timestamptz, NOT NULL 기본. 이유는 다음 편에서 파겠습니다.
  • 다음 편에서는 자료형과 테이블 설계, 그중에서도 “무엇으로 저장할 것인가"의 판단 기준을 다루겠습니다.
X