Translate

2019년 4월 6일 토요일

[PostgreSQL, Node.js] 소켓 통신 실시간 INSERT 이벤트 받기



개발프로그램Postgresql 9.6

Node.js 소켓 통신 중
PostgreSQL DB에서 특정 테이블에 INSERT가 발생한 것을 캐치하고 싶다면
우선 PostgreSQL에서 다음과 같은 FUCNTION와 TRIGGER를 생성한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-- create notify function
CREATE FUNCTION notify_trigger() RETURNS trigger AS $$
DECLARE
BEGIN
PERFORM pg_notify('watch_realtime_table', row_to_json(NEW)::text);
RETURN new;
END;
$$ LANGUAGE plpgsql;


-- create insert trigger
CREATE TRIGGER watch_realtime_table_trigger AFTER INSERT ON realtime_table
FOR EACH ROW EXECUTE PROCEDURE notify_trigger();

각각을 설명하자면
notify_trigger은 watch_realtime_table이라는 채널에 JSON 형식의 데이터를 nofity하는 역할을 하고,
watch_realtime_table_trigger는 realtime_table이라는 테이블에 INSERT가 발생하면 해당 행들에 대해 notify_trigger()함수를 실행,
즉 결과적으로 realtime_table에 INSERT가 발생할 때마다 해당 데이터들을 watch_realtime_table라는 채널에 notify한다는 것이다.

더 간단히 말하자면 watch_realtime_table라는 채널을 구분자로 INSERT된 값들을 받아올 수 있다는 뜻이다.

이제 Node.js 부분에서 해당 채널을 LISTEN하는 코드를 추가하면 되는데, 이는 다음과 같다.


1
2
3
4
5
6
7
8
var pgp = require('pg-promise')(/*options*/);

var client = new pgp.pg.Client(dburl);
client.connect();
client.query('LISTEN "watch_realtime_table"');
client.on('notification', function(data) {
    console.log(data.payload);
});

그러면 해당 데이터들을 INSERT때마다 실시간으로 JSON 형식으로 console에서 확인할 수 있다.

또한 LISTEN 작업을 중단하려면
client.query('UNLISTEN "watch_realtime_table"'); 를 이용한다.


- 참고 사이트

0 개의 댓글:

댓글 쓰기