(김유선) 중고거래 사이트를 SPA로 만들기 11일차 - 웹소켓 기능

2024. 4. 19. 23:43프로젝트

앞으로 남은 기능이 내 채팅, 내 상점 등이 있지만 그것들은 시간만 있다면 딱히 하기에 어려운 것은 아니고 당장 시간이 없기에 채팅 기능만 구현하고 마무리하려 한다.

 

채팅 기능을 만들어줘야 하는데, 양방향 통신이 필요하므로 html 통신이 아닌 웹 소켓 통신을 이용하겠다.

나는 socket.io 라이브러리를 사용해서 웹 소켓 통신이 가능하게 만들었다.

 

먼저 상품 상세 페이지를 클릭하면

이렇게 상품 상세창이 보이는데, 저기서 채팅하기를 누르면 판매자인 하이요 닉네임을 가진 사람과 요청.user의 대화방이 하나 만들어진다(물론 로그인을 안한 상태라면 채팅하기를 눌렀을 때 로그인 페이지로 이동한다).

이렇게.

 

그래서 로그인을 한 상태라면

이렇게 창을 하나 띄워주고, 

유저가 보낼 값을 입력하고 보내기를 누르면 화면에 보낸 값이 뜬다.

중요한 것은 채팅방에 있는 다른 유저가 보내기를 눌렀을 때 그 값도 이 창에 뿌려줘야 하는 것이다.

그리고 채팅방에 있는 두 명 외에는 다른 이들에게는 이 데이터를 뿌려주지 않는다.

 

그렇게 해서 작성한 코드는 다음과 같다.

 

<서버>

io.on('connection', (socket)=>{ //연결되면
  console.log('소켓 연결됨')
 
  socket.on('room',async(data)=>{ // 누구한테 room이라는 이름으로 요청 받으면 데이터 이름의 방에 넣어줌
    socket.join(data) // data 룸에 넣어줌
  })

  socket.on('message', async(data)=>{ // 누구한테 메시지 받으면
    io.to([data.writer, data.user]).emit('chatting', data.text) // 이 대화방에만 data.text 보내줌 
    await db.collection('chat').insertOne({
      room : [data.writer, data.user],
      writer : data.user,
      text : data.text
    })
  })
})

 

<html>

const socket = io()
                        socket.emit('room', [click_writernick, firstdata.user.nickname])
                        console.log([click_writernick, firstdata.user.nickname][1])
                        $.get('/userchat')
                        .done(function(userchat){
                            console.log(userchat.chat.room.includes([click_writernick, firstdata.user.nickname]))
                        })
                        $('.chat_container').html(`
                        <div class="chat_close">x</div>
                        <div class="chat_list">
                        </div>
                        <div class="form">
                            <input class="chat_input" type="text" name="" id="">
                            <input class="chat_submit" type="submit" value="보내기">
                        </div>
                        `)
                       
                        socket.on('chatting', (data) => {
                            $('.chat_list').append(`<div class="chat_box">
                                <p>${data}</p>
                            </div>`)
                        })
                        $('.chat_submit').click(function(){
                            socket.emit('message', {text : $('.chat_input').val(), writer : click_writernick, user : firstdata.user.nickname})
                        })

 

아직 디비를 띄워주지는 못했지만, 어차피 나중에 웹소켓을 또 사용하게 될 거라 생략하도록 하겠다.

 

이상으로 끗.