Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 리액트
- map()에는 key값이 필요
- React
- 클래스 추가하기 #특정 url 클래스 추가 #사이트 접속시 클래스 추가 #오공완 #javascript
- 오공완
- 오공완 #리액트 공부 #React
- 리스트랜더링
Archives
- Today
- Total
new_bird-hyun
Next.js와 WebSocket을 활용한 실시간 채팅 애플리케이션 구현 본문
- WebSocket을 활용한 실시간 데이터 송수신 원리
- Next.js에서 WebSocket을 활용하여 채팅 기능 구현
- Zustand를 사용하여 WebSocket 메시지를 상태로 관리
npm install zustand ws
server.js (WebSocket 서버)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('새 클라이언트가 연결되었습니다.');
ws.on('message', (message) => {
console.log(`받은 메시지: ${message}`);
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
ws.on('close', () => console.log('클라이언트 연결 종료'));
});
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('새 클라이언트가 연결되었습니다.');
ws.on('message', (message) => {
console.log(`받은 메시지: ${message}`);
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
ws.on('close', () => console.log('클라이언트 연결 종료'));
});
store/useChatStore.js (Zustand를 활용한 채팅 상태 관리)
import { create } from 'zustand';
const useChatStore = create((set) => ({
messages: [],
addMessage: (msg) => set((state) => ({ messages: [...state.messages, msg] })),
}));
export default useChatStore;
const useChatStore = create((set) => ({
messages: [],
addMessage: (msg) => set((state) => ({ messages: [...state.messages, msg] })),
}));
export default useChatStore;
components/Chat.js (WebSocket 채팅 클라이언트)
'use client';
import { useEffect, useState } from 'react';
import useChatStore from '../store/useChatStore';
export default function Chat() {
const [message, setMessage] = useState('');
const addMessage = useChatStore((state) => state.addMessage);
const messages = useChatStore((state) => state.messages);
useEffect(() => {
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = (event) => {
addMessage(event.data);
};
return () => socket.close();
}, [addMessage]);
const sendMessage = () => {
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
socket.send(message);
setMessage('');
};
};
return (
<div>
<h2>실시간 채팅</h2>
<div>
{messages.map((msg, index) => (
<p key={index}>{msg}</p>
))}
</div>
<input
type="text"
value={message}
onChange={(e) => setMessage(e.target.value)}
placeholder="메시지를 입력하세요"
/>
<button onClick={sendMessage}>전송</button>
</div>
);
}
import { useEffect, useState } from 'react';
import useChatStore from '../store/useChatStore';
export default function Chat() {
const [message, setMessage] = useState('');
const addMessage = useChatStore((state) => state.addMessage);
const messages = useChatStore((state) => state.messages);
useEffect(() => {
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = (event) => {
addMessage(event.data);
};
return () => socket.close();
}, [addMessage]);
const sendMessage = () => {
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
socket.send(message);
setMessage('');
};
};
return (
<div>
<h2>실시간 채팅</h2>
<div>
{messages.map((msg, index) => (
<p key={index}>{msg}</p>
))}
</div>
<input
type="text"
value={message}
onChange={(e) => setMessage(e.target.value)}
placeholder="메시지를 입력하세요"
/>
<button onClick={sendMessage}>전송</button>
</div>
);
}
app/page.js
import Chat from '../components/Chat';
export default function Home() {
return (
<div>
<Chat />
</div>
);
}
export default function Home() {
return (
<div>
<Chat />
</div>
);
}
WebSocket을 활용하면 실시간 채팅과 같은 기능을 쉽게 구현 가능
'코딩 공부' 카테고리의 다른 글
Next.js에서 SSE(Server-Sent Events)와 Zustand를 활용한 실시간 알림 배지 시스템 구현 (0) | 2025.03.19 |
---|---|
Next.js에서 Server-Sent Events(SSE)와 WebSocket 비교 및 실시간 데이터 처리 (0) | 2025.03.17 |
Next.js에서 Zustand와 SWR을 활용한 실시간 데이터 동기화 전략 (0) | 2025.03.14 |
Zustand와 서버 컴포넌트(Server Components)를 결합하여 상태 관리 최적화하기 (0) | 2025.03.12 |
Next.js에서 OAuth + RBAC(역할 기반 접근 제어) 구현하기 (0) | 2025.03.09 |