[javascript] Next.js를 사용하여 웹 소켓 서버를 구현할 수 있나요?

네, Next.js를 사용하여 웹 소켓 서버를 구현할 수 있습니다. Next.js는 Express.js를 사용하여 서버 측 로직을 구현할 수 있으며, 이를 통해 웹 소켓 기능을 추가할 수 있습니다.

먼저, Next.js 프로젝트를 생성하고 의존성을 설치해야합니다. 터미널에서 다음 명령을 실행하여 새로운 Next.js 프로젝트를 생성합니다.

npx create-next-app my-app

그런 다음 websocket 패키지를 설치합니다. 터미널에서 다음 명령을 실행합니다.

npm install ws

웹 소켓 서버를 구현하기 위해선 api 디렉토리를 생성한 후 그 안에 websocket.js 파일을 만들어야합니다. websocket.js 파일은 Next.js의 API 엔드포인트로 사용됩니다.

웹 소켓 서버 코드를 작성하기 전에 websocket.js 파일의 내용을 다음과 같이 작성합니다.

import WebSocket from 'ws';

export default async function handler(req, res) {
  if (req.method === 'GET') {
    // 웹 소켓 연결을 처리하는 로직
    const wss = new WebSocket.Server({ noServer: true });

    wss.on('connection', (ws) => {
      // 클라이언트와의 연결이 성공적으로 이루어졌을 때 실행되는 로직
      ws.on('message', (message) => {
        // 클라이언트로부터 메시지를 받았을 때 실행되는 로직
        console.log('Received message:', message);
        // 클라이언트로 메시지를 전송하는 예시
        ws.send('Server received your message: ' + message);
      });

      ws.on('close', () => {
        // 클라이언트와의 연결이 종료되었을 때 실행되는 로직
        console.log('Client disconnected');
      });
    });

    // wss를 HTTP 서버와 연동시킵니다.
    res.socket.server.on('upgrade', (request, socket, head) => {
      wss.handleUpgrade(request, socket, head, (socket) => {
        wss.emit('connection', socket, request);
      });
    });
  } else {
    res.setHeader('Allow', ['GET']);
    res.status(405).end('Method Not Allowed');
  }
}

이제 웹 소켓 서버 코드를 작성했으므로, Next.js에서 제공하는 서버 기능을 활용하여 웹 소켓 서버를 실행할 수 있습니다. Next.js의 서버 기능을 사용하기 위해 next.config.js 파일을 생성하고 다음 내용을 추가합니다.

module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/websocket',
        destination: '/api/websocket.js',
      },
    ];
  },
};

이제 웹 소켓 서버를 실행할 준비가 되었습니다. 터미널에서 다음 명령을 실행하여 Next.js 앱을 실행합니다.

npm run dev

웹 소켓을 사용하는 클라이언트 앱에서 Next.js의 /api/websocket 엔드포인트로 접속하면 웹 소켓 연결이 성립됩니다. 클라이언트로부터 받은 메시지를 서버에서 출력하고, 다시 클라이언트로 메시지를 전송하는 예시 코드입니다.

웹 소켓 클라이언트 측 예시 코드:

const socket = new WebSocket('ws://localhost:3000/api/websocket');

socket.onopen = () => {
  console.log('Connected to WebSocket server');
  socket.send('Hello server!');
};

socket.onmessage = (event) => {
  console.log('Received message from server:', event.data);
};

socket.onclose = () => {
  console.log('Disconnected from WebSocket server');
};

이제 Next.js에서 웹 소켓 서버를 구현하는 방법을 알게되었습니다. Next.js를 사용하면 웹 소켓 서버 구현 및 관리가 훨씬 쉬워집니다.