- Published On
Socket.IO 란?
Socket.IO 개요
Socket.IO
는 Node.js 기반의 실시간, 양방향 통신을 제공하는 강력한 라이브러리입니다.
WebSocket을 기반으로 하되, WebSocket을 지원하지 않는 환경에서는 자동으로 롱 폴링(long polling) 등으로 폴백(fallback)하는 유연한 구조를 갖고 있습니다.
주요 기능
- 실시간 통신: 클라이언트와 서버 간 실시간으로 데이터를 주고받을 수 있습니다.
- 이벤트 기반 아키텍처: 클라이언트와 서버 간 메시지 송수신이 간편하게 이벤트로 처리됩니다.
- 연결 상태 복구: 일시적인 네트워크 문제로 인해 연결이 끊겼을 경우, 자동으로 재연결하고 상태를 복구할 수 있습니다.
- 수평 확장: 다중 서버 환경에서도 작동 가능하며, 클러스터링을 통해 확장성이 뛰어납니다.
- 룸과 네임스페이스 지원: 특정 그룹의 사용자나 특정 기능을 위한 공간을 만들 수 있습니다.
기본 API 개요
Socket.IO
의 기본적인 동작 방식은 클라이언트-서버 간의 실시간 양방향 통신
입니다.
이를 위해 클라이언트와 서버 모두에서 emit()과 on() 메서드를 사용합니다.
emit()
은 이벤트와 데이터를 전송하는 메서드이고, on()
은 특정 이벤트가 발생했을 때 이를 수신하고 처리하는 메서드입니다.
두 메서드 모두 첫 번째 인자로 이벤트 이름을 받으며, 이 이벤트 이름은 클라이언트와 서버 모두에서 동일해야 통신이 원활하게 이루어집니다.
기본 데이터 전송
- 클라이언트에서 서버로 전송
socket.emit("hello", "world");
socket.emit()
은 클라이언트에서 서버로 이벤트와 데이터를 전송하는 역할을 합니다.
-
첫 번째 인자 "hello"는 이벤트 이름이며, 이 이름은 서버에서도 일치해야 합니다.
-
두 번째 인자 "world"는 서버로 보내는 데이터로, 문자열, 객체, 배열 등 다양한 형태가 가능합니다.
-
서버에서 클라이언트로
io.on("connection", (socket) => {
socket.on("hello", (arg) => {
console.log(arg); // 'world'
});
});
-
io.on("connection", ...)
은 새로운 클라이언트가 서버에 연결되었을 때 호출됩니다. 이 안에서 socket.on()을 사용하여 특정 이벤트를 수신하고 처리할 수 있습니다. -
socket.on("hello", (arg) => ...)
에서 "hello"는 이벤트 이름으로, 클라이언트의 emit("hello")와 일치해야 합니다. -
두 번째 인자인 arg는 클라이언트로부터 전달된 데이터("world")를 가리킵니다.
이벤트 확인
Socket.IO에서는 기본적으로 비동기 방식으로 데이터를 주고받지만, 응답을 확인하고 싶을 때는 콜백 함수를 사용할 수 있습니다. 이를 통해 서버에서 이벤트를 처리한 후 클라이언트에 응답을 보낼 수 있습니다.
socket.emit("request", { foo: "bar" }, (response) => {
console.log(response.status); // 'ok'
});
-
socket.emit("request", { foo: "bar" }, callback)
에서는 세 번째 인자로 콜백 함수가 제공됩니다. -
이 콜백 함수는 서버가 응답을 보낼 때 호출됩니다.
-
서버가 처리된 상태를 클라이언트에게 알릴 수 있으며, 여기서
response.status
는 서버에서 전송된 상태 메시지를 가리킵니다.
io.on("connection", (socket) => {
socket.on("request", (data, callback) => {
callback({ status: "ok" });
});
});
-
socket.on("request", (data, callback))
에서 세 번째 인자인 callback 함수는 클라이언트에서 제공한 함수입니다. -
서버는 데이터(data)를 처리한 후 callback을 호출하여 클라이언트에게 응답을 보냅니다. 여기서는
{ status: "ok" }
라는 객체를 클라이언트로 보내고 있습니다.
룸(Rooms)
룸(Rooms)
은 특정 그룹의 클라이언트만 이벤트를 수신하도록 할 수 있는 기능입니다.
예를 들어, 여러 채팅방에서 각 방에 속한 사용자들에게만 메시지를 전송할 때 사용할 수 있습니다.
io.on("connection", (socket) => {
socket.join("some room");
io.to("some room").emit("hello", "world");
});
-
socket.join("some room")
은 클라이언트를 "some room"이라는 이름의 룸에 참여시키는 코드입니다. -
io.to("some room").emit("hello", "world")
는 "some room"에 속한 클라이언트들에게만 "hello" 이벤트를 전송하며, "world"라는 데이터를 전달합니다. -
"some room"
은 룸의 이름이며, 클라이언트가 특정 룸에 속해야만 해당 이벤트를 받을 수 있습니다.
참고자료
다음 포스트
Next.js 커스텀 서버