첫 데이터베이스와 공통 예제
이 덱은 프로젝트별 작업 목록을 예제로 쓴다. 세 프로젝트 중 하나는 작업이 없고, 세 작업 중 둘은 아직 완료되지 않았다. 이 차이를 이용해 JOIN·집계·트랜잭션을 확인한다.
이 장에서 처음 나오는 말2개
psql- PostgreSQL에 연결해 SQL과 메타 명령을 실행하는 터미널 도구.
volumeDocker volume- 컨테이너를 지워도 데이터를 보관할 수 있는 별도 저장 공간.
준비와 실행
섹션 제목: “준비와 실행”Docker가 실행 중인 로컬 PC에서 시작한다. Docker 공식 설치 안내를
따르고 docker version으로 클라이언트와 서버가 모두 보이는지 확인한다.
아래 명령은 어느 작업 폴더에서나 실행할 수 있다. pg-study와 pg-study-data는 이 실습 전용 이름이다.
docker run --name pg-study \ --mount type=volume,source=pg-study-data,target=/var/lib/postgresql \ -e POSTGRES_PASSWORD=local-study-only \ -e POSTGRES_DB=studydb \ -d postgres:18docker exec pg-study pg_isready -U postgres -d studydb초기화 중이면 마지막 명령을 다시 실행해 accepting connections를 확인한다.
포트를 PC 밖으로 공개하지 않고 컨테이너 안에서 접속한다. 비밀번호는 외부에 쓰지 않는 학습용 값이다.
PostgreSQL 18 공식 이미지는 이전 버전과 데이터 디렉터리 구성이 달라 여기서는 /var/lib/postgresql에
볼륨을 연결한다. postgres:18은 18 계열의 이동 태그이며 운영 배포의 고정 digest 예제가 아니다.
(공식 이미지 사용법)
docker exec -it pg-study psql -X -U postgres -d studydb뒤의 sql 블록은 이 psql 프롬프트에서 실행한다. 셸 명령인 docker ...와 구분한다.
-X는 개인 psql 초기화 파일의 영향을 제외한다.
내가 접속한 곳 확인하기
섹션 제목: “내가 접속한 곳 확인하기”SELECT current_database(), current_user;SHOW server_version;SHOW search_path;DB는 studydb, role은 postgres, 서버 버전은 18.x가 나와야 한다.
이 실습의 관리자 role은 설명을 단순하게 하기 위한 것이다. 실제 앱에는 별도 권한을 준다.
| psql 명령 | 확인하는 것 |
|---|---|
\conninfo | 현재 연결 |
\dt public.* | public 스키마의 테이블 |
\d public.tasks | 컬럼·제약·인덱스 |
\q | psql 종료 |
역슬래시 명령은 psql 전용이다. SQL Editor나 앱 드라이버에는 그대로 보낼 수 없다. (psql 공식 참조)
공통 데이터 만들기
섹션 제목: “공통 데이터 만들기”비어 있는 studydb에서 다음 블록을 한 번 실행한다. 테이블의 설계 이유는
데이터 모델링에서 설명한다.
CREATE TABLE public.projects ( id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text NOT NULL UNIQUE);
CREATE TABLE public.tasks ( id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, project_id bigint NOT NULL REFERENCES public.projects(id), title text NOT NULL CHECK (char_length(title) > 0), assignee text, done boolean NOT NULL DEFAULT false, created_at timestamptz NOT NULL DEFAULT now());
INSERT INTO public.projects (name)VALUES ('플랫폼'), ('스터디'), ('빈 프로젝트');
INSERT INTO public.tasks (project_id, title, assignee, done, created_at)VALUES (1, '백업 확인', 'alice', false, '2026-09-01T09:00:00+09:00'), (1, '대시보드 연결', 'bob', true, '2026-09-02T09:00:00+09:00'), (2, 'SQL 복습', NULL, false, '2026-09-03T09:00:00+09:00');
SELECT id, project_id, title, done FROM public.tasks ORDER BY id;| id | project_id | title | done |
|---|---|---|---|
| 1 | 1 | 백업 확인 | false |
| 2 | 1 | 대시보드 연결 | true |
| 3 | 2 | SQL 복습 | false |
psql에서는 boolean이 f·t로 표시된다. 예제 순서를 바꿔 읽을 때도 이 초기 상태에서 시작한다.
초기화와 정리
섹션 제목: “초기화와 정리”연습 도중 데이터를 바꿨다면 이 실습 DB 안에서만 다음 SQL로 두 테이블을 지우고 공통 블록을 다시 실행한다. 예상 결과에 쓰는 identity 번호도 새 테이블에서 다시 시작한다.
DROP TABLE public.tasks;DROP TABLE public.projects;실습 전체를 마치면 psql에서 \q로 나온 뒤 셸에서 정리한다. 볼륨 삭제는 실습 데이터를 없앤다.
docker rm -f pg-studydocker volume rm pg-study-data학습을 이어갈 때는 삭제 대신 docker stop pg-study, 재개할 때는 docker start pg-study를 사용한다.