콘텐츠로 이동
Study NotePostgreSQL

PostgreSQL의 전체 구조

결론부터
앱은 특정 데이터베이스에 role로 접속하고, 그 안의 테이블을 SQL로 읽고 바꾼다.

접속 문자열에는 서버 주소, DB 이름, 사용자 이름이 함께 들어간다. 이 셋을 같은 것으로 생각하면 “연결은 되는데 테이블이 없다”와 “테이블은 있는데 권한이 없다”를 구분하기 어렵다. 이 페이지는 쿼리 한 번이 어디로 가는지부터 그린다.

이 장에서 처음 나오는 말3개
SQLStructured Query Language
어떤 데이터를 읽고 바꿀지 데이터베이스에 전달하는 언어.
PostgreSQLPostgres
SQL 실행, 저장, 동시 접근과 복구를 담당하는 데이터베이스 시스템. 두 이름은 같은 제품을 가리킨다.
role
로그인 여부와 객체 접근 권한을 부여하는 PostgreSQL의 신원 단위.
앱이 role로 PostgreSQL 서버의 studydb에 접속하고 SQL이 public 스키마의 테이블을 읽거나 변경하는 흐름

주소는 서버를 찾고, DB 이름은 그 서버에서 사용할 데이터베이스를 고른다. public.tasks는 public이라는 스키마 안의 tasks 테이블이라는 뜻이다. 스키마는 관련 객체를 묶는 이름 공간이지 서버나 사용자 계정이 아니다. 한 연결은 한 데이터베이스에 속한다. (클라이언트와 서버 구조, 스키마)

대상무엇을 묶나예
서버 인스턴스실행 중인 PostgreSQL 프로세스들과 저장 데이터로컬 컨테이너 한 개
database연결과 객체 관리의 큰 단위studydb
schema한 DB 안의 테이블·함수 등의 이름 공간public, auth
table같은 구조를 가진 행들public.tasks
role로그인과 권한postgres, 앱 전용 role

role은 PostgreSQL 서버의 여러 DB에서 공유된다. 다른 DB에 같은 이름의 테이블이 있어도 현재 DB의 public.tasks와는 별개다. search_path는 스키마를 생략했을 때 이름을 찾는 순서이므로, 처음에는 예제처럼 public.tasks를 명시하면 혼동이 줄어든다.

SQL을 실행하는 것과 서버를 관리하는 것

섹션 제목: “SQL을 실행하는 것과 서버를 관리하는 것”

SELECT는 데이터를 읽으라는 요청이다. PostgreSQL은 실행 방법을 결정하고 디스크·메모리의 데이터를 읽어 결과를 보낸다. ORM이나 Supabase 클라이언트를 쓰더라도 DB에 도착한 작업의 비용과 권한은 사라지지 않는다.

CNPG는 그 서버를 Kubernetes에 배치하고 상태를 관리한다. CNPG 설정이 좋은 스키마나 빠른 SQL을 대신 만들어 주지는 않는다. 반대로 SQL을 잘 작성해도 백업·장애 전환은 별도로 준비해야 한다. (CNPG 소개)

PostgreSQL 문서의 database cluster는 한 서버가 관리하는 여러 DB의 집합을 뜻한다. 반면 CNPG의 Cluster 리소스는 primary와 replica 인스턴스를 함께 관리하는 Kubernetes 객체다. 문맥 없이 “클러스터가 세 개”라고 하기보다 CNPG Cluster 하나, DB 인스턴스 세 개처럼 말한다. (PostgreSQL 용어)

같은 서버에 접속했는데 relation does not exist가 나오면 무엇부터 볼까? 현재 DB와 스키마를 확인한다. DB가 다르거나 search_path가 다를 수 있기 때문이다. role의 접근 권한은 그다음 구분할 문제다. 첫 데이터베이스에서 직접 확인한다.