안녕하세요, 저는 5년차 백엔드 개발자입니다. 이번 글에서는 Node.js의 SSE(Server-Sent Events)를を使って AI 스트리밍 응답을 구현하는 방법을 초보자도 이해할 수 있도록 단계별로 설명드리겠습니다. HolySheep AI를 사용하면 복잡한 설정 없이短短 10줄의 코드로 GPT-4.1의 실시간 스트리밍을 구현할 수 있습니다.

SSE가 뭔가요? (초보자 설명)

SSE(Server-Sent Events)를 쉽게 설명하면, 웹사이트가 서버에서源源不断的 데이터를 실시간으로 받을 수 있게 해주는 기술입니다. 예를 들어:

왜 WebSocket이 아닌 SSE를 사용하나요?

1. 사전 준비물

이 튜тори얼을 따라하려면 다음이 필요합니다:

[스크린샷 힌트] HolySheep 대시보드에서 API Keys 메뉴로 이동하면 새 API 키를 생성할 수 있습니다. 'sk-holysheep-'로 시작하는 키를 복사하세요.

2. 프로젝트 세팅

터미널에서 다음 명령어를 순서대로 실행하세요:

mkdir sse-ai-chat
cd sse-ai-chat
npm init -y
npm install express cors dotenv
npm install --save-dev nodemon

프로젝트 구조는 다음과 같이 구성됩니다:

sse-ai-chat/
├── .env              # API 키 저장
├── server.js         # 메인 서버 코드
├── public/
│   └── index.html    # 테스트용 웹 페이지
└── package.json

3. HolySheep API 키 설정 (.env 파일)

[스크린샷 힌트] .env 파일은 프로젝트 루트 폴더에 만들어야 합니다. 확장자 없이 파일 이름만 .env입니다.

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
PORT=3000

중요: YOUR_HOLYSHEEP_API_KEY 부분을 HolySheep 대시보드에서 생성한 실제 API 키로 교체하세요. API 키는他人에게 공개하지 마세요!

4. Express 서버 + SSE 스트리밍 구현 (핵심 코드)

이제 실제 스트리밍 기능을 구현해보겠습니다. server.js 파일을 만들고 다음 코드를 붙여넣으세요:

const express = require('express');
const cors = require('cors');
const path = require('path');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

// HolySheep API 설정
const HOLYSHEEP_API_KEY = process.env.HOLYSHEEP_API_KEY;
const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';

// 미들웨어 설정
app.use(cors());
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));

// SSE 스트리밍 엔드포인트
app.post('/api/chat/stream', async (req, res) => {
    const { message } = req.body;
    
    // SSE 헤더 설정 - 이것이 중요!
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'X-Accel-Buffering': 'no'  // Nginx 사용 시 필수
    });
    
    try {
        // HolySheep API 호출
        const response = await fetch(
            ${HOLYSHEEP_BASE_URL}/chat/completions,
            {
                method: 'POST',
                headers: {
                    'Authorization': Bearer ${HOLYSHEEP_API_KEY},
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    model: 'gpt-4.1',
                    messages: [
                        { role: 'user', content: message }
                    ],
                    stream: true  // 스트리밍 모드 활성화
                })
            }
        );
        
        // 스트리밍 응답 처리
        const reader = response.body.getReader();
        const decoder = new TextDecoder();
        
        while (true) {
            const { done, value } = await reader.read();
            
            if (done) {
                res.write('event: done\ndata: [DONE]\n\n');
                res.end();
                break;
            }
            
            // 청크 데이터를 문자열로 변환
            const chunk = decoder.decode(value);
            
            // SSE 형식으로 변환하여 전송
            // data: {...}\n\n 형식이어야 함
            const lines = chunk.split('\n');
            
            for (const line of lines) {
                if (line.startsWith('data: ')) {
                    const data = line.slice(6);
                    
                    if (data === '[DONE]') {
                        res.write('event: done\ndata: [DONE]\n\n');
                        return;
                    }
                    
                    // SSE 형식으로 클라이언트에 전송
                    res.write(data: ${data}\n\n);
                }
            }
        }
        
    } catch (error) {
        console.error('HolySheep API 오류:', error);
        res.write(event: error\ndata: ${JSON.stringify({ error: error.message })}\n\n);
        res.end();
    }
});

// 헬스 체크
app.get('/api/health', (req, res) => {
    res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

app.listen(PORT, () => {
    console.log(✅ SSE 서버 실행 중: http://localhost:${PORT});
    console.log(📡 HolySheep API 엔드포인트: ${HOLYSHEEP_BASE_URL});
});

5. 테스트용 프론트엔드 HTML

public 폴더를 만들고 index.html 파일을 생성하세요:

<