Promise를 활용한 웹 소켓 통신 구현

웹 소켓은 클라이언트와 서버 간의 양방향 통신을 제공하는 프로토콜입니다. 이를 활용하여 실시간 데이터를 전송하거나 채팅 애플리케이션과 같은 실시간 기능을 구현할 수 있습니다.

이번에는 웹 소켓 통신을 구현하기 위해 JavaScript의 Promise를 활용하는 방법을 알아보겠습니다.

1. 웹 소켓 연결

먼저, 웹 소켓을 생성하고 서버에 연결해야 합니다. 이때 Promise를 사용하여 연결이 성공하면 resolve하고, 실패하면 reject하는 코드를 작성할 수 있습니다.

const socket = new WebSocket('ws://example.com/socket');

const connect = new Promise((resolve, reject) => {
  socket.onopen = () => {
    console.log('WebSocket connected');
    resolve();
  };

  socket.onerror = (error) => {
    console.error('WebSocket connection error', error);
    reject(error);
  };
});

위 코드에서는 WebSocket 생성자를 사용하여 웹 소켓 객체를 만들고, onopen 이벤트 핸들러를 통해 연결이 성공했을 때 resolve하도록 설정하고, onerror 이벤트 핸들러를 통해 연결에 실패했을 때 reject하도록 설정하였습니다.

2. 메시지 전송

웹 소켓에 연결한 후, 데이터를 서버로 전송해야 합니다. Promise를 활용하여 메시지 전송이 성공하면 resolve하고, 실패하면 reject하는 코드를 작성할 수 있습니다.

const sendMessage = (message) => {
  return new Promise((resolve, reject) => {
    socket.onmessage = (event) => {
      console.log('Received message:', event.data);
      resolve(event.data);
    };

    socket.onerror = (error) => {
      console.error('WebSocket error', error);
      reject(error);
    };

    socket.send(message);
  });
};

위 코드에서는 onmessage 이벤트 핸들러를 통해 서버로부터 오는 메시지를 받아온 후 resolve하도록 설정하고, onerror 이벤트 핸들러를 통해 에러가 발생하면 reject하도록 설정합니다. 마지막으로 socket.send() 메서드를 사용하여 메시지를 서버로 전송합니다.

3. 사용 예제

위에서 작성한 Promise를 활용한 웹 소켓 통신 코드를 실제로 사용해보겠습니다.

connect.then(() => {
  console.log('WebSocket connected successfully');
  sendMessage('Hello, server!')
    .then((response) => {
      console.log('Server response:', response);
    })
    .catch((error) => {
      console.error('Failed to send message:', error);
    });
})
.catch((error) => {
  console.error('WebSocket connection error:', error);
});

위 코드에서는 connect Promise를 사용하여 웹 소켓 연결을 시도하고, 연결이 성공하면 sendMessage 함수를 호출하여 메시지를 전송합니다. 성공적으로 메시지를 전송하면 서버의 응답을 출력하고, 오류가 발생하면 해당 에러를 처리합니다.

위와 같이 Promise를 활용하여 웹 소켓 통신을 구현하면 좀 더 간결하고 효율적인 코드를 작성할 수 있습니다. Promise의 then/catch를 통해 연결과 데이터 전송의 비동기 처리를 간편하게 할 수 있습니다.

#websockets #javascript