Burt.K

Awesome Discovery

[PostgreSQL] 제1부. 튜토리얼 - 1장. 시작하기

작성일 — 2025년 1월 28일

Table of Contents

1.1. 설치하기

PostgreSQL을 사용하기 위해서는 먼저 설치 과정이 필요하다. 운영체제에 이미 포함되어 있거나 시스템 관리자가 설치했을 수 있다. 이런 경우에는 운영체제 문서나 시스템 관리자에게 PostgreSQL 접근 방법을 문의한다.

PostgreSQL이 이미 설치되어 있는지, 또는 실험적으로 사용할 수 있는지 확실하지 않다면 직접 설치해볼 수 있다. 설치 과정은 어렵지 않으며 좋은 학습 기회가 될 것이다. PostgreSQL은 일반 사용자 권한으로도 설치할 수 있어 최고 관리자(root) 권한이 필요하지 않다.

직접 설치를 진행할 경우 17장의 설치 지침을 참고하고, 설치가 완료된 후 이 가이드로 돌아온다. 특히 환경 변수 설정 부분을 주의 깊게 따라야 한다.

시스템 관리자가 기본 설정과 다르게 구성했다면 추가 작업이 필요할 수 있다. 예를 들어, 데이터베이스 서버가 원격지에 있다면 PGHOST 환경 변수에 데이터베이스 서버 컴퓨터의 이름을 지정해야 한다. PGPORT 환경 변수 설정도 필요할 수 있다. 결론적으로, 응용 프로그램을 실행했을 때 데이터베이스 연결 오류가 발생한다면 시스템 관리자에게 문의하거나, 본인이 관리자라면 문서를 참고하여 환경 설정이 올바른지 확인한다. 이전 설명이 이해되지 않는다면 다음 장을 먼저 읽어보기 바란다.

1.2. 아키텍처의 기본 원리

다음 장으로 넘어가기 전에 PostgreSQL 시스템 아키텍처의 기본 개념을 이해하는 것이 중요하다. PostgreSQL의 각 구성 요소가 어떻게 상호작용하는지 이해하면 이번 장의 내용을 더 명확하게 파악할 수 있다.

데이터베이스 용어로 PostgreSQL은 클라이언트/서버 모델을 채택한다. PostgreSQL 세션은 다음과 같은 협력 프로세스(프로그램)로 구성된다:

클라이언트/서버 애플리케이션의 일반적인 특징처럼 클라이언트와 서버는 서로 다른 호스트에 위치할 수 있다. 이 경우 TCP/IP 네트워크 연결을 통해 통신한다. 이는 클라이언트 컴퓨터에서 접근 가능한 파일이 데이터베이스 서버 컴퓨터에서는 접근이 불가능하거나 다른 파일 이름으로만 접근 가능할 수 있다는 점을 고려해야 한다.

PostgreSQL 서버는 여러 클라이언트의 동시 연결을 처리할 수 있다. 이를 위해 각 연결마다 새로운 프로세스를 시작(“포크”)한다. 이후부터는 클라이언트와 새로 생성된 서버 프로세스가 원래의 postgres 프로세스의 개입 없이 직접 통신한다. 따라서 감독자 역할의 서버 프로세스는 항상 실행 상태를 유지하며 클라이언트 연결을 기다리는 반면, 클라이언트와 관련 서버 프로세스는 필요에 따라 생성되고 소멸된다. (물론 이 모든 과정은 사용자에게 보이지 않으며, 여기서는 설명의 완성도를 위해 언급한다.)

1.3. 데이터베이스 생성하기

데이터베이스 서버에 접근할 수 있는지 확인하는 첫 번째 방법은 데이터베이스를 직접 생성해보는 것이다. 실행 중인 PostgreSQL 서버는 여러 개의 데이터베이스를 관리할 수 있다. 일반적으로 각 프로젝트나 사용자마다 별도의 데이터베이스를 사용한다.

이미 사이트 관리자가 데이터베이스를 만들어 놓았을 수도 있다. 그런 경우에는 이 단계를 건너뛰고 다음 섹션으로 넘어가면 된다.

새로운 데이터베이스를 만들려면 다음 명령을 실행한다. 예제에서는 mydb라는 이름을 사용한다:

$ createdb mydb

아무런 응답이 없다면 성공적으로 생성된 것이므로 이 섹션의 나머지 부분은 건너뛰어도 좋다.

만약 다음과 같은 메시지가 나타난다면:

createdb: command not found

PostgreSQL이 제대로 설치되지 않은 것이다. 아예 설치되지 않았거나 셸의 검색 경로에 PostgreSQL이 포함되지 않은 것이다. 대신 절대 경로로 명령을 실행해보자:

$ /usr/local/pgsql/bin/createdb mydb

실제 경로는 사이트마다 다를 수 있다. 상황을 해결하려면 사이트 관리자에게 문의하거나 설치 설명서를 확인한다.

또 다른 응답으로 다음과 같은 메시지가 나올 수 있다:

createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

이는 서버가 시작되지 않았거나 createdb가 연결을 시도하는 위치에서 응답하지 않는다는 의미다. 설치 설명서를 확인하거나 관리자에게 문의한다.

다음과 같은 응답이 나올 수도 있다:

createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  role "joe" does not exist

여기서 “joe”는 로그인한 사용자 이름이다. 이는 관리자가 해당 사용자의 PostgreSQL 계정을 만들지 않았다는 의미다. (PostgreSQL 사용자 계정은 운영체제 사용자 계정과 별개다.) 관리자라면 21장을 참고해 계정을 만든다. 첫 번째 사용자 계정을 만들려면 PostgreSQL이 설치된 운영체제 사용자(보통 postgres)로 전환해야 한다. 또는 운영체제 사용자 이름과 다른 PostgreSQL 사용자 이름이 할당되었을 수 있다. 이 경우 -U 스위치를 사용하거나 PGUSER 환경 변수를 설정해 PostgreSQL 사용자 이름을 지정해야 한다.

사용자 계정은 있지만 데이터베이스를 만들 권한이 없는 경우 다음과 같은 메시지가 나타난다:

createdb: error: database creation failed: ERROR:  permission denied to create database

모든 사용자가 새 데이터베이스를 만들 수 있는 것은 아니다. PostgreSQL이 데이터베이스 생성을 거부한다면 사이트 관리자에게 권한을 요청해야 한다. 이런 상황이 발생하면 사이트 관리자와 상담한다. PostgreSQL을 직접 설치했다면 서버를 시작할 때 사용한 계정으로 로그인해야 한다.

다른 이름으로도 데이터베이스를 만들 수 있다. PostgreSQL은 한 사이트에서 여러 개의 데이터베이스를 만들 수 있다. 데이터베이스 이름은 반드시 알파벳으로 시작해야 하며 길이는 63바이트로 제한된다. 현재 사용자 이름과 같은 이름으로 데이터베이스를 만드는 것이 편리하다. 많은 도구가 이를 기본값으로 가정하므로 타이핑을 줄일 수 있다. 그런 데이터베이스를 만들려면 다음 명령어를 입력한다:

$ createdb

더 이상 데이터베이스를 사용하지 않는다면 삭제할 수 있다. 예를 들어 mydb 데이터베이스의 소유자(생성자)라면 다음 명령으로 삭제할 수 있다:

$ dropdb mydb

(이 명령은 사용자 계정 이름을 기본값으로 사용하지 않는다. 반드시 지정해야 한다.) 이 작업은 데이터베이스와 관련된 모든 파일을 물리적으로 제거하며 되돌릴 수 없으므로 신중하게 결정해야 한다.

createdbdropdb에 대한 자세한 내용은 각각 createdbdropdb 문서에서 확인할 수 있다.

1.4. 데이터베이스 접근하기

데이터베이스를 생성한 후에는 다음과 같은 방법으로 접근할 수 있다:

이 튜토리얼의 예제를 따라하려면 psql을 실행하는 것이 좋다. mydb 데이터베이스에 접속하려면 다음 명령어를 입력한다:

$ psql mydb

데이터베이스 이름을 지정하지 않으면 사용자 계정 이름을 기본값으로 사용한다. 이는 이전 섹션에서 createdb 명령어를 사용할 때 이미 확인했다.

psql을 실행하면 다음과 같은 메시지가 표시된다:

psql (17.2)
Type "help" for help.
mydb=>

마지막 줄은 다음과 같이 표시될 수도 있다:

mydb=#

이는 데이터베이스 슈퍼유저 권한을 가지고 있다는 의미다. PostgreSQL을 직접 설치했다면 대부분 이 경우에 해당한다. 슈퍼유저는 접근 제어의 제약을 받지 않지만, 이 튜토리얼에서는 중요하지 않다.

psql 실행에 문제가 있다면 이전 섹션을 다시 확인해보자. createdbpsql의 진단 방식은 비슷하므로, createdb가 정상 작동했다면 psql도 정상 작동할 것이다.

psql이 출력하는 마지막 줄은 프롬프트다. 이는 psql이 명령어를 기다리고 있으며, SQL 쿼리를 입력할 수 있는 작업 공간이 준비되었다는 의미다. 다음 명령어들을 시도해보자:

mydb=> SELECT version();
                                         version
------------------------------------------------------------------------------------------
 PostgreSQL 17.2 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 row)

mydb=> SELECT current_date;
    date
------------
 2016-01-07
(1 row)

mydb=> SELECT 2 + 2;
 ?column?
----------
        4
(1 row)

psql 프로그램은 SQL 명령어 외에도 내부 명령어를 제공한다. 이 명령어들은 백슬래시 문자 “\“로 시작한다. 예를 들어, PostgreSQL SQL 명령어의 문법에 대한 도움말을 보려면 다음과 같이 입력한다:

mydb=> \h

psql을 종료하려면 다음과 같이 입력한다:

mydb=> \q

이렇게 하면 psql이 종료되고 커맨드 셸로 돌아간다. (더 많은 내부 명령어를 보려면 psql 프롬프트에서 \?를 입력한다.) psql의 모든 기능은 psql 문서에서 확인할 수 있다. 이 튜토리얼에서는 이러한 기능을 명시적으로 사용하지 않지만, 필요할 때 직접 사용해보기 바란다.