socket.io - boostcamp-2020/Project12-B-Slack-Web GitHub Wiki
socket.io ๋์ ๊ณ๊ธฐ
์ ํฌ ํ๋ก์ ํธ black์ ์ค์๊ฐ ํ๋ซํผ์ ๋๋ค.
๊ทธ๋ ๊ธฐ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ์ฐ๋๋ ์ ์๋ ๊ธฐ๋ฅ์ด ํ์ํ๊ณ ์ด๋ฅผ ์ํด ๋์ ํ ๊ฒ์ด socket.io์์ต๋๋ค.
socket.io๋ฅผ ํ์ฉํ๋ฉด์ ๋ง์ ๊ณ ๋ฏผ์ ํ๋ ๋ถ๋ถ์ ํฌ๊ฒ 3๊ฐ์ง๋ก ํ๋ฆ, ๊ตฌ์กฐํ, ๊ถํ ์ธ์ฆ ๋ฐ ์ฐ๊ฒฐ ๋ฐฉ์์ด์์ต๋๋ค.
socket.io ํ๋ฆ
connection event
black ์น์ฌ์ดํธ์ ์ ์ํ๋ฉด ํด๋น ์ ์์๋ ์์ ์ด ์ํ ์ฑํ ๋ฐฉ์ ์๋ก์ด ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ์ต๋๋ค.
์ด๋ฅผ ์ํด ์ต์ด๋ก socket์ด connection ์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น socket์ ํด๋น ์ฌ์ฉ์๊ฐ ์ฐธ์ฌํ๊ณ ์๋ ๋ชจ๋ ์ฑํ ๋ฐฉ์ room์ joinํ ์ ์๋๋ก ์ค์ ํ์ต๋๋ค.
๋ํ ํน์ ๊ฐ์ธ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ DM ๋ํ black์์๋ ๋ถ๋ฅ์ ์ฑํ ๋ฐฉ์ด๋ผ room์ join์ ํฉ๋๋ค. ์ด ๋ ๋ค๋ฅธ ์ ์ ์ ์ํด DM์ด ๋ง๋ค์ด์ง ์ฌ์ฉ์๋ ํด๋น DM์ ์์ฑ ์ฌ๋ถ๋ฅผ ํ์ ํด์ ํด๋น room์ joinํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ์ต๋๋ค. ์ด๋ฅผ ์ํด socket ์ฐ๊ฒฐ์ ์ฌ์ฉ์์ user id์ socket id๋ฅผ DB์ ์ ์ฅํ๋๋ก ํ์์ผ๋ฉฐ ๊ฐ์ ์ฌ์ฉ์์ฌ๋ ๋ค๋ฅธ ํญ์ธ ๊ฒฝ์ฐ socket id๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๋์ user๋ ์ฌ๋ฌ socket id๋ฅผ ๊ฐ์ง ์ ์๋๋ก DB์ ์ ์ฅํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ด๋ฆฌ๋ฅผ ์ํด ํด๋น socket์ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ฉด DB์ ์ ์ฅ๋ userid์ socket id๊ฐ ์ญ์ ๋๋๋ก ์ค์ ํ์ต๋๋ค.
message event
๋ฉ์์ง๋ฅผ ์๋กญ๊ฒ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ํ event์ ๋๋ค.
๋ฉ์์ง ์์ฑ์ ์ํ event๋ฅผ ์๋ฒ์ธก์์ ๋ฐ์ผ๋ฉด ์๋ฒ๋ ํด๋น ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ์๋กญ๊ฒ ์์ฑ๋ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์๊ฒ๋ ๋ชจ๋ ๋ณด๋ด์ฃผ๋๋ก ์ค์ ํ์ต๋๋ค.
์ด ๋ ์๋ฒ์ธก์์ emit์ ํ ๋ ํด๋น ์ฑํ ๋ฐฉ์๋ง emitํ ์ ์๋๋ก ์ค์ ํ์ต๋๋ค.
๋๋จธ์ง event๋ ์ด์ ๋น์ทํ ํ๋ฆ์ผ๋ก ์์ฑ๋์ด ์์ต๋๋ค. ์ด์ ๊ด๋ จํด black์ socket.io์ ๊ด์ฌ์ด ์์ผ์๋ฉด socket.io ๋ช ์ธ์๋ฅผ ์ฐธ์กฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
socket.io ํจํด
์ ์ฒด์ ์ธ ํจํด
์ฒ์ socket.io๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ ๋ ๊ฐ์ฅ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ๊ตฌ์กฐ์์ต๋๋ค. socket.io์ ๊ด๋ จํ ์ฝ๋๋ฅผ ํ๋์ ํ์ผ์ ์ ๋ถ ๋ฃ์๋ ๊ฐ๋ ์ฑ ๋ฉด์์ ์ข์ง ์๋ค๊ณ ํ๋จ์ ํ์ต๋๋ค. ๋ํ event์ ๊ด๋ จํด์ ํ์ผ์ ๋๋๋ค ํ๋๋ผ๋ event ๋๊ธฐ ์ฝ๋ โ ์ฒ๋ฆฌ ์ฝ๋ โ ๋น์ฆ๋์ค ๋ก์ง ์ฝ๋๊ฐ ๋ชจ๋ ํ ๊ณณ์ ํฌํจ๋๋ ๊ฒ์ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ์ข์ง ์์ผ๋ฆฌ๋ผ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ฝ๋๋ฅผ ๋๋ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด์ ๋ง์ ๊ฒ์์ ํด๋ณด์์ผ๋ ๋์ฒด๋ก ๋ง์ ์ฝ๋๋ค์ ํ๋์ ํ์ผ์ ์ ๋ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
์ด์ ๊ด๋ จํด์ ์ค์ค๋ก ๊ตฌ์กฐํ๋ฅผ ํด์ผ๊ฒ๋ค๋ ํ๋จ์ ํ๊ณ ํ์ ์ฌ์ฉํ๋ mvc๊ตฌ์กฐ์์ ํํธ๋ฅผ ์ป์ด์ ํ์ฉํ์ต๋๋ค.
event์์ ํด๋น ์ด๋ฒคํธ๋ง์ on์ผ๋ก ๋ฑ๋กํ๋ฉฐ handler์์ ์ด๋ฒคํธ์ ํ์ํ ์๋น์ค ํธ์ถ ๋ฐ ์๋ต, ๊ทธ๋ฆฌ๊ณ service์์ ๋น์ฆ๋์ค ๋ก์ง๋ง์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ตฌ์กฐํ๋ฅผ ํ์์ต๋๋ค.
์ธ์ฆ ๋ฐ ์ฐ๊ฒฐ ๋ฐฉ์
๊ถํ ์ธ์ฆ
socket.io๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ถํ์ ์ธ์ฆํด์ ๊ถํ์ด ์๋ ์ฌ์ฉ์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ถํ์ ํ์ธํด์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์์์ผํ ํ์๊ฐ ์์์ต๋๋ค.
black์ ๊ธฐ์กด express์์ JWT์ธ์ฆ ๋ฐฉ์์ ์ด์ฉํ๊ณ ์์ต๋๋ค.
API๋ฅผ ํตํ login์ ํ๋ฉด์ ์ฌ์ฉ์๊ฐ ๋ฐ์ JWT๋ฅผ ์ด์ฉํ์ฌ socket.io๋ฅผ ํตํ ํต์ ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค.
์ด๋ฅผ ์ด๋ฃจ๊ธฐ socket.io์ middleware๋ฅผ ์ฅ์ฐฉํ๊ณ ํด๋น middleware์์ ๊ถํ ์ธ์ฆ ๋ฐ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ๋ํ ์ ์๋๋ก ์ฒ๋ฆฌํ์ต๋๋ค.
//client
const socket = io(socketURL, {
transportOptions: {
polling: {
extraHeaders: {
Authorization: 'token'
}
}
}
});
๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์์ ํ ๋ฒ์ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์์ต๋๋ค.
์ต์ด์๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํตํด ํ๋ํ JWT๋ฅผ socket.io์ extra header๋ฅผ ํตํด ๋ณด๋ด๋ ๊ฒ์ผ๋ก ๊ตฌํํ์ต๋๋ค. ์ค์ ๋ก ์ ๋์ํ๊ณ ๋ฌธ์ ๊ฐ ์๋ ์ค ์์์ต๋๋ค.
์ฐ๊ฒฐ ๋ฐฉ์
๊ทธ๋ฌ๋ ๊ธฐ์ ์ธ๋ฏธ๋ ๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๊ธฐ ์ํด black์ ํ๋ณดํ๋ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
honux: "๋คํธ์ํฌ ํญ์ ์ฐ๊ฒฐ ๋ฐฉ์์ด polling์ด๋ websocket ๋ ๋ค ์๋ค์? ์ ๋ ๊ฐ ๋ค ์์๊น์? ์ด๋ ๊ฒ ๋๊ฐ๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์์๊น์?"
*polling๊ณผ websocket์ด ํจ๊ป ์ฌ์ฉ๋๊ณ ์์์ต๋๋ค.*
์ด ์ง๋ฌธ์ ๋ฐ๋ ์๊ฐ ๋ฐ๋ก ๋๋ ๊ฒ์ ์ ๋๋ก socket.io์ ์ดํดํ๋ฉด์ ์ฌ์ฉํ๊ณ ์์ง ์๋๋ค์์ต๋๋ค. transport ๋ฐฉ์์ ์๊ฐํ์ง ์๊ณ default๋ก ๋์ํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๋ช ํํ ๋ต๋ณ์ ํ ์ ์๋ ์ํฉ์ด์์ต๋๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด ์ฐ๊ฒฐ ๋ฐฉ์์ ๋ํ ๊ณต๋ถ๋ฅผ ๋ค์ ์์ํ์ต๋๋ค.
- polling: ์ ํฌ๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํ๋ฒํ http request๋ฅผ ์๋ฒ๋ก ๊ณ์ ๋ ๋ ค์ ์ด๋ฒคํธ ๋ด์ฉ์ ์ ๋ฌ๋ฐ๋ ๋ฐฉ์์ ๋๋ค. ๊ณ์์ ์ผ๋ก request๋ฅผ ๋ ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถ๋ด์ด ํฐ ํธ์ ๋๋ค.
- long polling: ํด๋ผ์ด์ธํธ์์ ์ผ๋จ ์๋ฒ๋ก http request๋ฅผ ๋ณด๋ ๋๋ค. ์ด์ํ๋ก ๊ณ์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์๋ฒ์์ ํด๋น ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ ์ด๋ฒคํธ๊ฐ ์๋ค๋ฉด ๊ทธ์๊ฐ response ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ฉด์ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋ฉ๋๋ค.
- streaming: ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ฐ๊ฒฐ์ ๋์ง ์๊ณ ํ์ํ ๋ฉ์ธ์ง๋ฅผ ๊ณ์ ์ ๋ฌํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปค๋ฅ์ ์ ๋งบ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ถ๋ด์ด ์ค์ด๋ญ๋๋ค.
- websocket
์น ์์ผ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ ์ด์ค ํต์ ์ ์ง์ํ๊ธฐ ์ํ ํต์ ํ๋กํ ์ฝ์ ๋๋ค.
์ฐ๊ฒฐ ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค.
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ ์ด์ค ํต์ ์ ์ํํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก HTTP UPGRADE ์์ฒญ์ ๋ณด๋ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์น ์์ผ ํ๋กํ ์ฝ ํธ๋ ์์ดํฌ๋ผ๊ณ ํฉ๋๋ค.
2. ์๋ฒ๊ฐ ์ปค๋ฅ์
์ UPGRADE ํ ์ ์๋ ๊ฒฝ์ฐ, HTTP 101 ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋
๋๋ค. ์๋ฒ๋ ํธ๋ ์์ดํฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์๋ค๊ณ ํ๋จํ๊ณ , ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์ปค๋ฅ์
์ ์น ์์ผ ํ๋กํ ์ฝ๋ก UPGRADE ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ HTTP 101 ์๋ต์ด ์ ๋ฌ๋๋ ์๊ฐ, ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์ปค๋ฅ์
์ HTTP ํ๋กํ ์ฝ์ด๋ผ๊ณ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ์ค ์ด์๊ฐ ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.
3. ์น ์์ผ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ ์ปค๋ฅ์
์ ๋๋ ์์ฒญ์ ์ ์กํ ์ ์์ต๋๋ค.
์ฆ ์์ ์ค๋ช
ํ ๋ค๋ฅธ ๋จ๋ฐฉํฅํต์ ์ ์ด๋ป๊ฒ๋ ์ด์ฉํด์ ์ค์๊ฐ ํต์ ์ ๊ตฌํํ ๋ฐฉ์์์ ๋ฒ์ด๋ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉด์ ์๋ฐฉํฅ ํต์ ์ ์ง์ํ ์ ์๋ ํ๋กํ ์ฝ์
๋๋ค.
์ด๋ฌํ ์ฐ๊ฒฐ๋ฐฉ์์์ websocket์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ ์๋์ ๋ถํ๋ฉด์์ ๋น์ฐํ๊ฒ ๋ณด์๊ณ , ๊ธฐ์กด์ ์ฌ์ฉํ๋ polling ๋ฐฉ์์์ websocket์ผ๋ก ์ฐ๊ฒฐ์ ํ ์ ์๋๋ก ์ ํ์ ์๋ํ์ต๋๋ค.
// client
const socket = io(socketURL, {
transports:['websocket','polling']
transportOptions: {
polling: {
extraHeaders: {
Authorization: 'token'
}
},
websocket: {
extraHeaders: {
Authorization: 'token'
}
}
}
});
๊ทธ๋ฌ๋ ์ด ์ฝ๋์์ socket.io ๋ ์๊ฐ๋๋ก ๋์๋์ง ์์์ต๋๋ค.
๊ธฐ์กด์ extraheader๋ก Authorization์ ๋ถ์ฌ์คฌ์๋๋ฐ ์ด๋ ๋งค๋ฒ request๊ฐ ๋ณด๋ด์ง๋ polling ๋ฐฉ์์์๋ง ์ง์๋๋ ๋ฐฉ์์ด์์ต๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ก์ง์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์์ต๋๋ค.
๋ค์ ๊ถํ ์ธ์ฆ
websocket์์ ๊ถํ ์ธ์ฆ์ ํ ์ ์๋๋ก ์๋กญ๊ฒ ๋์ ํ ๋ฐฉ์์ query string์ด์์ต๋๋ค. query string์ผ๋ก ํ ํฐ์ ์ ๋ฌ๋ฐ์ผ๋ฉด middleware์์ websocket handshake๋ ๋ฐ์ query๋ฅผ ์ด์ฉํด ์ ํจ ๊ฒ์ฌ๋ฅผ ํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
//client
const socket = io(socketURL, {
query: { token: window.localStorage.getItem('token') },
transports: ['websocket', 'polling']
});
//server socket middleware
const jwtMiddleware = (io) => {
const wrap = (middleware) => (socket, next) => {
const { request } = socket;
const { token } = socket.handshake.query;
request.headers.authorization = token;
middleware(request, {}, next);
};
io.use(wrap(passport.authenticate('jwt', { session: false })));
};
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ฑ๊ณต์ ์ผ๋ก websocket์ ์ด์ฉํ ์ค์๊ฐ ํต์ ์ ํ ์ ์๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์๋ฒ์ ๋ถํ๋ฅผ ์ค ์ ์๋ polling ๋ฐฉ์์ด network tab์์ ์ฌ๋ผ์ง๊ณ websocket๋ง์ผ๋ก ํต์ ํ ์ ์๊ฒ ๋์์ต๋๋ค.
๋๋ ์
ํด๋น ๊ธฐ์ ํ๋ก์ ํธ๋ฅผ ์ ํํ๊ฒ ๋ ์ด์ ์ค ํ๋๋ socket.io์ด์์ต๋๋ค.
(๋๋จธ์ง ํ๋๋ ๋์ปค ์ฟ ๋ฒ๋คํฐ์ค์ ๋๋ค.)
๋ฐฑ์๋, ๋คํธ์ํฌ์ ํ์ ๊ด์ฌ์ด ๋ง์์ผ๋ฉฐ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค๋ ๊ฒ์ด ํ์ฉํด๋ณธ ๊ฒฝํ์ด ์์ง๋ง ๋ง์ฐํ ์ด๊ฑฐ๋ผ๋ฉด ๋ถ๋ช ์ฌ๋ฐ๊ฒ ๋ค!๋ผ๋ ํ์ ์ด ๋ค์ด์ ์ฃผ์ ์์ด ์ด ํ๋ก์ ํธ๋ฅผ ์ ํํด์ 1์์๋ก ์ง๋งํ๋ ๊ธฐ์ต์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ socket.io๋ฅผ ์ ๋ดํ๊ฒ ๋๋ฉด์ ๋คํํ๋ ๊ธฐ๋์ ๊ฐ์ด ์ฌ๋ฐ๋ ์์ ์ด์์ต๋๋ค. ์ ๊ฐ ์์ฑํ ์ฝ๋๋ก ์ธํด ์ค์๊ฐ์ผ๋ก ๋์ํ๋ ๊ฒ์์ ์ฌ๋ฏธ๋ฅผ ๋๋ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ธ์ ๋ ์์ ์ ํ๋ฉด์ ๋ฐ์ฑ๊ณผ ํผ๋๋ฐฑ์ ํ๊ฒ ๋๋ ๊ณผ์ ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ ์ง์๊ณผ ์ดํด๊ฐ ์ค์ํ๋ค
์ฒ์ socket.io๋ฅผ ํ์ฉํ๋ฉด์ ๋ง์ฐํ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๋ฐ๋ผํ๋๊น ๋๋ค?๋ผ๋ ๊ณผ์ ์ผ๋ก ์์์ ํ์ต๋๋ค. ์ค์ ๋ก๋ socket.io๋ฅผ ํ์ฉํ ๊ฐ๋ฐ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ดํ ์งํ์ ํ๋ฉด์ ๋์์ ํ์ง๋ง ๋ถ์ ์ ํ ์ฐ๊ฒฐ ๋ฐฉ์์์ ๊ณต๋ถ์ ์ดํด๊ฐ ํ์ํ๊ณ , handshake, ๋ธ๋ผ์ฐ์ ๊ฐ websocket์ด ์ง์๋๋ฉด 101 ์๋ต์ฝ๋๋ฅผ ๋ณด๋ด์ websocket์ผ๋ก ์ ๊ทธ๋ ์ด๋๋ฅผ ํ๋ ๋ฑ์ ๋ํ ๊ณต๋ถ๋ฅผ ํด์ผํ๊ณ ์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์ ์๊ฐ์ ํ๋ฆ์ ๊ฐ์ก์ต๋๋ค.
์ ์ง์ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ์ญ์ ์๊ณ ์จ์ผ ํ๋๊ตฌ๋ โ ๊ณต์ ๋ฌธ์๋ฅผ ์ ๋ ํ ํ์๊ฐ ์๋ค โ ์ด ๋ฌธ์๋ฅผ ์ ๋ ํ๋ฉด์ ์ดํด๋ฅผ ํ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ธ cs์ง์์ด ๋ฐํ์ด ๋์ด์ผ๊ฒ ๊ตฌ๋
์ด๋ฌํ ์ ๋ง ๊ฐ๋ฐ์๋ผ๋ฉด ๋น์ฐํ ์ด์ผ๊ธฐ์ง๋ง ๋ฐ์๋ค์ด๊ณ ๋ง ์๋ ํ๋ฆ์ ์ง์ ๊นจ๋ฌ์ ์ ์์๋ ์์คํ ๊ฒฝํ์ด์์ต๋๋ค.
๊ทธ๋๋ ์ญ์ ์ฌ๋ฐ๋ค
๊ธฐ๋ณธ์ ์ธ ์ง์์ ๊ณต๋ถํ๊ณ ์ดํดํ ์ ์๋ ๊ณผ์ ์ด ํ์ํ์์๋ ๊ทธ ๊ณผ์ ์ ์ฌ๋ฐ์์ต๋๋ค. ํ์ ํด๋ผ์ฐ๋์ ํฅ๋ฏธ๋ฅผ ๊ฐ์ ธ์ ๋คํธ์ํฌ๋ฅผ ์ข์ํด์์ธ์ง ์ดํด๋ ๋๋ฆ ์ ๋๊ณ ์๋กญ๊ฒ ์์๊ฐ๋ ๊ณผ์ ์ด ์ข์๊ณ ์๋ฆฌ์ ๋์์ ์ดํดํ๋ฉด์ ๋ฐ์ ํ ์ ์์๋ ๊ณผ์ ๋ํ ๋๋ฌด ์ข์์ต๋๋ค.