Skip to content
ai news

Postgres 19, 놀라운 업그레이드를 선보이다

수년간 개발자들은 모든 것에 Postgres를 사용하는 것을 농담처럼 이야기해 왔습니다. 버전 19에서 네이티브 그래프 쿼리와 원자적 연산이 도입되면서, 그 농담은 빠르게 프로덕션 환경에서 사용 가능한 현실이 되고 있습니다.

Margaux Reyes
Postgres 19, 놀라운 업그레이드를 선보이다

복잡한 JOIN은 이제 그만: 네이티브 그래프 쿼리 도입

Postgres 19가 SQL/PGQ (Property Graph Queries)에 대한 네이티브 지원이라는 폭탄을 터뜨렸습니다. 이는 단순한 업그레이드가 아니라 근본적인 변화로, 직관적인 그래프 탐색 구문을 사용하여 표준 관계형 테이블을 조회할 수 있게 해줍니다. 다중 테이블 JOIN 체인으로 고통받던 시절은 잊으세요. 데이터 관계의 사용성이 획기적으로 개선되었습니다.

CREATE PROPERTY GRAPH를 사용하여 기존 스키마 위에 논리적 그래프 계층을 정의함으로써 이 강력한 기능을 활용할 수 있습니다. customersproducts와 같은 핵심 데이터 노드인 vertices(정점)customer_ordersorder_items와 같은 중요한 연결 고리인 edges(간선)로 테이블을 지정합니다. 중요한 점은 이 설정이 기본 데이터 구조를 전혀 건드리지 않는다는 것입니다. 이는 마이그레이션이 아닌 뷰(view) 방식입니다.

이 우아한 추상화는 이전에 길고 오류가 발생하기 쉬운 JOIN 문들의 연속을 요구하던 쿼리들을 획기적으로 단순화합니다. 5개의 테이블에 걸친 고객의 전체 구매 이력을 파악하는 상황을 상상해 보세요. 그 복잡한 SQL 덩어리가 이제는 간결하고 읽기 쉬운 그래프 탐색으로 변모합니다. 개발자에게 이는 더 쓰기 쉽고, 읽기 쉽고, 유지보수하기 쉬운 코드를 의미하며, 생산성에 직접적인 영향을 주고 쿼리 복잡성을 줄여줍니다.

우리가 항상 원했던 원자적 'Get-or-Create'

개발자들은 오랫동안 데이터베이스 상호작용에서 "get-or-create(가져오기 또는 생성)" 난제와 씨름해 왔습니다. Postgres 19 이전에는 이 일반적인 패턴을 구현하기 위해 두 개의 개별 쿼리가 필요했습니다. INSERT 시도 후 충돌로 실패하면 SELECT를 수행하는 방식입니다. 이 2단계 방식은 경쟁 상태(race condition)를 유발하고 복잡한 애플리케이션 측 로직을 요구하는, 투박하고 오류가 발생하기 쉬운 과정이었습니다.

이제 Postgres 19와 함께 판도가 바뀝니다. 새로운 ON CONFLICT DO SELECT 문은 우리가 항상 원했던 원자적(atomic) "get-or-create" 연산을 제공합니다. 이 단일하고 우아한 쿼리는 새로운 행을 삽입하거나, 충돌이 발생할 경우 기존 행을 원활하게 반환함을 보장하여 복잡한 애플리케이션 로직이나 명시적인 트랜잭션 블록 없이도 경쟁 상태를 제거합니다.

이 기능은 중요하고 대용량인 워크플로우에 큰 축복입니다. 사용자 계정 생성, 콘텐츠에 고유 태그 추가, 또는 중복 항목에 대한 두려움 없이 멱등성(idempotent) API 요청을 처리하는 상황을 생각해 보세요. ON CONFLICT DO SELECT는 코드를 더 깔끔하고 견고하며 성능이 뛰어나게 만들어, 개발자가 방어적인 데이터베이스 프로그래밍이 아닌 기능 구현에 집중할 수 있게 해줍니다.

다운타임 없이 낭비되는 공간을 되찾다

Postgres는 항상 데이터의 든든한 일꾼이었지만, UPDATEDELETE 연산 방식은 테이블 비대화(table bloat)라는 고질적인 문제를 야기했습니다. 각 수정 작업은 죽은 행(dead rows)을 남기며, VACUUM이 이 공간을 재사용 가능하게 표시하더라도 운영 체제에 실제로 반환하지는 않습니다. 개발자들은 계속 증가하는 디스크 사용량이라는 인프라의 보이지 않는 세금에 갇혀 있었습니다.

Postgres 19는 마침내 내장된 해결책인 새로운 REPACK 명령어를 제공합니다. 이는 단순한 작은 조정이 아니라 비대화에 대한 직접적인 공격으로, 전체 테이블과 관련 인덱스를 새로운 압축 파일로 다시 작성합니다. 이는 실제 디스크 공간 회수를 의미하며, 대규모 데이터베이스를 관리하는 모든 이들에게 진정한 승리입니다.

결정적으로 REPACKVACUUM FULL을 프로덕션 시스템에서 사용하기 어렵게 만들었던 치명적인 독점 테이블 잠금을 방지합니다. CONCURRENTLY 옵션을 사용하면 작업이 실행되는 동안 애플리케이션이 방해받지 않고 데이터를 계속 읽고 쓸 수 있습니다. 이는 pg_repack과 같은 타사 확장 프로그램의 필요성을 없애 데이터베이스 유지 관리를 크게 간소화합니다.

너무 일찍 기뻐하기 전에 주의할 점이 있습니다. REPACK은 테이블과 모든 인덱스의 두 번째 복사본을 일시적으로 보관할 충분한 여유 디스크 공간을 요구합니다. 이는 가동 중단 없이 낭비된 공간을 회수하기 위한 작은 대가입니다. 곧 출시될 기능에 대한 자세한 내용은 공식 발표를 확인하세요: PostgreSQL 19 Beta 1 Released!.

이 글이 마음에 드셨나요? 매일 아침 이런 글을 메일로 받아보세요.

하루 한 통 · 두 번의 클릭으로 구독 취소 · 제3자 추적 없음

개발자 및 DBA를 위한 핵심 성과 요약

Postgres 19는 개발자와 DBA를 위한 일련의 전술적 성과를 제공하여 워크플로우를 간소화하고 성능을 강화합니다. 가장 눈에 띄는 것은 쿼리 실행을 안정화하기 위해 설계된 새로운 모듈인 PG_PLAN_ADVICE입니다. 이를 통해 빠른 쿼리 계획을 캡처하고 "고정(pin)"하여 시간이 지남에 따라 성능을 저하시킬 수 있는 최적화되지 않은 선택을 플래너가 내리지 않도록 방지할 수 있습니다. 업그레이드나 데이터 변경 후 발생하는 의문의 속도 저하는 이제 끝입니다.

개발자 편의성이 크게 향상되었습니다. 더 이상 SELECT 목록의 모든 비집계 열을 GROUP BY 절에 지루하게 반복할 필요가 없습니다. 이는 오랫동안 기다려온 SQL 간소화 작업입니다. 또한 COPY 명령이 이제 JSON으로의 데이터 내보내기를 직접 지원하며, 이는 데이터 엔지니어를 위한 작지만 중요한 삶의 질 개선 사항입니다.

유지 관리 성능도 대폭 향상되었습니다. 데드 스페이스를 회수하는 데 중요한 VACUUM 작업이 이제 인덱스 정리를 위해 병렬 워커(parallel workers)를 활용합니다. 이는 대규모 테이블의 가동 중단 시간을 줄이고 유지 관리 주기를 단축하여, Postgres의 고질적인 문제점 중 하나를 직접적으로 해결합니다.

마지막으로, JIT 컴파일이 기본값에서 해제되어 옵트인(opt-in) 방식으로 변경되었습니다. 이전 버전에서는 혜택을 보지 못하는 쿼리에도 JIT가 활성화되어 신뢰할 수 없는 비용 추정으로 인해 성능 저하가 발생하는 경우가 있었습니다. 기본값을 해제함으로써 적절하고 무거운 쿼리에 대해 명시적으로 구성된 경우에만 작동하도록 하여 전체 시스템 성능을 보호합니다.

자주 묻는 질문

Postgres 19의 핵심 기능은 무엇인가요?

핵심 기능은 SQL/PGQ(Property Graph Queries)에 대한 기본 지원으로, 개발자가 그래프와 유사한 구문을 사용하여 관계형 데이터를 쿼리할 수 있게 하여 복잡한 조인을 단순화합니다.

Postgres 19가 Neo4j와 같은 전용 그래프 데이터베이스를 대체하나요?

아니요. 새로운 그래프 쿼리 기능은 기존 관계형 데이터에서 복잡한 쿼리를 작성하는 편의성을 개선하기 위해 설계되었습니다. 전문적인 그래프 저장소와 최고의 탐색 성능이 필요한 사용 사례에는 여전히 전용 그래프 데이터베이스가 더 나은 선택입니다.

REPACK CONCURRENTLYVACUUM FULL과 어떻게 다른가요?

VACUUM FULL은 작업 시간 내내 테이블을 잠가 가동 중단을 유발합니다. REPACK CONCURRENTLY는 장기적인 독점 잠금 없이 테이블을 다시 작성하여 디스크 공간을 회수하므로, 작업 중에도 테이블을 읽고 쓸 수 있습니다.

ON CONFLICT DO SELECT는 어떤 문제를 해결하나요?

이 기능은 단일 원자적 문장으로 일반적인 'get-or-create(가져오기 또는 생성)' 문제를 해결합니다. 행이 존재하지 않으면 삽입하고, 존재하면 기존 행을 선택하는 작업을 하나의 트랜잭션 안전 작업 내에서 수행하여 경쟁 상태(race condition)를 제거합니다.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only