Namespace

Namespace는 url에 지정된 위치에 따라 신호처리를 다르게하는 기술이다.

namespace는 각 고유한 이름이 있다.

서버와 클라이언트가 연결되면 실시간 데이터 공유가 가능하다. 그런데 socket을 그냥 사용하면 모든 데이터가 socket으로 들어가게 된다.

그럼 필요없는 메시지까지 받게 되는 낭비가 발생한다. 이런 문제점을 보안한 것이 namespace다.

즉, 특정 노드끼리만 연결해주는 것이 namespace다.

Namespace 예제코드

server

// goods namespace 생성
const goods = io.of("/goods");
// user namespace 생성
const user = io.of('/user');

goods.on('connection', (socket) => {
    // goods namespace 연결
})

user.on('connection', (socket) => {
    // user namespace 연결
})

io.of를 통해 namespace를 /goods/user로 나누어 지정해주었다.

네임스페이스의 연결처리는 제각각이기에 콜백을 따로 등록해준다.

이렇게 되면 namespace객체는 클라이언트에서 /goods /user 네임스페이스를 사용하는 소켓과만 통신하게 된다.

client

export const socketGoods = io("http://localhost:5000/goods", {
  autoConnect: false,
});

export const socketUser = io("http://localhost:5000/user", {
  autoConnect: false,
});

클라이언트에서는 각각 namespace와 연결하기 위해 url을 다르게 지정해준다.

그럼, socketGoods/goods namespace와 연결되고, socketUser/user namespace와 연결된다.

Namespace 종류

Main namespace

Main namespace는 /라고 부르며, 기본적으로 연결되는 namespace다.

인스턴스 io는 모든 메서드를 상속한다,

// 이벤트 수신
io.on("connection", (socket) => {
  // main namespace
})

// 이벤트 송신
io.sockets.emit("main", "main namespace")

Custom namespace

사용자 정의 namespace를 설정하기 위해선 서버측에서 of함수를 호출하면 된다.

const nsp = io.of("/custom-namespace");

nsp.on("connection", (socket) => {
  // custom namespace
})

nsp.emit("hi", "everyone!")

또한, 정규식을 사용해 namespace를 동적으로 생성할 수도 있다.

Namespace middleware

모든 socket에 대해 실행되는 함수로, 소켓과 다음 등록된 미들웨어로 실행을 선택적으로 조절 할 수 있다.

express의 미들웨어가 그러했든, next()를 이용해 다음 메소드로 넘길 수 있으며, 다른 미들웨어를 소켓 메서드 내에 선언해 사용할 수도 있다.

// main namespace
io.user((socket, next) => {
  // middle
  next();
})

// custom namespace
const middleTest = io.of("/middle");
middleTest.use((socket, next) => {
  // middle
  next();
})

Room

Room은 Namespace의 하위 개념이다. Namespace 안에 있는 socket들을 room으로 쪼개어 나눈 것이다. room에 대한 설명

정보

room은 서버 전용 개념이다. 즉, 클라이언트는 자신이 참여한 룸 목록에 접근할 수 없다.

각 클라이언트들은 socket을 가지게 되며, 이 socket은 namespace를 가지고, 각 namespace는 room을 가진다.

Room 예제 소스

io.on("connection", (socket) => {
  socket.join("some room");

  socket.to("some room").emit("join", {})

  socket.on("disconnect", () => {
    socket.leave("some room")
  })
});
  • join(): 특정 room 에 참여
  • to(): 특정 room에게만 이벤트를 전달하기 위해 설정
  • leave(): 떠날 room 지정


참고 자료

댓글남기기