**LISTEN**과 **NOTIFY**는 PostgreSQL에 내장된 발행/구독(publish/subscribe) 메시징 시스템을 제공합니다 — 한 세션이 채널에 알림을 보낼 수 있고, 그 채널을 청취하는 다른 세션이 즉시 받습니다. 폴링 없이 데이터베이스에서 실시간 이벤트를 푸시하는 가벼운 방법입니다.
기본 메커니즘
-- 세션이 채널을 구독
LISTEN order_created;
NOTIFY order_created, ;
**LISTEN**과 **NOTIFY**는 PostgreSQL에 내장된 발행/구독(publish/subscribe) 메시징 시스템을 제공합니다 — 한 세션이 채널에 알림을 보낼 수 있고, 그 채널을 청취하는 다른 세션이 즉시 받습니다. 폴링 없이 데이터베이스에서 실시간 이벤트를 푸시하는 가벼운 방법입니다.
-- 세션이 채널을 구독
LISTEN order_created;
NOTIFY order_created, ;
LISTEN은 채널을 구독하고, NOTIFY는 (선택적 텍스트 페이로드와 함께) 발행합니다. 청취자는 비동기적으로 알림받습니다 — 폴링 불필요.
-- 행이 삽입될 때마다 알림하는 트리거
CREATE FUNCTION notify_new_order() RETURNS trigger AS $$
BEGIN
PERFORM pg_notify('order_created', NEW.id::text); -- 새 id로 알림
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER order_notify AFTER INSERT ON orders
FOR EACH ROW EXECUTE FUNCTION notify_new_order();
-- 이제 주문 삽입이 자동으로 청취자에게 알림 푸시
NOTIFY를 트리거와 결합하면 데이터가 변경될 때(새 주문, 상태 업데이트) 데이터베이스가 자동으로 이벤트를 푸시하게 해줍니다 — 채널을 청취하는 애플리케이션 서버가 실시간으로 반응합니다.
애플리케이션 코드(Node, Python 등)가 연결을 열고 채널을 LISTEN합니다.
NOTIFY가 발생하면(예: 데이터 변경 시 트리거에서), 앱이 이벤트를 받고
반응합니다 — websocket에 푸시, 캐시 무효화, 작업 트리거 등.
→ 데이터베이스를 폴링하지 않고 데이터베이스 변경에 실시간 반응.
✗ 알림은 영속되지 않음 — 청취자가 없으면 메시지 손실
(실제 메시지 브로커 같은 내구성/큐 보장 없음)
✗ 페이로드는 작음 (제한된 크기); transaction이 COMMIT된 후에만 전달
→ 가벼운 실시간 신호에 적합; 내구성/신뢰성 메시징에는
적절한 브로커(RabbitMQ, Kafka)나 큐 테이블 사용.
LISTEN/NOTIFY는 내장 발행/구독 메시징을 제공하는 유용하고 다소 덜 알려진 PostgreSQL 기능으로, 폴링 없이 애플리케이션에 실시간 반응성을 추가하는 데 가치가 있습니다.
핵심 가치는 무언가 발생할 때(새 주문, 상태 변경) 데이터베이스가 청취하는 애플리케이션 세션에 이벤트를 푸시하게 하는 것입니다 — 일반적으로 트리거와 결합되어 데이터 변경이 자동으로 청취자에게 알리고, 애플리케이션 서버가 반응합니다(websocket에 푸시, 캐시 무효화, 백그라운드 작업 트리거).
이는 변경을 확인하기 위해 데이터베이스를 반복 폴링하는 비효율(LISTEN/NOTIFY가 우아하게 대체하는 흔하고 낭비적인 패턴) 없이 실시간 이벤트 기반 동작을 제공하므로 가치가 있습니다.
메커니즘(구독을 위한 LISTEN, 발행을 위한 NOTIFY, 데이터 변경 시 자동 알림을 위한 트리거)과 애플리케이션이 사용하는 방법(실시간 반응을 구동하기 위해 이벤트 청취)을 이해하는 것은 PostgreSQL만으로 반응형 이벤트 기반 애플리케이션을 구축하는 데 유용합니다.
똑같이 중요한 것은 제한을 아는 것입니다: 알림은 영속되지 않고(청취자가 없으면 손실 — 내구성 보장 없음), 작은 페이로드를 가지며, 커밋 후에만 발생 — 따라서 신뢰성과 영속성이 중요할 때 내구성 있는 메시지 브로커(RabbitMQ, Kafka)의 대체가 아니라 가벼운 실시간 신호에 적합합니다.
실시간 반응성은 흔한 필요이고 LISTEN/NOTIFY가 가벼운 경우에 이를 달성하는 내장된 폴링 없는 방법을 제공하므로, 이를 이해하는 것 — 발행/구독 메커니즘, 트리거 패턴, 결정적으로 그 제한(언제 충분하고 언제 실제 브로커가 필요한지) — 은 이벤트 기반 애플리케이션을 구축하는 가치 있고 실용적으로 관련된 PostgreSQL 지식이며, 종종 간과되는 유용한 내장 기능입니다.