인프런 커뮤니티 질문&답변

D_One님의 프로필 이미지
D_One

작성한 질문수

Node.js 교과서 - 기본부터 프로젝트 실습까지

스스로 해보기2(시스템 메시지 디비 저장)

질문이요

작성

·

153

0

방에들어가는 라우터에서요, 

const { rooms } = io.of('/chat').adapter;

이것을 통해서, 인원수를 구하잖아요.

정확히 adpater 가 무엇이고 어떻게 동작하는지 모르겠어요 

설명 좀 부탁드려요. 

 

그리고, 

제가 다른 종류 브라우저 말고도, 그냥 크롬창 여러개 띄어도 인원수가 오르더라구요. 

그래서,  

const { rooms } = io.of('/chat').adapter;
console.log(rooms)
console.log(rooms[req.params.id])

이런식으로 콘솔을 찍어 보았어요. 

실험 1. 

방을 한개 만들고, 새창 여러개로 같은 방 한개  들어가기

console.log(rooms) 결과값 :

{
'/chat#rC63n8xyVth_znN0AAAA': Room { sockets: { '/chat#rC63n8xyVth_znN0AAAA': true }, length: 1 },
'5d64e09b9b873811fc6be793': Room {
sockets: {
'/chat#rC63n8xyVth_znN0AAAA': true,
'/chat#Ion8Gy0D2IPHw2asAAAC': true,
'/chat#dW1lh61HDNDZgtUoAAAE': true,
'/chat#zyZAZfj99vt4o_qmAAAD': true,
'/chat#_zy1s7cDk6VzPKPwAAAF': true
},
length: 5
},
'/chat#h9tN1OVDzUCgOUVvAAAB': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 },
'5d64dd1a8d9e4c0d0fa953e7': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 },
'/chat#Ion8Gy0D2IPHw2asAAAC': Room { sockets: { '/chat#Ion8Gy0D2IPHw2asAAAC': true }, length: 1 },
'/chat#dW1lh61HDNDZgtUoAAAE': Room { sockets: { '/chat#dW1lh61HDNDZgtUoAAAE': true }, length: 1 },
'/chat#zyZAZfj99vt4o_qmAAAD': Room { sockets: { '/chat#zyZAZfj99vt4o_qmAAAD': true }, length: 1 },
'/chat#_zy1s7cDk6VzPKPwAAAF': Room { sockets: { '/chat#_zy1s7cDk6VzPKPwAAAF': true }, length: 1 }
}

console.log(rooms[req.params.id]) 결과값:

Room {
sockets: {
'/chat#rC63n8xyVth_znN0AAAA': true,
'/chat#Ion8Gy0D2IPHw2asAAAC': true,
'/chat#dW1lh61HDNDZgtUoAAAE': true,
'/chat#zyZAZfj99vt4o_qmAAAD': true,
'/chat#_zy1s7cDk6VzPKPwAAAF': true
},
length: 5
}
 

 

이렇게 나오면, 소켓 5 개가 사용됬다는걸 알 수 있던데요. 

 

실험 2  

방 A 를 만든다( 만들면 자동으로 들어가짐)

A 의 req.params.id 는 '5d64f4aab36b762d2becb422'

  console.log(rooms) 결과값 :

{}

console.log(rooms[req.params.id]) 결과값:

undefined

새창을 하나 열어서, 방 A 로 들어간다. 

 

  console.log(rooms) 결과값 :

{
'/chat#Dqd1TiXLKQZHEsjKAAAC': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 }
}

 

console.log(rooms[req.params.id]) 결과값:

Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true },
length: 1 }이 나옵니다. 

새창을 또 하나 열어서, 방 A 로 들어간다. 

  console.log(rooms) 결과값 :

{
'/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true
},
length: 2
},
'/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 }
}

console.log(rooms[req.params.id]) 결과값:

Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true
},
length: 2
}

 

지금 여기서 보면, 실질적으로 방 A에는 3 명의 인원이 들어가있는데 lenght 는 2로 나옵니다. 

 

그런데 특이하게

 방 B를 만들면, 방 A에 3 명이(옳은 인원수) 들어가 있다고 업데이트가 됩니다.

B 의 req.params.id 는 '5d64ecdedcd19c1e1979ad8b'

console.log(rooms) 결과값 :

{
'/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 },
'5d64f4aab36b762d2becb422': Room {
sockets: {
'/chat#B7ZV-1fDOnIVJzCzAAAA': true,
'/chat#bQybDCrRdzFs_AnsAAAB': true,
'/chat#P4zrqxRE0Sv_sJySAAAD': true
},
length: 3
},
'/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 },
'/chat#P4zrqxRE0Sv_sJySAAAD': Room { sockets: { '/chat#P4zrqxRE0Sv_sJySAAAD': true }, length: 1 }
}

console.log(rooms[req.params.id]) 결과값:

undefined

하지만, 방 B에는 인원이 1 명이 들어 있음에도 불가하고 , 

방 B의 정보는 찍히지가 않습니다. 

그리고 방 B에 새창으로 들어가면, 방 B에 1 이 뜹니다.

마찬가지로, 방 A 새창으로 들어가면, 

방 B에는 2명이라고 뜨고, 

방 A에는 4명이 떠야하는데 3명이라 뜹니다. 

 

이와 같이, 방에들어가면 바로 업뎃이 안되는데 이유좀 알 수있을까요??? 

이유 인즉슨,  5d64ecdedcd19c1e1979ad8b B의 req.params.id 값이 없고, A의 값에 소켓들이 추가 되더라구요  length 1에서 2 를 보실수 있듯이요. 

 

제가 정확히 

const { rooms } = io.of('/chat').adapter;

이게 어떤식으로 정보를 저장하는지 몰라서 그러는거같은데

설명좀 부탁드려요 . 

 

 

답변 3

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네 자동으로 추가됩니다. socket.io 라이브러리 내부에서 일어난다고 보시면 되고요.

소켓과 DB를 좀 더 적극적으로 사용하는 예제는 다음 장 경매시스템 만들기를 보시면 좋을 것 같습니다.

0

D_One님의 프로필 이미지
D_One
질문자

adapter.rooms 이요, 

그러면 따로 설정없이, 그냥 유저가 들어가면, 자동으로 정보가 추가 되는건가요??? 

현재코드에서 따로 adapter 에 넣어주는 코드를 볼 수 없는거 같아서요. 

 

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

adapter.rooms에는 그냥 그 방에 들어가 있는 소켓(소켓이 실제 사람과 1대1 대응이 되진 않습니다) 정보가 들어 있습니다. 소켓의 개수가 실제 인원과 일치할 수도, 아닐수도 있기 때문에 실제 채팅방 서비스를 하려면 회원 정보나 이런 것들을 DB에 저장해야 합니다. 지금 구현으로는 부정확할수밖에 없다고 생각하셔야 되겠습니다.

D_One님의 프로필 이미지
D_One

작성한 질문수

질문하기