Lorem ipsum dolor sit amet, consectetur adipiscing elit.
웹소켓이란?
웹소켓(WebSocket)은 클라이언트와 서버 간의 전이중(양방향) 통신을 가능하게 하는 프로토콜입니다. 기존의 HTTP 프로토콜은 클라이언트가 요청을 하고 서버가 응답을 하는 구조인 반면, 웹소켓은 클라이언트와 서버가 서로 자유롭게 메시지를 주고받을 수 있는 연결을 유지합니다. 이러한 특성 덕분에 실시간 데이터 전송이 필요한 어플리케이션에서 웹소켓은 매우 유용합니다. 예를 들어, 채팅 애플리케이션, 실시간 게임, 주식 시세 전송 앱 등에서 널리 사용됩니다.
Nest.js 소개
Nest.js는 Node.js를 기반으로 하는 현대적인 웹 애플리케이션 프레임워크입니다. Angular에서 영감을 받아 모듈 기반 아키텍처를 채택하고 있으며, TypeScript를 기본으로 지원합니다. Nest.js를 사용하면 구조화된 코드를 작성할 수 있어 유지보수와 확장성이 뛰어납니다. Nest.js는 웹소켓을 포함한 다양한 통신 프로토콜을 지원하여 실시간 애플리케이션 개발에 적합합니다.
Next.js 소개
Next.js는 React를 기반으로 한 프레임워크로, 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 기능을 제공합니다. 이를 통해 SEO에 유리하고 빠른 렌더링을 할 수 있는 장점이 있습니다. 또한, Next.js는 API 라우트 기능을 사용해 서버 측 로직도 간단히 작성할 수 있습니다. 이러한 특성 덕분에 Next.js는 실시간 애플리케이션을 개발하는 데 매우 유용합니다.
Nest.js에서 웹소켓 설정하기
Nest.js에서 웹소켓을 사용하는 방법은 다음과 같습니다. 먼저, 웹소켓 서버를 구현하기 위해 @nestjs/websockets 패키지를 설치합니다. 이를 통해 웹소켓의 기본적인 기능을 쉽게 사용할 수 있습니다.
설치
npm install @nestjs/websockets @nestjs/platform-socket.io socket.io
웹소켓 게이트웨이 만들기
다음으로, 웹소켓 게이트웨이를 생성합니다. 웹소켓 게이트웨이는 클라이언트의 요청을 받고 메시지를 송수신하는 역할을 합니다. 아래는 간단한 웹소켓 게이트웨이의 예입니다.
import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway()
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: any) {
console.log('클라이언트 연결됨');
}
handleDisconnect(client: any) {
console.log('클라이언트 연결 끊김');
}
sendMessage(message: string) {
this.server.emit('message', message);
}
}
위 코드에서 handleConnection
과 handleDisconnect
메서드는 각각 클라이언트가 연결되거나 연결이 끊어질 때 호출됩니다. sendMessage
메서드는 모든 클라이언트에게 메시지를 전송하는 기능을 수행합니다.
Next.js 클라이언트에서 웹소켓 연결하기
Next.js 클라이언트에서 웹소켓에 연결하기 위해 socket.io-client
라이브러리를 사용할 수 있습니다. 먼저 이 라이브러리를 설치해야 합니다.
설치
npm install socket.io-client
클라이언트 설정
먼저 Next.js 프로젝트의 페이지 컴포넌트에서 웹소켓 연결을 설정합니다. 아래는 기본적인 웹소켓 클라이언트 구현 예입니다.
import { useEffect } from 'react';
import { io } from 'socket.io-client';
const socket = io('http://localhost:3000');
const Home = () => {
useEffect(() => {
socket.on('message', (message) => {
console.log('서버로부터 받은 메시지:', message);
});
return () => {
socket.off('message');
};
}, []);
const sendMessage = () => {
socket.emit('message', '안녕하세요, 서버!');
};
return (
웹소켓 테스트
);
};
export default Home;
위 코드에서는 socket.io-client
를 사용하여 서버와의 웹소켓 연결을 설정하고 있습니다. 클라이언트가 연결되면 서버로부터 수신한 메시지를 콘솔에 출력합니다. 또한, 버튼을 클릭하면 서버에 메시지를 보낼 수 있습니다.
서버와 클라이언트 간의 데이터 송수신
이렇게 설정한 웹소켓 서버와 클라이언트 간에 실시간 데이터 송수신을 구현할 수 있습니다. 예를 들어, 클라이언트에서 메시지를 보내면 서버는 그 메시지를 처리하고 다시 클라이언트로 전달할 수 있습니다. 이 기능을 통해 다양한 실시간 애플리케이션을 개발할 수 있습니다.
서버에서 클라이언트로 데이터 전송
서버에서 클라이언트로 데이터 전송하는 예는 다음과 같습니다. 간단한 메시지를 전송하는 기능을 추가하여 클라이언트가 연결된 모든 클라이언트에게 매 5초마다 메시지를 전송해보겠습니다.
import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway()
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: any) {
console.log('클라이언트 연결됨');
}
handleDisconnect(client: any) {
console.log('클라이언트 연결 끊김');
}
broadcastMessage() {
setInterval(() => {
this.server.emit('message', '서버에서 전송한 메시지입니다.');
}, 5000);
}
}
위 코드의 broadcastMessage
메서드는 매 5초마다 모든 연결된 클라이언트에게 메시지를 전송합니다. 이 메서드를 constructor
내에서 호출하여 서버가 실행되면 자동으로 클라이언트에 메시지를 보내도록 설정할 수 있습니다.
에러 처리와 최적화
실시간 웹소켓 애플리케이션에서 에러 처리는 중요한 부분입니다. 발생할 수 있는 다양한 에러를 예방하고 사용자가 이해할 수 있도록 적절한 피드백을 제공해야 합니다. 클라이언트에서는 웹소켓 연결의 상태를 관리하고 에러를 처리할 수 있는 방법을 구현하는 것이 좋습니다.
클라이언트 에러 처리
useEffect(() => {
socket.on('connect_error', (err) => {
console.error('서버에 연결할 수 없습니다:', err.message);
});
socket.on('disconnect', (reason) => {
if (reason === 'io server disconnect') {
console.log('서버가 클라이언트를 연결 해제했습니다.');
// 자동 재연결 시도
socket.connect();
}
});
return () => {
socket.off('connect_error');
socket.off('disconnect');
};
}, []);
위 코드에서는 연결 오류와 연결 해제 시의 이벤트를 처리하고 있습니다. 이러한 처리를 통해 사용자가 문제를 인지하고 적절한 조치를 취할 수 있게 됩니다.
결론
Nest.js와 Next.js를 활용한 웹소켓 애플리케이션 개발은 실시간 기능 구현을 위해 매우 효과적입니다. 간단한 설정만으로 양방향 통신을 할 수 있으며, 이를 통해 다양한 기능을 추가할 수 있습니다. 이번 글을 통해 기본적인 웹소켓 사용법과 클라이언트-서버 간의 데이터 송수신 방법을 살펴보았습니다. 다양한 웹소켓 기능을 실험하여 더 나아가고, 실시간 애플리케이션을 더욱 풍성하게 만드는 데 도움이 되길 바랍니다.