728x90

1. PostgreSQL의 알림 시스템 설정

PostgreSQL에서는 LISTENNOTIFY 명령어를 사용하여 데이터베이스의 변경 사항을 애플리케이션에 실시간으로 전달할 수 있습니다. 먼저 PostgreSQL에서 알림을 보낼 수 있도록 트리거를 설정합니다.

    -- 데이터 변경 후 알림을 보내는 함수 생성
    CREATE OR REPLACE FUNCTION notify_cache_update() RETURNS trigger AS $$
    BEGIN
      -- pg_notify를 사용해 알림을 보냄
      PERFORM pg_notify('cache_update_channel', NEW.id::TEXT);
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;

    -- 트리거 생성: 데이터베이스 업데이트 시 알림을 보냄
    CREATE TRIGGER trigger_cache_update
    AFTER INSERT OR UPDATE ON your_table
    FOR EACH ROW EXECUTE FUNCTION notify_cache_update();
  

위의 SQL 코드는 your_table에 데이터가 삽입되거나 수정될 때마다 pg_notify를 사용하여 'cache_update_channel' 채널로 알림을 보냅니다.

2. Node.js에서 PostgreSQL 알림 받기

Node.js 서버에서 pg 라이브러리를 사용하여 PostgreSQL의 알림을 수신하고 처리할 수 있습니다. 아래 코드는 PostgreSQL에서 알림을 수신하는 예시입니다.

    const { Client } = require('pg');

    // PostgreSQL 연결 설정
    const client = new Client({
      user: 'your_user',
      host: 'localhost',
      database: 'your_db',
      password: 'your_password',
      port: 5432,
    });

    client.connect();

    // 알림 채널을 리스닝
    client.query('LISTEN cache_update_channel');

    // 알림 받기
    client.on('notification', (msg) => {
      console.log('Received notification:', msg);
      // 알림을 받으면 캐시 갱신 등의 처리를 할 수 있습니다.
    });

    // 에러 처리
    client.on('error', (err) => {
      console.error('Error in PostgreSQL client:', err);
    });
  

이 코드에서 LISTEN 명령어로 'cache_update_channel' 채널에서 발생한 알림을 기다리고, notification 이벤트가 발생하면 알림을 처리합니다.

3. WebSocket 서버 구현

알림을 실시간으로 클라이언트에 전달하기 위해 Node.js에서 WebSocket 서버를 설정합니다. WebSocket은 클라이언트와 서버 간의 실시간 통신을 가능하게 해줍니다.

    const WebSocket = require('ws');

    // WebSocket 서버 설정
    const wss = new WebSocket.Server({ port: 8080 });

    wss.on('connection', (ws) => {
      console.log('A client connected');
      
      // PostgreSQL에서 알림을 받을 준비
      client.query('LISTEN cache_update_channel');
      
      client.on('notification', (msg) => {
        console.log('Received notification:', msg);
        ws.send(msg.payload);  // WebSocket 클라이언트로 알림 전송
      });
    });

    console.log('WebSocket server is running on ws://localhost:8080');
  

위 코드에서 WebSocket 서버를 설정하고, 클라이언트가 연결되면 PostgreSQL 알림을 받아 해당 알림을 클라이언트에 실시간으로 전달합니다.

4. SvelteKit에서 WebSocket 연결

SvelteKit에서는 클라이언트에서 WebSocket을 통해 실시간으로 서버와 통신할 수 있습니다. 아래 코드는 SvelteKit 클라이언트에서 WebSocket을 연결하고 알림을 수신하는 예시입니다.


      import { onMount } from 'svelte';

      let data: string;

      onMount(() => {
        const ws = new WebSocket('ws://localhost:8080'); // WebSocket 서버 연결

        ws.onopen = () => {
          console.log('WebSocket connected');
        };

        ws.onmessage = (event) => {
          console.log('Received message:', event.data);
          data = event.data; // 알림 데이터를 UI에 반영
        };

        ws.onerror = (error) => {
          console.error('WebSocket error:', error);
        };
      });
     <main>
       <h1>Real-time Notifications</h1>
       <p>{data}</p> <!-- 실시간 알림 데이터 표시 -->
     </main>

위 SvelteKit 코드는 WebSocket 서버에 연결하고, 알림을 받을 때마다 페이지에 표시합니다.

결론

PostgreSQL의 pg_notify를 사용하여 데이터베이스에서 실시간으로 알림을 보내고, 이를 Node.js 서버에서 WebSocket을 통해 SvelteKit 클라이언트에 전달하는 방법을 살펴보았습니다. 이 방식은 데이터베이스의 변경 사항을 실시간으로 클라이언트에게 반영할 수 있어, 사용자 경험을 향상시키는 데 유용합니다.

728x90

+ Recent posts