그냥 Postgres를 쓰세요! : 관계형 데이터베이스를 넘어 AI, 검색, JSON, 시계열, 지리 공간까지
저자

데니스마그다

저자:데니스마그다
포스트그레스전문가이자소프트웨어엔지니어.썬마이크로시스템즈와오라클에서자바플랫폼관련업무를맡았고,이후데이터베이스와대규모분산시스템분야로옮겨활동해왔다.

역자:윤명식
25년이상금융,게임,광고,클라우드에이르는다양한산업현장에서데이터베이스엔지니어이자아키텍트로일해왔다.신한은행,하나은행,HD현대중공업,포스코등에서OLTP시스템및PostgreSQL로의마이그레이션프로젝트를다수수행했다.현재는시니어컨설턴트로서엔터프라이즈고객의PostgreSQL전환과현대화,고가용성설계,성능최적화를돕고있다.

목차


옮긴이머리말xi
추천사xiii
추천서문(조시롱)xvi
머리말xix
이책에대하여xxi
감사의글xxv
표지에대하여xxvii

PARTI관계형데이터베이스로서의PostgresCHAPTER1Postgres만나기
1.1왜Postgres가인기가많을까요?4
1.2“그냥Postgres를쓰세요!”의의미6
1.3도커에서Postgres시작하기7
1.4psql로연결하기11
1.5모의데이터생성하기13
1.6기본쿼리실행하기17

CHAPTER2표준RDBMS기능
2.1데이터베이스구조생성하기22
2.2데이터쿼리및조작하기31
2.3데이터무결성34
2.4트랜잭션42
2.5조인49
2.6함수와트리거52
2.7뷰65
2.8역할과접근제어70
요약77

CHAPTER3현대적인SQL
3.1현대적SQL이란무엇일까요?79
3.2음악서비스데이터세트로드하기80
3.3공통테이블표현식82
3.4재귀적쿼리91
3.5윈도함수97
요약104

CHAPTER4인덱스
4.1왜인덱스가그토록인기를끌까요?106
4.2Postgres인덱스유형개요108
4.3멀티플레이어게임데이터세트로드하기110
4.4EXPLAIN문사용법배우기112
4.5단일칼럼인덱스117
4.6복합인덱스127
4.7커버링인덱스138
4.8부분인덱스141
4.9함수및표현식인덱스144
요약147

PARTII관계형모델을넘어선핵심PostgresCHAPTER5Postgres와JSON
5.1JSON데이터저장하기152
5.2피자주문데이터세트로드하기154
5.3Postgres에서의JSON:균형맞추기157
5.4JSON데이터쿼리하기160
5.5JSON데이터수정하기172
5.6JSON데이터인덱싱176
요약191

CHAPTER6Postgres를이용한전문검색
6.1Postgres전문검색의기초193
6.2전문검색을위한데이터준비200
6.3전문검색수행하기207
6.4검색결과의순위매기기213
6.5검색결과강조하기220
6.6어휘소인덱싱223
요약230

PARTIII확장기능및광범위한생태계CHAPTER7PostgreSQL의확장기능
7.1Postgres확장성의기원233
7.2확장기능시작하기234
7.3개발자를위한필수확장기능243
7.4Postgres호환솔루션245
요약246

CHAPTER8생성형AI를위한Postgres
8.1생성형AI와함께Postgres를사용하는방법248
8.2pgvector와함께Postgres시작하기252
8.3임베딩생성하기255
8.4벡터유사도검색262
8.5임베딩인덱싱269
8.6RAG구현하기284
요약292

CHAPTER9시계열데이터를위한Postgres
9.1Postgres가시계열데이터를처리하는방식294
9.2TimescaleDB와함께Postgres시작하기298
9.3시계열데이터로드하기301
9.4TimescaleDB하이퍼테이블탐색하기303
9.5시계열데이터분석하기309
9.6연속집계사용하기318
9.7시계열데이터인덱싱324
요약338

CHAPTER10공간데이터처리를위한Postgres
10.1Postgres가지리데이터를처리하는방식340
10.2PostGIS와함께Postgres시작하기345
10.3OpenStreetMap데이터세트로드하기348
10.4지리공간데이터시각화354
10.5지리공간데이터쿼리하기357
10.6공간인덱스를활용한지리데이터검색최적화371
요약384

CHAPTER11PostgreSQL을메시지큐로사용하기
11.1언제Postgres를메시지큐로사용하는가386
11.2커스텀메시지큐구축하기388
11.3커스텀큐사용하기393
11.4LISTEN/NOTIFY활용하기398
11.5큐구현시고려사항401
11.6pgmq로Postgres시작하기407
11.7pgmq사용하기410
요약415

APPENDIXA다섯가지최적화팁417
A.1EXPLAIN완벽하게마스터하기418
A.2인덱스사용시점을파악하라420
A.3커넥션풀링을사용하라424
A.4정말필요한데이터만조회하라426
A.5데이터베이스의연산능력을활용하라429

APPENDIXBPostgres를사용하지말아야할때

추천후기(블라드미할체아)432
찾아보기436

출판사 서평

Postgres하나로어디까지가능한지직접확인하는책

오늘날의Postgres(PostgreSQL)는관계형데이터베이스를넘어,훨씬넓은세계를품은범용데이터베이스로발전했다.JSON문서처리,전문검색,벡터검색과RAG,시계열데이터,지리공간데이터,메시지큐등Postgres하나로다룰수있는영역은아주넓다.이책은바로그변화를개발자가직접실행해보며납득할수있는방식으로보여준다.제목“그냥Postgres를쓰세요!”는과장된주장이아니라,새로운데이터요구가생길때마다용도별로데이터베이스를추가하기전에먼저Postgres의가능성을확인해보자는실용적인제안이다.
1부는Postgres를관계형데이터베이스로제대로사용하는데필요한기본기를다룬다.Postgres를시작하고psql로연결하는방법부터데이터베이스구조설계,데이터쿼리와조작,제약조건,외래키,트랜잭션,조인,함수,트리거,뷰,접근제어까지RDBMS로서의핵심기능을차근차근살핀다.이어CTE,재귀쿼리,윈도함수같은현대적SQL기능과다양한인덱스활용법을다루며,Postgres를단순저장소가아니라애플리케이션성능과구조를함께책임지는도구로바라보게한다.
2부는관계형모델을넘어Postgres가기본으로제공하는JSON처리와전문검색을다룬다.JSON객체저장,조회/수정,B-트리와GIN인덱스로검색성능을높이는과정,그리고텍스트를어휘소로변환하는것부터순위매기기,검색결과강조,GIN/GiST인덱싱까지의과정을살펴본다.
3부는Postgres의확장생태계를훑어본다.pgvector를이용해임베딩을저장하고벡터유사도검색과RAG흐름을구성하는장은생성형AI시대의요구와직접맞닿아있고,TimescaleDB를활용한시계열데이터관리/분석,PostGIS를활용한공간데이터처리,LISTEN/NOTIFY와pgmq를이용한메시지큐패턴까지차례로살펴본다.넓은각주제에대해세부이론에매몰되지않고“내애플리케이션에서어디부터시작하면되는가”에초점을맞춘다.
다섯가지최적화팁과‘Postgres를사용하지말아야할때’까지다룬부록은이책의균형감각을잘보여준다.Postgres를만능으로포장하지않고강점과한계를함께보며실무적인판단을돕는다.관계형데이터베이스로만Postgres를써왔던개발자,새로운요구사항이생길때마다기술스택이늘어나는것이부담스러운팀,그리고현대애플리케이션의데이터처리를더단순하고견고하게설계하고싶은DB실무자에게이책은꼭필요한단한권의안내서가되어줄것이다.

주요내용
트랜잭션워크로드를처리하는RDBMS로Postgres활용하기
CTE,재귀쿼리,윈도함수,다양한인덱스로SQL활용도와성능높이기
JSON문서를저장/조회/수정하고애플리케이션데이터모델에적용하기
Postgres의전문검색기능으로텍스트검색기능구성하기
pgvector로벡터유사도검색과RAG흐름만들어보기
TimescaleDB와PostGIS로시계열/지리공간데이터다루기
LISTEN/NOTIFY와pgmq로메시지큐패턴활용하기
Postgres에적합한사용사례와그렇지않은사례판단하기

책속에서

수년에걸쳐“그냥Postgres를쓰세요!”는사실상Postgres커뮤니티의모토가되었으며,데이터베이스가이제감당할수있는사용사례의폭과깊이를함축적으로담아내고있습니다./그렇다면Postgres가만능도구가되어모든개발자에게필요한유일한데이터베이스가되었다는뜻일까요?결코그렇지않습니다./“그냥Postgres를쓰세요!”는수십년간Postgres를구축하고사용해온전문가들이건네는합리적인조언으로받아들이시기바랍니다.이미Postgres를사용하고있거나도입을계획중인데,지리공간·시계열·생성형AI와같은새로운사용사례를지원해야하는상황이라면,기술스택에다른데이터베이스를추가하기전에먼저Postgres로해결할수있는지확인해보시기바랍니다.(6쪽)

데이터베이스역할이애플리케이션이허용하는범위를초과하는광범위한권한을가지고있다면,그것은이미잠재적인문제입니다.애플리케이션사용자계정이탈취될경우,공격자가데이터베이스에직접접근하여애플리케이션로직이의도했던범위를훨씬벗어나는작업을수행할위험이있기때문입니다./Postgres에서역할은데이터베이스수준의접근권한을정의하고관리하는데사용됩니다.역할은설정방식에따라데이터베이스사용자가될수도있고,사용자그룹이될수도있습니다.따라서“사용자X를사용해Postgres에접속한다”는말은기술적으로“역할X를사용하여데이터베이스연결을수행한다”는의미와같습니다./역할을활용하면접근제어를매우세밀하게조정할수있습니다.이를통해애플리케이션사용자가필요한만큼의권한만갖고그이상은제한하는최소권한원칙(principleofleastprivilege)을데이터베이스수준에서보장할수있습니다.(70쪽)

부분인덱스는인덱스생성시WHERE절을사용하여정의합니다./CREATEINDEXpartial_index_nameONtable_name(columnA)WHEREcondition;/이예시에서부분인덱스는columnA에생성되지만,오직특정조건을만족하는행들만포함합니다./부분인덱스는데이터의특정부분집합에대한쿼리를최적화하면서나머지데이터는무시하고싶을때특히유용합니다.또한인덱스크기가더작고,조건에맞지않는행이수정될때는인덱스를업데이트할필요가없으므로테이블업데이트속도가빨라집니다.예를들어대규모테이블이있지만애플리케이션이특정데이터집합만빈번하게조회한다면,부분인덱스를통해쿼리를최적화하고메모리와디스크같은시스템자원을훨씬효율적으로사용할수있습니다.(141쪽)

pgvector확장기능은코사인거리(〈=〉),유클리드거리(〈-〉),내적(〈#〉)등여러거리연산자를제공합니다.코사인거리는텍스트데이터에서생성된임베딩을비교하는생성형AI애플리케이션에서일반적으로선택되는방식으로,특히임베딩이L2정규화된경우(길이가항상1인경우)에적합합니다.이방법은두벡터임베딩사이의각도의코사인을계산합니다.(…)예를들어그림8.7은2차원공간에서연관성이높은벡터임베딩과낮은벡터임베딩사이의각도차이를보여줍니다.“Maytheforcebewithyou(포스가함께하길)”라는문구와“StarWars…”설명사이의각도a는동일한문구와“JurassicPark…”영화설명사이의각도b보다작습니다.이는해당문구가〈스타워즈〉에서는자주등장하지만〈쥬라기공원〉에서는전혀등장하지않기때문입니다.(263~264쪽)

BRIN은특정칼럼의값이테이블내부구조의물리적위치와강력한상관관계를가질때매우효과적으로작동하도록설계되었습니다.(…)또한,우리의시계열데이터는항상테이블끝에추가만되고기존데이터가수정되지않기때문에,심박수측정행들은가용페이지를차례대로채워나가게됩니다.한페이지에추가되는각새로운행은이미해당페이지에있는행들의시간과강력한상관관계를가집니다.서로다른기기의측정값이섞이더라도시간차이는크게벌어지지않습니다.(330쪽)

다른시나리오에서는소비자가큐에서다음메시지를가져와처리를시작했다가어떤이유로실패할수있습니다.예를들어생산자가작업을큐에넣고워커들이이를가져와실행하는작업스케줄링시스템을생각해보십시오.워커가하나이상의작업을가져온후장애가발생하면,해당작업들은계속processing상태로남게됩니다./이를완화하기위해,메시지가제한된시간동안만processing상태를유지할수있도록하는장애복구메커니즘을도입할수있습니다.설정된시간임계값이만료되면메시지상태가다시new로재설정되어다른워커가이를가져가처리할수있게됩니다.이는데이터베이스에주기적인작업을예약하는pg_cron확장기능을사용하여자동화할수있으며,processing상태에갇힌메시지를체크하고그상태를new로복구하는로직을수행합니다.(406~407쪽)