μΉμμΌμ νμ©ν΄ μ€μκ° μ±ν ꡬννκΈ° - React
μΉμμΌμ νμ©ν΄ μ€μκ° μ±ν
ꡬννκΈ° - Springboot
μΉμμΌμ νμ©ν΄ μ€μκ° μ±ν
ꡬννκΈ° - React
React μ½λ
μ¬μ€ μΉμμΌμμ λ°±μλλ μ€κ°μν λ§ νκ³ λλΆλΆμ μμ (μΉμμΌ κ°μ²΄ μμ±, μ°κ²°, λ°μ΄ν° μ‘μμ )μ νλ‘ νΈμμ μ΄λ£¨μ΄μ§λ€.
μλ μ½λλ μΉμμΌμ κΈ°λ°μΌλ‘ κ°λ¨ν μ€μκ° μ±ν μ ꡬνν νλ‘ νΈ μ½λμ΄λ€.
ν΄λΉ μ½λλ λ©μΈμ§λ₯Ό μ£Όκ³ λ°μ§λ§ κ²°κ΅ λ¬΄μμ΄ λλ μΉμμΌμΌλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μ리λ λκ°μμ, μ½λλ₯Ό λ³ννλ©΄ ν¨μ¬ λ€μν κΈ°λ₯λ€μ ꡬνν μ μλ€.
μμ½κ²λ λ΄κ° νλ‘ νΈκ° μλλΌ λ°λ‘ λμμΈμ λ£μ§ μμλ€.
μ€μ νλ‘μ νΈμμ μ¬μ©νλ μ½λλ₯Ό κ°μ Έμ¨ κ±°λΌ λ€λ₯Έ νλ‘μ νΈμ μ μ©ν κ²½μ° μ μ ν λ³νν΄μ μ¬μ©νλ©΄ λλ€.
μ½λ λλΆλΆμ μ£Όμμ΄ λ¬λ €μμ΄μ μμΈν μ€λͺ μ μλ΅.
import { React, useRef, useState, useEffect } from 'react'
import * as StompJs from '@stomp/stompjs'
const WebSocketChatTest = () => {
const client = useRef({})
const [chatList, setChatList] = useState([])
const [message, setMessage] = useState('')
// μμλ‘ μ€μ ν΄λ μΈμ λ³μ (λμ€μ νλ‘ νΈμμ λ£μ΄μ£ΌμΈμ)
const chatRoomSeq = 1
const senderSeq = 1
const receiverSeq = 2
useEffect(() => {
connect()
return () => disconnect()
}, [])
// connect: μΉμμΌ(stomp) μ°κ²°
const connect = () => {
// stomp js client κ°μ²΄ μμ±
client.current = new StompJs.Client({
brokerURL: 'ws://localhost:8080/ws-stomp', // μ°κ²°ν url(μ΄νμ localhostλ λ°°ν¬ λλ©μΈμΌλ‘ λ°κΏμ£ΌμΈμ)
// μ°κ²° νμΈμ© μΆλ ₯ 문ꡬ
debug: function (str) {
console.log(str)
},
// μλ¬ λ°μ μ μ¬μ°κ²° μλ λλ μ΄
reconnectDelay: 5000,
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000,
// μ°κ²° μ
onConnect: () => {
console.log('success')
subscribe() // λ©μΈμ§(μ±ν
)μ λ°μ μ£Όμλ₯Ό ꡬλ
ν©λλ€.
},
// μλ¬ λ°μ μ λ‘κ·Έ μΆλ ₯
onStompError: (frame) => {
console.log(frame)
},
})
// client κ°μ²΄ νμ±ν
client.current.activate()
}
// subscribe: λ©μΈμ§ λ°μ μ£Όμ ꡬλ
const subscribe = () => {
// ꡬλ
ν μ£Όμλ‘ λ©μΈμ§ λ°μ μ μ΄λ²€νΈ λ°μ
// (/sub: μΉμμΌ κ³΅ν΅ κ΅¬λ
μ£Όμ), (/chat: κΈ°λ₯λ³(1:1, 3:3, μΉκ΅¬ μΆκ°ν) ꡬλ
μ£Όμ), (/chatRoomSeq: νμ ꡬλ
μ£Όμ(μ±ν
λ°©))
client.current.subscribe('/sub/chat/' + chatRoomSeq, (body) => {
// λ°μμ¨ μ μ΄μ¨ νμ±
const json_body = JSON.parse(body.body)
console.log('λ©μΈμ§ λ°μλΉ') // νμΈμ© μΆλ ₯ (μ΄μ²λΌ λ©μΈμ§ μλ Ή μ νΉμ μ΄λ²€νΈλ₯Ό λ°μ μν¬ μ μμ΅λλ€.)
console.log(body.body)
// λ°μμ¨ μ±ν
μ±ν
리μ€νΈμ λ£κΈ° (μ΄λΆλΆμ μμλ‘ ν κ±°κ³ μ΄ν νλ‘ νΈμμ νμμ λ°λΌ λ°μμ¨ λ©μμ§λ₯Ό λ λλ§ νλ©΄ λ©λλ€.)
setChatList((_chat_list) => [
..._chat_list,
json_body.senderSeq,
json_body.message,
json_body.createdAt,
])
})
}
// publish: λ©μΈμ§ 보λ΄κΈ°
const publish = (message) => {
// μ°κ²°μ΄ μλμ΄μμ κ²½μ°
if (!client.current.connected) {
alert('μ°κ²°μ΄ μ λμ΄μμ΄')
return
}
// μ
λ ₯λ λ©μΈμ§κ° μλ κ²½μ°
if (!message) {
alert('λ©μΈμ§ μ
λ ₯ ν΄')
return
}
// λ©μΈμ§λ₯Ό 보λ΄κΈ°
client.current.publish({
// destination: λ³΄λΌ μ£Όμ
// (/pub: μΉμμΌ κ³΅ν΅ λ°μ μ© μ£Όμ), (/send: κΈ°λ₯λ³ κ°λ³ λ°μ μ© μ£Όμ)
destination: '/pub/send',
// body: λ³΄λΌ λ©μΈμ§
body: JSON.stringify({
message: message,
chatRoomSeq: chatRoomSeq,
senderSeq: senderSeq,
receiverSeq: receiverSeq,
}),
})
// 보λ΄κ³ λ©μΈμ§ μ΄κΈ°ν
setMessage('')
}
// disconnect: μΉμμΌ μ°κ²° λκΈ°
const disconnect = () => {
console.log('μ°κ²°μ΄ λμ΄μ‘μ΅λλ€')
client.current.deactivate()
}
// handleChage: μ±ν
μ
λ ₯ μ stateμ κ° μ€μ
const handleChange = (event) => {
setMessage(event.target.value)
}
// handleSubmit: 보λ΄κΈ° λ²νΌ λλ μ λ 보λ΄κΈ°(publish μ€ν)
const handleSubmit = (event, message) => {
event.preventDefault()
publish(message)
}
// μλλ ν
μ€νΈλ₯Ό μν΄ μμλ‘ μμ±ν ν
νλ¦ΏμΌλ‘ μ΄νμ νμμ λ°λΌ ν
νλ¦Ώμ μμ±ν΄μ£ΌμΈμ
return (
<div>
<div className={'chat-list'}>
{chatList.map((item, index) => {
return <div key={index}>{item}</div>
})}
</div>
<form onSubmit={(event) => handleSubmit(event, message)}>
<div>
<input
type={'text'}
name={'chatInput'}
onChange={handleChange}
value={message}
/>
</div>
<input type={'submit'} value={'λ©μΈμ§ 보λ΄κΈ°'} />
</form>
</div>
)
}
export default WebSocketChatTest
'β Personal_Study > Javascript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
AJAX (0) | 2022.11.05 |
---|---|
Axios (0) | 2022.11.05 |
λκΈ°μ λΉλκΈ° (0) | 2022.11.04 |
Callback & Promise (0) | 2022.11.04 |
JavaScriptμμμ This (0) | 2022.11.03 |
λκΈ