![[HTML] ์น ์์ผ(WebSocket)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4k5dr%2FbtsGexbPlkO%2FkHvpXwMAXC3KDqRRAEWMc0%2Fimg.png)
๐ ์น ์์ผ(WebSocket)์ด๋ ๋ฌด์์ธ๊ฐ์?
์น ์์ผ์ ์ค์๊ฐ, ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ด์์. ์น ํ์ด์ง์ ์๋ฒ ๊ฐ์ ์ง์์ ์ธ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์. ์ด๋ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ , ์จ๋ผ์ธ ๊ฒ์, ์ค์๊ฐ ๊ฑฐ๋ ํ๋ซํผ ๋ฑ์์ ๋๋ฆฌ ์ฌ์ฉ๋ผ์.
์น ์์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์น ์ ํ ํตํ๋ฅผ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ ํ๋ฅผ ๊ฑธ๋ฉด ์๋๋ฐฉ๊ณผ ๋ฐ๋ก ๋ํ๋ฅผ ์์ํ ์ ์๋ฏ์ด, ์น ์์ผ์ ํตํด ์น ํ์ด์ง์ ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก '๋ํ'๋ฅผ ๋๋ ์ ์์ฃ . ์ด์ ์ ๊ธฐ์ ๋ค์ ๋ง์น ํธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ฒ๋ผ ์ผ๋ฐฉ์ ์ด๊ณ ๋๋ ธ์ง๋ง, ์น ์์ผ์ ์๋ฐฉํฅ ํต์ ์ ํตํด ์ ๋ณด๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ๊ตํํ ์ ์๊ฒ ํด ์ค์.
๐ฅ๏ธ ์น ์์ผ์ ์ฌ์ฉ
์น ์์ผ์ ์ฌ์ฉํ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์. ์ฌ์ฉ์์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์ํ๋ฉฐ, ๋ค์ํ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ์ ์๊ฒ ํด ์ค์.
1. ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์
- ์น ์์ผ์ ์ด์ฉํ๋ฉด ์ฌ์ฉ์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฃผ๊ณ ๋ฐ๋ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์. ์ฌ์ฉ์๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, ์น ์์ผ ์ฐ๊ฒฐ์ ํตํด ์ฆ์ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋ผ์.
// ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์์
const socket = new WebSocket('ws://example.com/chat');
socket.onmessage = function(event) {
console.log('๋ฉ์์ง ๋ฐ์:', event.data);
};
socket.send('์๋
ํ์ธ์!');
2. ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ
- ๊ธ์ต ์์ฅ ๋ฐ์ดํฐ, ์คํฌ์ธ ๊ฒฝ๊ธฐ ์ ์, ๋ ์จ ์ ๋ณด ๋ฑ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ๋ฐ์ดํฐ๋ฅผ ์น ํ์ด์ง์ ํ์ํ ์ ์์ด์. ์น ์์ผ ์ฐ๊ฒฐ์ ํตํด ์๋ฒ๋ก๋ถํฐ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ๋ฐ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์.
// ์น ์์ผ ์๋ฒ์ URL์ ์ง์ ํฉ๋๋ค.
const webSocketURL = 'wss://your-websocket-server.com';
// ์น ์์ผ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
const webSocket = new WebSocket(webSocketURL);
// ์น ์์ผ ์ฐ๊ฒฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฆฌ๋ฉด ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
webSocket.onopen = function(event) {
console.log('WebSocket ์ฐ๊ฒฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ ธ์ต๋๋ค.');
// ์๋ฒ์ ๋ฉ์์ง๋ฅผ ๋ณด๋
๋๋ค.
webSocket.send('ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋
๋๋ค.');
};
// ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
webSocket.onmessage = function(event) {
console.log('์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์์ต๋๋ค: ' + event.data);
};
// ์น ์์ผ ์ฐ๊ฒฐ์ด ๋ซํ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
webSocket.onclose = function(event) {
console.log('WebSocket ์ฐ๊ฒฐ์ด ๋ซํ์ต๋๋ค.');
};
// ์น ์์ผ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
webSocket.onerror = function(error) {
console.error('WebSocket ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค: ', error);
};
์ด ์ฝ๋๋ ์น ์์ผ ์๋ฒ์ ์ฐ๊ฒฐ์ ์๋ํ๊ณ , ์ฐ๊ฒฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉด ์๋ฒ์ ๊ฐ๋จํ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ๋ฉ์์ง๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
์ฐ๊ฒฐ์ด ๋ซํ๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
๐ค HTTP์ ์น ์์ผ ๋น๊ต
์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด, ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฃผ๋ก HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํด์. ๊ทธ๋ฌ๋ ์ค์๊ฐ ํต์ ์ด ํ์ํ ๊ฒฝ์ฐ, ์น ์์ผ์ด ๋ ์ ํฉํ ์ ์์ด์.
1. HTTP
- ์ฅ์ :
- ๋ฒ์ฉ์ฑ: ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ฉฐ, ๋๋ถ๋ถ์ ์น ์๋ฒ์ ํธํ๋ผ์.
- ๋จ์์ฑ: ์์ฒญ/์๋ต(request/response) ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์์.
- ์ํ๊ฐ ์์(Stateless): ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ์ง ์์์. ์ด๋ ์๋ฒ์ ๋ณต์ก์ฑ์ ์ค์ฌ์ค์.
- ๋จ์ :
- ๋นํจ์จ์ ์ธ ์ค์๊ฐ ํต์ : ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐ๊ธฐ ์ํด ํด๋ง(polling) ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ์ด๋ ๋คํธ์ํฌ ์์๊ณผ ์๋ฒ ์์์ ๋ง์ด ์๋ชจํด์.
- ํค๋ ์ค๋ฒํค๋: HTTP ์์ฒญ๋ง๋ค ํค๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํ๋ฉฐ, ์ด๋ ์ค์ ์ ์กํ๋ ค๋ ๋ฐ์ดํฐ๋ณด๋ค ํฌ๊ธฐ๊ฐ ํด ์ ์์ด์.
// HTTP ์์ฒญ์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์์ค๋ ์์
fetch('https://your-server.com/hello')
.then(response => response.text()) // ์๋ต์ ํ
์คํธ๋ก ๋ณํ
.then(text => console.log(text)) // ์ฝ์์ ๋ฉ์์ง ์ถ๋ ฅ
.catch(error => console.error('์๋ฌ ๋ฐ์:', error));
HTTP๋ ๊ฐ๋จํ๊ณ ๋๋ฆฌ ์ง์๋๋ ํต์ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์ ์๋ฒ์์ ์ฌ์ฉํ ์ ์์ด ์ ๊ทผ์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.
๊ทธ๋ฌ๋, ์ค์๊ฐ ๋ฐ์ดํฐ ๊ตํ์๋ ๋นํจ์จ์ ์ด๋ฉฐ, ๊ฐ ์์ฒญ๋ง๋ค ์ฐ๊ฒฐ์ ๋งบ๊ณ ๋๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ด ์์ ์ฌ์ฉ์ด ๋ ๋ง์์ง๋๋ค.
2. ์น ์์ผ
- ์ฅ์ :
- ์ค์๊ฐ ์๋ฐฉํฅ ํต์ : ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ง์์ ์ธ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์๋ฐฉํฅ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์.
- ๋ฎ์ ์ค๋ฒํค๋: ์ฐ๊ฒฐ์ด ํ ๋ฒ ์๋ฆฝ๋๋ฉด, ์ถ๊ฐ์ ์ธ HTTP ํค๋ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด, ํต์ ํจ์จ์ด ๋์์.
- ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก: ์ค์๊ฐ ์ฑํ , ์จ๋ผ์ธ ๊ฒ์, ์ค์๊ฐ ํ์ ๋๊ตฌ ๋ฑ ๋ค์ํ ์ค์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ์ ์์ด์.
- ๋จ์ :
- ๋ณต์ก์ฑ: ์น ์์ผ ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด HTTP ์๋ฒ๋ณด๋ค ๋ณต์กํ ์ ์์ด์.
- ํธํ์ฑ ๋ฌธ์ : ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ์ผ๋ถ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ ์น ์์ผ์ ์ง์ํ์ง ์์ ์ ์์ด์.
- ๋ณด์ ๊ณ ๋ ค์ฌํญ: ์ง์์ ์ธ ์ฐ๊ฒฐ์ ์ ์งํ๊ธฐ ๋๋ฌธ์, ๋ณด์์ ๋ ๋ง์ ์ฃผ์๊ฐ ํ์ํด์.
// ์น ์์ผ์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ ์ค์๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์์ค๋ ์์
const webSocket = new WebSocket('wss://your-websocket-server.com');
webSocket.onopen = function(event) {
console.log('์น ์์ผ ์ฐ๊ฒฐ ์ฑ๊ณต');
};
webSocket.onmessage = function(event) {
console.log('์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง:', event.data);
};
webSocket.onerror = function(error) {
console.error('์น ์์ผ ์๋ฌ ๋ฐ์:', error);
};
์น ์์ผ์ ์ค์๊ฐ, ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์ํ๋ฉฐ, ์ฐ๊ฒฐ ์ค๋ฒํค๋ ์์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋, ๊ตฌํ๊ณผ ๊ด๋ฆฌ๊ฐ ๋ ๋ณต์กํ๋ฉฐ, ๋ชจ๋ ํ๊ฒฝ์์ ์๋ฒฝํ๊ฒ ์ง์๋์ง ์์ ์ ์์ด, ๋ณด์๊ณผ ํธํ์ฑ์ ํน๋ณํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
๐จ ์ฃผ์ํ ์
- ๋ณด์: ์น ์์ผ์ ์ฌ์ฉํ ๋๋ ๋ณด์์ ์ ๊ฒฝ ์จ์ผ ํด์. ์ํธํ๋์ง ์์ ์ฐ๊ฒฐ(
ws://
) ๋์wss://
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํด์ผ ํด์. - ํธํ์ฑ: ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์์ผ์ ์ง์ํ์ง๋ ์์ผ๋, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ๋ ํ์ธํด์ผ ํด์.
๐ ๊ฒฐ๋ก
์น ์์ผ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์๊ฐ ํต์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ด์์. ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ๊ณ , ๋ค์ํ ์ค์๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ํด ์ค์. ์น ์์ผ์ ์ ์ ํ ์ฌ์ฉํ๋ค๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ํ์ฅํ ์ ์์ด์.
๐ ์ถ๊ฐ ์ ๋ณด
- ์น ์์ผ์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์ํ์ ๋ค๋ฉด, MDN Web Docs์์ ์์ธํ ์ ๋ณด๋ฅผ ์ฐพ์๋ณผ ์ ์์ด์.
'Front-end > HTML & CSS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] Position (0) | 2024.10.26 |
---|---|
[CSS] CSS ๋ฐฉ๋ฒ๋ก (1) | 2024.02.13 |
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!