์๋ ํ์ธ์, ์ด๋ฒ ํฌ์คํ ์์๋ ์ต๊ทผ ๊ตฌํํ๋ ์น์์ผ(WebSocket) ๊ธฐ๋ฐ์ ์ค์๊ฐ ํต์ ์ ๋ํ ๊ฒฝํ์ ๊ณต์ ํด๋ณด๋ ค ํฉ๋๋ค.
ํนํ Guest์ Host๋ผ๋ ๋ ๊ฐ์ง ์ญํ ๋ก ๋๋๋ ํด๋ผ์ด์ธํธ ๊ฐ ์์ผ ํต์ ์ ์ค๊ณํ๊ณ ๊ตฌํํ๋ฉด์ ๊ฒช์ ์ด๋ ค์๊ณผ ํด๊ฒฐ ๊ณผ์ ์ ๋ด์๋ณด์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ๋จ์ํ ์ฑํ ์ฑ์ด๋ ๊ธฐ๋ณธ์ ์ธ ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๋ ๊ฒ์ ๋์ด์, Guest(๋ฐฉ๋ฌธ์)์ Host(๋ฐฉ ๊ด๋ฆฌ์) ๊ฐ ์ญํ ๊ตฌ๋ถ์ด ๋ช ํํ ํต์ ์ ์๊ตฌํ์ต๋๋ค.
๋จผ์ ์ ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ๊ณ ๋ฏผ์ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋์์ ์ค๊ณํ๊ณ ๊ตฌํํด์ผ ํ๋ ํ์คํ์ ์ ์ฅ์์, ์ด๋ค ์ ์ ๊ณ ๋ฏผํ๊ณ , ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์ธํ ๊ณต์ ํด๋ณด๊ฒ ์ต๋๋ค.
์ด ํ๋ก์ ํธ์ ๋ชฉํ๋ Guest์ Host๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ์ํตํ๋ ์์คํ ์ ๊ตฌํํ๋ ๊ฒ์ด์์ต๋๋ค.
์๋ฅผ ๋ค์ด, Guest๋ ์์ ์ ์์น ์ ๋ณด๋ฅผ ์ง์์ ์ผ๋ก ์ ์กํ๊ณ , Host๋ ์ด๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๋ฉฐ ํ์ํ ํผ๋๋ฐฑ์ ์ ๋ฌํฉ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ์ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
channelId
๋ฅผ ๊ธฐ์ค์ผ๋ก ํต์ ํฉ๋๋ค.์ ๊ฐ ์ค๊ณ๋ฅผ ํ๋ฉฐ ๊ณ ๋ คํด์ผ ํ๋ ๋ถ๋ถ์ ํฌ๊ฒ ์๋์ ๊ฐ์์ต๋๋ค.
์์ผ ํต์ ์์ Guest์ Host์ ์ญํ ์ ๋ช ํํ ๊ตฌ๋ถํด์ผ ํ์ต๋๋ค.
Guest๋ Host์๊ฒ๋ง ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ฉฐ, ๋ค๋ฅธ Guest๋ ์ด๋ฅผ ๋ณผ ์ ์๊ณ ,
Host๋ ๋ฐฉ์ ์ฐธ์ฌ ์ค์ธ ๋ชจ๋ Guest์ ์ค์๊ฐ ์์น๋ฅผ ๋ณผ ์ ์์ด์ผ ํ์ต๋๋ค.
์ด๋ ๊ฒ Guest์ Host์ ์ญํ ๋ณ๋ก ๋ณด๋ด๊ณ ๋ฐ๋ ๋ฉ์์ง๊ฐ ๋ฌ๋ผ์ ธ์ผ ํ๋ค๋ ์ ์ด ์ผ๋ฐ์ ์ธ ์์ผ ๊ตฌํ๊ณผ์ ์ฐจ์ด์ ์ด์์ต๋๋ค.
๋ ์ ํฌ ํ๋ก์ ํธ์๋ ์ฑ๋(channel) ๊ฐ๋ ์ด ์กด์ฌํ์ต๋๋ค.
์ฑ๋์ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๋ฉ์์ง๋ฅผ ํน์ ๊ทธ๋ฃน์๋ง ์ ์กํ๋๋ก ํ๊ฒ ํด์ฃผ๋ ์ญํ ์ด์์ต๋๋ค.
๊ทธ๋์,
์น์์ผ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
ํ์ง๋ง ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ,
์ ํฌ ํ๋ก์ ํธ์์๋ ์ฑ๋ ๋ณ๋ก ๊ทธ ๊ทธ๋ฃน ๋ด์์๋ง ํต์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฑ๋ ๋ด์์๋, Host์ Guest๊ฐ ๊ฐ๊ฐ ๋ณด๋ด๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ์ ๋ณด๊ฐ ๋ฌ๋ผ์ผ ํ์ต๋๋ค.
๊ทธ๋์ WebSocket ์ฐ๊ฒฐ ์ ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ ผ๋ฆฌ๊ฐ ํ์ํ์ต๋๋คโฆ.
๊ทธ๋์ ๊ฐ์ฅ ๋จผ์ ,
WebSocket ์ฐ๊ฒฐ ์ URL ํ๋ผ๋ฏธํฐ๋ก role
, channelId
, guestId
๋ฅผ ์ ๋ฌํ์ต๋๋ค.
role
: ํด๋ผ์ด์ธํธ์ ์ญํ (host
๋๋ guest
)channelId
: ํต์ ํ ๋ฐฉ IDguestId
: ๊ฒ์คํธ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ID์๋ฒ๋ ์ด ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ญํ ์ ๋ถ๋ฆฌํ๊ณ , Host์ Guest์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํ๋๋ก ์ค๊ณํด์ฃผ์์ต๋๋ค.
์๋ฒ ์ฝ๋ ์ผ๋ถ
const params = new URLSearchParams(req.url.split('?')[1]);
const channelId = params.get('channelId'); // ๋ฐฉ ID
const guestId = params.get('guestId'); // Guest ๊ณ ์ ID
const role = params.get('role'); // 'host' or 'guest'
์ด๋ ๊ฒ ๊ตฌ๋ถํด์ค์ผ๋ก์จ ๊ฐ ์์ผ ์ฐ๊ฒฐ์ด ์ด๋ค ์ฑ๋์ ์ํด ์๋์ง, ๊ทธ๋ฆฌ๊ณ Guest์ Host ์ญํ ์ ๊ตฌ๋ถํ ์ ์์์ต๋๋ค.
์ฐ์ , ์ฑ๋ ๋ด์์๋ง ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณํ๊ธฐ ์ํด WebSocket ์ฐ๊ฒฐ ์ ์ฑ๋ ID(channelId)๋ฅผ URL ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ต๋๋ค.
๋ฐฑ์๋๋ ์ ๋ฌ๋ฐ์ channelId
๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ผ ๋ฐฉ์ ์์ฑํ๋ฉฐ, ํด๋น ๋ฐฉ ์์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํ์ต๋๋ค.
ํ๋ก ํธ์์ ์์ฒญํ๋ ์์ผ์ url ์ฝ๋
const ws = new WebSocket(
`${BASE_URL}/socket?channelId=${channelId}`
);
์์ ๊ฐ์ด ์ฑ๋์ ๊ตฌ๋ถํด์ฃผ์์ต๋๋ค.
๋, Guest๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ๊ฐ ์ฌ์ฉ์๋ ๊ณ ์ ํ guestId
๋ฅผ URL ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ต๋๋ค.
์์ url ์ฝ๋์์ guestId
๋ฅผ ์ถ๊ฐํด์ค ๊ฒ์
๋๋ค.
์ด๋ฅผ ํตํด Host๋ ํน์ Guest์ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ ์ ์์์ต๋๋ค.
ํ๋ก ํธ์์ ์์ฒญํ๋ ์์ผ์ url ์ฝ๋
const ws = new WebSocket(
`${BASE_URL}/socket?channelId=${channelId}&guestId=${guestId}`
);
๋ค์์ผ๋ก๋ Host์ Guest์์ ๋ณด๋ด๊ณ ๋ฐ๋ ์ ๋ณด๊ฐ ๊ฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ก์ง์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
์์ url ์ฝ๋์์ role
์ ์ถ๊ฐํด์ค ๊ฒ์
๋๋ค.
ํ๋ก ํธ์์ ์์ฒญํ๋ ์์ผ์ url ์ฝ๋
const ws = new WebSocket(
`${BASE_URL}/socket?role=guest&channelId=${channelId}&guestId=${guestId}`
);
๊ฒฐ๋ก ์ ์ผ๋ก ํ๋ก ํธ์๋์์ Guest์ ์์น ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ channelId
, guestID
, role
์ ํจ๊ป ๋ณด๋ด์ฃผ๊ฒ ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์, ๊ฐ์ ๋ฐฉ์ ์๋ ํด๋ผ์ด์ธํธ๋ผ๋ ์ญํ ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๋ก ์ค๊ณํ์ต๋๋ค.
์ฐ์ Guest๋ ์์ ์ ์์น๋ฅผ Host์๊ฒ ์ค์๊ฐ์ผ๋ก ์ ๋ฌํฉ๋๋ค.
ํ๋ก ํธ์๋ ์ฝ๋ ์ผ๋ถ
useEffect(() => {
// ์์น ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ์ก
if (lat && lng && wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(
JSON.stringify({
type: 'location',
location: { lat, lng, alpha },
}),
);
}
}, [lat, lng, alpha]);
์์ 1๋ฒ์ Guest์ ์ ์ฅ์ด์๋ค๋ฉด, ์ด๋ฒ์๋ Host์ ์ ์ฅ์ ๊ณ ๋ คํด์ผ ํ์ต๋๋ค.
Host๋ ๋ฐฉ ์์ ์๋ ๋ชจ๋ Guest์ ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์์ผ ํ์ต๋๋ค.
๊ทธ๋์ ์๋์ ๊ฐ์ด ์น์์ผ์์ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ๋, (ํด๋น ๋ฐ์ดํฐ๋Guest์ ์ค์๊ฐ ์์น์ด๊ธฐ ๋๋ฌธ์) ๊ฐ์ ์ฑ๋์ ์ํ Guest๋ค์ ์ค์๊ฐ ์์น๋ผ๊ณ ํ๋จํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
ํ๋ก ํธ์๋ ์ฝ๋ ์ผ๋ถ
useEffect(() => {
ws.onmessage = event => {
const data = JSON.parse(event.data);
const updatedLocations = data.clients.map((client: any, index: number) => {
const matchingGuest = channelInfo?.guests?.find(guest => guest.id === client.guestId);
return {
...client,
color: matchingGuest?.markerStyle.color ?? markerDefaultColor[index],
};
});
setOtherLocations(updatedLocations);
};
}, [ws, guestsData]);
์์์ ๊ตฌํํ ๊ฒ์ผ๋ก ์คํ์ ํ๋ฉด, host๊ฐ ๋จผ์ ์ ์ํด์๊ณ , guest๊ฐ ์ดํ์ ์ ์ํ ์ํฉ
์์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์์ง๋ง,
guest๊ฐ ๋จผ์ ์ ์ํด ์๊ณ , ์ดํ host๊ฐ ์ ์ํ ์ํฉ
์์๋ guest๋ host๊ฐ ์ ์ํ๊ธฐ ์ ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ host ์ ์ ์ด์ ์ guest๋ค์ ๋ํ ์์น๋ ๋ฐ์์ฌ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๊ทธ๋์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ฉด ์ข์์ง ๊ณ ๋ฏผํ๋ค, ์์ผ์ ํ์ ์ ํ๋ ๋ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ์์ ์๊ฐํด๋์ต๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด,
ํธ์คํธ๊ฐ ์ฒ์ ์ ์ํ๋ฉด, ์์ผ์ ๋ณด๋ด๋ ๋ฉ์์ง์ type์ init
์ผ๋ก ๋ณด๋ด์ฃผ๊ณ ,
๋ฐฑ์๋ ์ ์ฅ์์๋ ๊ฒ์คํธ๋ค์ ์ ๋ณด๋ค์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋์๋ค๊ฐ
ํธ์คํธ๊ฐ ์ฒ์ ์ ์ํ ๊ฒฝ์ฐ
(type์ด init์ธ ๊ฒฝ์ฐ) ์๋ ์ด์ ๊ฒ์คํธ๋ค์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์๋์ ๊ฐ์ด, host ํด๋ผ์ด์ธํธ
์์๋ ๋ฐ์์จ ์์ผ์ ๋ฉ์์ง ํ์
์ด init
์ธ์ง, location
์ธ์ง์ ๋ฐ๋ผ
์ด์ ๊ฒ์คํธ๋ค์ ์ ๋ณด๋ ๋ฐ์์ค๊ณ , ์๋ก ๋ค์ด์ค๋ ๊ฒ์คํธ๋ค์ ์ ๋ณด๋ ๋ฐ์์ฌ ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
ws.onmessage = event => {
const data = JSON.parse(event.data);
console.log(data);
if (data.type === 'init') {
// ๊ธฐ์กด ํด๋ผ์ด์ธํธ๋ค์ ์์น ์ด๊ธฐํ
const updatedLocations = data.clients.map((client: any, index: number) => {
const matchingGuest = channelInfo?.guests?.find(guest => guest.id === client.guestId);
return {
...client,
color: matchingGuest?.markerStyle.color ?? markerDefaultColor[index],
};
});
setOtherLocations(updatedLocations);
} else if (data.type === 'location') {
// ์๋ก ๋ค์ด์จ ์์น ์
๋ฐ์ดํธ
const matchingGuest = guestsData?.find(guest => guest.id === data.guestId);
const updatedLocation = {
guestId: data.guestId,
location: data.location,
token: data.token,
color: matchingGuest?.markerStyle.color ?? '#ffffff',
};
setOtherLocations(prev => {
const index = prev.findIndex(el => el.guestId === data.guestId);
if (index !== -1) {
const updatedLocations = [...prev];
updatedLocations[index] = updatedLocation;
return updatedLocations;
}
return [...prev, updatedLocation];
});
}
};
guestId
๊ฐ ๋์ผํ ์ํ์์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ์ํ ๊ฒฝ์ฐ, ๊ธฐ์กด์ ์ฐ๊ฒฐ์ด ์ ์ง๋๋ฉด์ ๋ฐ์ดํฐ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋จ์์ ๊ณ ์ ํ ํฐ์ ์์ฑํด localStorage
์ ์ ์ฅํ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋จ์ ๊ณ ์ ํ ํฐ ์์ฑ ๋ฐ ์ ์ฅ
const token = localStorage.getItem('socketToken') || uuidv4();
localStorage.setItem('socketToken', token);
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋์์๋ ์๋ก์ด ์ฌ์ฉ์๊ฐ ๋์ผํ guestId
๋ก ์ ์ํ ๊ฒฝ์ฐ, ์ด์ ์ฐ๊ฒฐ์ ๊ฐ์ ๋ก ๋๋ ๋ก์ง์ ์ถ๊ฐํ์ต๋๋ค.
๋ฐฑ์๋์์ ์ค๋ณต Guest ID ์ฒ๋ฆฌ
const guestSockets = {};
io.on('connection', socket => {
const { channelId, guestId, token } = socket.handshake.query;
if (guestSockets[guestId] && guestSockets[guestId] !== token) {
io.to(guestSockets[guestId]).emit('disconnect');
}
guestSockets[guestId] = socket.id;
socket.on('disconnect', () => {
if (guestSockets[guestId] === socket.id) {
delete guestSockets[guestId];
}
});
});
์ด์ ๋์ผํ guestId
๋ก ์ ์ํ ์ฌ์ฉ์๊ฐ ์์ผ๋ฉด, ๊ธฐ์กด ์ฐ๊ฒฐ์ ๋๊ธฐ๊ณ ์๋ก์ด ์ฌ์ฉ์๋ง ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด์ Host์ Guest๋ ๊ฐ์ ๋ฐฉ์์ ์ค์๊ฐ์ผ๋ก ์ํตํ ์ ์์ต๋๋คโฆโฆ..
๊ฒฐ๊ตญ ์๋ 3๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ชจ๋ ๊ตฌํ ๋์๊ณ , ์ค์๊ฐ ์์ผ ํต์ ์์ ์ญํ ๊ตฌ๋ถ, ์ฑ๋ ๊ด๋ฆฌ, ์ค๋ณต ์ ์ ์ฒ๋ฆฌ ๋ฑ์ ํด๊ฒฐํ ์ ์์์ต๋๋คโฆโฆโฆโฆโฆโฆ.
guestId
๋ก ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ์ํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ฒฐ๋ก ์ ์ผ๋ก ํด๊ฒฐํ ํ๋ฆ์ ๋ํ๋ด๋ณด๋ฉด ์์ gif์ ๊ฐ์๋ฐ,
ํ๋ก ํธ์๋(ํด๋ผ์ด์ธํธ)์ ๋ฐฑ์๋(์๋ฒ)์์ ๊ฐ๊ฐ ์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ์ํด ์ค๊ณํ๋ ๊ณผ์ ์ด ๋๋ฌด ๋ณต์กํ์ต๋๋ค.
์ฒ์์๋ ์ฑ๋id
์ guestID
๋ก ๋ถ๋ฆฌํ๋๋ฐ,
๋ถ๋ฆฌํด์ ํต์ ํ๋ค ๋ณด๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์์ ๋๋ฌธ์ host๊ฐ ์ ์ํ๊ธฐ ์ด์ ์ ์ ์ํ๋ ๊ฒ์คํธ ์ ๋ณด๊น์ง ๋ฐ์์ค๋ ๋ก์ง๋ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๊ณ ,
์ด ๋ก์ง์ ์ถ๊ฐํ๊ณ ๋ณด๋ ๊ฐ์ guestId๋ก ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์ ์ ์ํ๊ฒ ๋์์ ๋์ ์์ธ ์ฒ๋ฆฌ๋ ํ์ํด์ก์ต๋๋คโฆ..
์ ๋ง ์ด๋ฒ์ ์น์์ผ ๊ตฌํ ํ๋ฉด์ ๊ณ ๋ คํด์ผ ํ ๋ถ๋ถ์ด ๋ง์ ๋จธ๋ฆฌ๊ฐ ํฐ์ง ๊ฒ ๊ฐ์๋๋ฐ, ํ์คํโฆโฆ ์ฒ์๋ถํฐ ๋ํ ์ผํ ์ค๊ณ๋ฅผ ํ๋ค๋ฉด ์ข์๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๊ณ ,
์์ผ ๊ด๋ จ ๋ก์ง์ ๊ตฌํํด๋ณธ ๊ฒ์ด ์ฒ์์ด๋ผ ๋ํ ์ผํ ๋ถ๋ถ๊น์ง ๊ณ ๋ คํ์ง ๋ชปํ์ง๋ง
๋ค์ ๋ฒ์ ๋น์ทํ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด, ๊ทธ ๋๋ ์ ๋ง ๊ตฌ์ฒด์ ์ผ๋ก ๋ฐ์ํ ๋ฌธ์ ๋ค์ ๊ฐ์ ํด๊ฐ๋ฉด์ ์ค๊ณ๋ฅผ ํํํ ํด๋์ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์์ต๋๋คโฆโฆโฆ..