[ ๋ฌด๋ฌผ ] ๊ทผ์ฒ ์ฌ์ฉ์ ์ฐพ๊ธฐ #2 : ์ค์๊ฐ ์ฌ์ฉ์ ๊ฐ์ง ๋ฐ ์ฌ์ฉ์ ์๋ฐํ ๋ถ๋ฌ์ค๊ธฐ
์ฌ์ฉ์ A์ B๊ฐ ์๋ก 100m ์ด๋ด์ ์์ผ๋ฉด ์ค์๊ฐ์ผ๋ก ๊ฐ์ง๋๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ , ํด๋น ์ฌ์ฉ์์ ์๋ฐํ ๋ชจ์๋๋ก ํ๋ฉด์ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์ ๋๋ค.
๋จ์ํ ๊ฐ์งํ๋ ๊ฒ์ด ์๋๋ผ A,B๊ฐ ์๊ฐ ์ฐจ์ด๋ฅผ ๋๊ณ ์ ์ํ์ ๋๋ ๊ฐ์ง๊ฐ ๋์ด์ผ ํฉ๋๋ค.
๐งญ ์๊ตฌ ์ฌํญ
- ์๋ฒ๋ ์์น ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ ์ฌ์ฉ์๋ค์ ๊ณ์ฐํ๊ณ , ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ์ ์ก
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ฌ์ฉ์ ๋ฆฌ์คํธ๋ฅผ ์ํ๊ฐ์ผ๋ก ์ ์ฅํ์ฌ ์ปดํฌ๋ํธ์ ๋ฐ์
- ์ฌ์ฉ์๋ง๋ค ๊ณ ์ ํ ์บ๋ฆญํฐ ํ๋กํ์ด ์กด์ฌํ๋ฏ๋ก, userId๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ณ ์ ๋ณด ์กฐํ API๋ฅผ ์ถ๊ฐ ํธ์ถ
https://arty6848.tistory.com/189
[ ๋ฌด๋ฌผ ] ๊ทผ์ฒ ์ฌ์ฉ์ ์ฐพ๊ธฐ #1 : ์๋ / ๊ฒฝ๋ GPS ๊ธฐ๋ฐ WebSocket ์ธํ ํ๊ธฐ
์ฌ์ฉ์ A์ B๊ฐ ์๋ก 10m ์ด๋ด์ ์์ผ๋ฉด ์ค์๊ฐ์ผ๋ก ๊ฐ์ง๋๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด WebSocket์ ๋์ ํ์ต๋๋ค.์ฒซ๋ฒ์งธ๋ก ์น์์ผ์ ์ธํ ํ๊ณ ์ฐ๊ฒฐํ๋ ์ด๊ธฐ์ธํ ๊ณผ์ ์ ๋๋ค. ๐งญ ์ ์ฒด ๋ชฉํ ๊ธฐ๋ฅ‘๋ฌด๋ฌผ
arty6848.tistory.com
์ฐ์ ์ด์ ๊ธ์ ํตํด ๊ธฐ๋ณธ์ ์ธ ์น ์์ผ ์ธํ ์ ์งํํ์ต๋๋ค.์น ์์ผ์ ์ ์ํ ๋ ์ ์ํ ์ฌ์ฉ์์ userId๋ฅผ ์น ์์ผ ์๋ฒ์ ์ ์กํ๊ณ , ์ด๋ฅผ ๊ฐ์งํ์ฌ ํด๋น userId๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ์์ ๊ณ ์ ์บ๋ฆญํฐ ํ๋กํ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ๊ฐ์ง ํ๋ฆ์ ์ ๋ฆฌํ๋ฉด ์ด๋ ์ต๋๋ค.
participant A as ์ฌ์ฉ์ A
participant B as ์ฌ์ฉ์ B
participant Server as WebSocket ์๋ฒ
participant DB as ๋ฐฑ์๋ API
A->>Server: ์์น ์ ๋ณด ์ ์ก
B->>Server: ์์น ์ ๋ณด ์ ์ก
Server-->>A: B ๊ฐ์ง๋จ → userId ์ ์ก
Server-->>B: A ๊ฐ์ง๋จ → userId ์ ์ก
A->>DB: userId๋ก ํ๋กํ ์กฐํ
A->>DB: userId๋ก ์ด๋ฆ ์กฐํ
A->>ํ๋ฉด: ์๋ฐํ์ ์ด๋ฆ ํ์
์ฐ์ NextJS์ AppRouter ๋ฐฉ์์ ์ ํํ๊ธฐ ๋๋ฌธ์
app/nearby/page.tsx ํ์ผ์ ๊ธฐ๋ณธ ๋ด์ฉ์ ์์ฑํ์ฌ /nearby ๊ฒฝ๋ก์์ ๊ทผ๊ฑฐ๋ฆฌ ํต์ ์ ์ํ ํ๋ฉด์ ๊ฐ๋ฐํ์์ต๋๋ค.
๊ทผ์ฒ ์ฌ์ฉ์๋ฅผ ๋ถ๋ฌ์ค๋ ๋ถ๋ถ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ฝ๋ ์ปจ๋ฒค์ ์ ๋ฐ๋ฅด๊ธฐ ์ํด ํ ์ผ๋ก ๋ถ๋ฆฌํ์์ต๋๋ค.
โจ app/nearby/page.tsx ์ฃผ์ ํ๋ฆ ์ ๋ฆฌ
์์น ๊ธฐ๋ฐ ์ฌ์ฉ์ ํ์ง ๋ฐ ์๋ฐํ ๋ ๋๋ง์ ์ค์ฌ ์ปดํฌ๋ํธ
- ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์์น ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ 100m ์ด๋ด ์ฌ์ฉ์ ๊ฐ์ง
- WebSocket์ ํตํด ์ค์๊ฐ ์์น ๊ฐฑ์ ์์
- ๊ฐ์ง๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ฐํ UI ๋์ ๋ ๋๋ง
โ useSession์ผ๋ก ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ ID ๋ถ๋ฌ์ค๊ธฐ
const { data: session } = useSession();
const userId = session?.user?.id;
- WebSocket ์ฐ๊ฒฐ ์ ์ ์ํ ์ฌ์ฉ์์ ID๋ฅผ ํจ๊ป ์๋ฒ์ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ฌ์ฉ์ ๊ตฌ๋ถ์ ์ํด์ ์ ์ผํ ์๋ณ์๊ฐ ํ์ํ๊ณ , NextAuth์ ์ธ์ ์์ ๋ฐ๋ก userId๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์์ต๋๋ค.
โ useRef๋ฅผ ์ฌ์ฉํด userId๋ฅผ ๊ธฐ์ต
const myIdRef = useRef<string | null>(null);
useEffect(() => {
if (userId) {
myIdRef.current = userId;
}
}, [userId]);
- ์ค์๊ฐ ์์ผ ํต์ ์ ์ฌ๋ฌ ๋ฒ ๋ฆฌ๋ ๋๋ง๋ ์ ์์ด์, userId๋ฅผ ๊ณ์ prop์ผ๋ก ๋๊ธฐ๊ธฐ๋ณด๋ค๋ ref๋ก ๋ณด์กดํ์ต๋๋ค.
- useRef๋ ๋ ๋๋ง์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์๋ ์ง์์ ์ผ๋ก ๊ฐ์ ์ ์งํด์ค๋๋ค.
- "๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ id๋ฅผ WebSocket ํต์ ์ค ๋ ์์ ๊ณผ ๊ฐ์ง๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ref๋ก ์ ์ฅ"ํ์์ต๋๋ค.
โ useNearbySocket ํ ์ฌ์ฉ
useNearbySocket((data: NearbyUser) => {
if (
!data.userId ||
typeof data.userId !== "string" ||
data.userId === myIdRef.current
) {
console.warn("๐ ์ ํจํ์ง ์๊ฑฐ๋ ๋ณธ์ธ userId ๋ฌด์:", data.userId);
return;
}
console.log("๐ก ์ ์ฌ์ฉ์ ๊ฐ์ง:", data.userId);
setUsers((prev) => {
const filtered = prev.filter((u) => u.userId !== data.userId);
return [...filtered, data];
});
}, userId);
- ์ค์๊ฐ์ผ๋ก ๊ฐ์ง๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ฒ๋ก๋ถํฐ ์์ ํ๋ฉด, ํ๋ฉด์ ํ์ํ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐฑ์ ํ๊ธฐ ์ํด setUsers๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ฌ๊ธฐ์ ๋ณธ์ธ ์์ ์ ๊ฐ์ง ๋์์ด ์๋๋ฏ๋ก userId === myIdRef.current์ธ ๊ฒฝ์ฐ ๋ฌด์ํฉ๋๋ค.
- useNearbySocket ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ, ํด๋น ๋ก์ง์ด WebSocket ํต์ ์ ๋ณต์กํ ๋ก์ง์ ์บก์ํํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ต๋๋ค.
โจ NearbyUserAvatar.tsx ์ฃผ์ ํ๋ฆ ์ ๋ฆฌ
์ฌ์ฉ์ ๊ฐ๋ณ ์๋ฐํ ๋ ๋๋ง ์ปดํฌ๋ํธ
- ๊ฐ ์ฌ์ฉ์์ ํ์ ์ ๋ง๋ ์๋ฐํ ์ด๋ฏธ์ง์ ์ด๋ฆ ํ์
- angle + distance๋ฅผ ์ด์ฉํ ์๋์ ์์น ๊ณ์ฐ ๋ฐ ๋ ๋๋ง
โ ์ฌ์ฉ์ ์๋ฐํ ์ด๋ฏธ์ง ๋ ๋๋ง
const { data: profile } = useGetUserCharacterProfile(userId);
const imageSrc = profile?.type
? `/assets/moono/${profile.type.toLowerCase()}-moono.png`
: "/assets/moono/default-moono.png";
- userId๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์ฌ์ฉ์์ ์บ๋ฆญํฐ ํ์ (profile.type)์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋น๋๊ธฐ API ์์ฒญ ํ ์ ์ฌ์ฉํ์ต๋๋ค.
- ์ด ํ์ ์ ๋ฐ๋ผ ์บ๋ฆญํฐ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ์ ๋์ ์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ์ฑํฅ ํ ์คํธ๋ฅผ ์์ง ์งํํ์ง ์์์, ์บ๋ฆญํฐ ํ๋กํ์ด ์์ง ์๋ค๋ฉด default ์ด๋ฏธ์ง๋ก ๋์ฒดํฉ๋๋ค.
โ ์ฌ์ฉ์์ ๊ฑฐ๋ฆฌ/๊ฐ๋์ ๋ฐ๋ฅธ ์์น ๊ณ์ฐ
const boundedDistance = Math.min(distance * 80, 180);
const x = Math.cos((angle * Math.PI) / 180) * boundedDistance;
const y = Math.sin((angle * Math.PI) / 180) * boundedDistance;
- ์ํ ๋ฐฉ์ฌํ ๊ตฌ์กฐ๋ก ํ๋ฉด์ ์ฌ์ฉ์ ์๋ฐํ๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ํด ์ผ๊ฐํจ์๋ฅผ ์ด์ฉํ ์ขํ ๊ณ์ฐ์ ์ ์ฉํ์ต๋๋ค.
- distance๋ ์ค์ ๊ฑฐ๋ฆฌ(m)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ์๊ฐํ๋๋๋ก ๋ณด์ ํ๊ณ , ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํํ์ฌ UI๊ฐ ๊นจ์ง์ง ์๋๋ก ํ์ต๋๋ค.
๐ฅ ํธ๋ฌ๋ธ ์ํ : ์ฌ์ฉ์ A, B๊ฐ ์๊ฐ ์ฐจ๋ฅผ ๋๊ณ ์ ์ ์ ๊ฐ์ง๊ฐ ๋์ง ์๋ ๋ฌธ์
https://github.com/Ureka-Middle-Team1/moo-mool/issues/187
[BUG] ๊ทผ๊ฑฐ๋ฆฌ ํต์ _์๋ก ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์๋๋ฐฉ ํ๋กํ ์ ๋ณด ๊ฐ์ง X · Issue #187 · Ureka-Middle-Team1/moo-mo
๐ ๋ฌธ์ ์ํฉ ํ์ฌ ๋์ผํ ๊ธฐ๊ธฐ์์ ์๋ก ๋ค๋ฅธ ์ฌ์ฉ์ ์ ๋ณด๋ก ๋ก๊ทธ์ธํ ๊ฐ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ฐ๋ฉด ๊ฐ์ง๊ฐ ์ ๋์ง๋ง ์๋ก ๋ค๋ฅธ ๊ธฐ๊ธฐ์์๋ ์๋๋ฐฉ ํ๋กํ ์ ๋ณด ๊ฐ์ง X ๐ธ Screenshot (์คํฌ๋ฆฐ์ท) โ
github.com
์ฌ์ฉ์ A์ B๊ฐ ์๋ก 100m ์ด๋ด์ ์์ผ๋ฉด ์ค์๊ฐ์ผ๋ก ๊ฐ์ง๋๊ณ , ํด๋น ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ฐํ๊ฐ ๋ ๋๋ง๋์ด์ผ ํ์ต๋๋ค. ํ์ง๋ง ์์๊ณผ ๋ค๋ฅด๊ฒ A์ B๊ฐ ์๊ฐ ์ฐจ๋ฅผ ๋๊ณ ์ ์ํ๋ฉด ์๋ก๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ฐ์ํ ์ํฉ
- ๋ธ๋ผ์ฐ์ A์์ ์ฌ์ฉ์ A ๋ก๊ทธ์ธ → /nearby ์ง์ → WebSocket ์ฐ๊ฒฐ ๋ฐ ์์น ์ ์ก
- ๋ธ๋ผ์ฐ์ B์์ ์ฌ์ฉ์ B ๋ก๊ทธ์ธ → /nearby ์ง์ → WebSocket ์ฐ๊ฒฐ ๋ฐ ์์น ์ ์ก
- ์๋ฒ๋ B ์ ์ฅ ๊ธฐ์ค์ผ๋ก ๋ฐ๊ฒฝ 100m ์ด๋ด ์ฌ์ฉ์(A) ๋ฅผ ๊ณ์ฐํด B์๊ฒ๋ง ์ ์กํจ
- A๋ ์ดํ ์์น๋ฅผ ์ ์กํ์ง ์์ → ์๋ฒ๋ B๋ฅผ A์๊ฒ ์ ๋ฌํ์ง ์์
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ชฝ ์ฌ์ฉ์๋ง ์๋ก๋ฅผ ๊ฐ์งํ๊ฒ ๋์ด ํ๋ฉด์๋ ์๋ฌด๊ฒ๋ ๋จ์ง ์๊ฑฐ๋, ์๋ฐฉํฅ ๊ฐ์ง๊ฐ ๋์ง ์์.
๐ ์์ธ ๋ถ์
์ฒ์์๋ ์ฌ์ฉ์ ์์น๋ฅผ WebSocket ์๋ฒ์ ์ ์กํ ๋, getCurrentPosition()์ ํ ๋ฒ๋ง ํธ์ถํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ฒ์ ํ ๋ฒ๋ง ์ ์กํ์ต๋๋ค.
ํด๋ผ์ด์ธํธ
// [๋ฌธ์ ์ฝ๋ - useNearbySocket.ts]
navigator.geolocation.getCurrentPosition(
(position) => {
const { latitude, longitude } = position.coords;
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(
JSON.stringify({
type: "location_update",
userId,
lat: latitude,
lng: longitude,
})
);
}
},
(error) => {
console.error("๐ ์์น ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ์คํจ:", error.message);
}
);
useNearbySocket์ ์ฌ์ฉ์์ ์์น๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก WebSocket ์๋ฒ์ ์ ์กํ๊ณ , ์๋ฒ๋ก๋ถํฐ ์ฃผ๋ณ ์ฌ์ฉ์ ๋ฆฌ์คํธ๋ฅผ ์์ ํ๋ ์ปค์คํ ํ ์ ๋๋ค.
์ด ํ ๋ด๋ถ์์ getCurrentPosition์ด ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๊ณ ์์ต๋๋ค.
1. ์ฌ์ฉ์ A๊ฐ /nearby์ ์ง์ → ์์น ํ ๋ฒ ์ ์ก ํ ๋
2. ์ฌ์ฉ์ B๊ฐ ๋์ค์ ์ง์ → ์์น ์ ์ก → ์๋ฒ๋ B ๊ธฐ์ค์ผ๋ก๋ง ๊ฑฐ๋ฆฌ ๊ณ์ฐ
3. ์๋ฒ๋ B์๊ฒ๋ง A๋ฅผ ๋ณด๋ด์ฃผ๊ณ , A๋ ์ ๋ฐ์ดํธ ์์ → ๊ฒฐ๊ตญ A๋ ์๋ฌด๋ ๋ชป ๊ฐ์งํจ
๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ฐฉํฅ ๊ฐ์ง๊ฐ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค
์๋ฒ์ฝ๋
// [๋ฌธ์ ์ฝ๋ - server.js]
ws.on("message", (message) => {
const parsed = JSON.parse(message);
if (parsed.type === "location_update") {
// ์๋ฒ ๋ด๋ถ์ ์ฌ์ฉ์ ์์น๋ง ์ ์ฅํ๊ณ ๋
userLocations[parsed.userId] = {
lat: parsed.lat,
lng: parsed.lng,
};
// โ ๊ฐ์ง๋ ์ฌ์ฉ์๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ฃผ๋ ๋ถ๋ถ์ด ์์
}
});
- ํด๋ผ์ด์ธํธ๊ฐ ์์น๋ฅผ ๋ณด๋ด๋๋ผ๋ ๊ฐ์ง๋ ์ฃผ๋ณ ์ฌ์ฉ์ ๋ฆฌ์คํธ๋ฅผ ๋๋ ค์ฃผ์ง ์์, ์ฆ ์์น ์ ์ฅ๋ง ํ๊ณ ๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ง ์์
- ๊ฒฐ๊ตญ A๋ ์๋ฒ์ ์์น๋ฅผ ๋ณด๋์ง๋ง, ์๋ฌด ์๋ต์ ๋ชป ๋ฐ์
โ ๊ฐ์ : ์์น๋ฅผ 1์ด๋ง๋ค ๋ฐ๋ณต ์ ์ก
ํด๋ผ์ด์ธํธ ์ฝ๋
// [์์ ๋ ์ฝ๋ - useNearbySocket.ts]
const sendLocation = () => {
navigator.geolocation.getCurrentPosition(
(position) => {
const { latitude, longitude } = position.coords;
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(
JSON.stringify({
type: "location_update",
userId,
lat: latitude,
lng: longitude,
})
);
}
},
(error) => {
console.error("๐ ์์น ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ์คํจ:", error.message);
}
);
};
sendLocation(); // ์ต์ด 1ํ ์ ์ก
intervalId = setInterval(sendLocation, 1000); // ์ดํ 1์ด๋ง๋ค ์ ์ก
- ์์น ์ ์กํ๋ ๋ถ๋ถ์ sendLocation ํจ์๋ก ์ง์ ํ๊ณ setInterval๋ก 1์ด๋ง๋ค ๋ฐ๋ณตํ์ฌ ์ ์กํ์์ต๋๋ค.
- ์ฌ์ฉ์ A, B ๋ชจ๋ ์์ ์ ์์น๋ฅผ 1์ด๋ง๋ค ์๋ฒ์ ๊ฐฑ์ ํ๊ฒ ๋จ
- ์๋ฒ๋ ์ต์ ์์น ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ ์ฌ์ฉ์๋ฅผ ๊ณ์ฐํด์ ์๋ฐฉํฅ ์ ์ก ๊ฐ๋ฅ
์๋ฒ ์ฝ๋ : ์ค์๊ฐ ์๋ต ๋ธ๋ก๋์บ์คํธ
// [์์ ๋ ์ฝ๋ - server.js]
ws.on("message", (message) => {
const parsed = JSON.parse(message);
if (parsed.type === "location_update") {
userLocations[parsed.userId] = {
lat: parsed.lat,
lng: parsed.lng,
};
// ์ฃผ๋ณ ์ฌ์ฉ์ ๊ณ์ฐ
const nearbyUsers = getNearbyUsers(parsed.userId, userLocations);
// ์ฃผ๋ณ ์ฌ์ฉ์ ์ ๋ณด ๋ธ๋ก๋์บ์คํธ
for (const client of clients) {
if (client.readyState === WebSocket.OPEN) {
client.send(
JSON.stringify({
type: "nearby_users",
users: nearbyUsers,
})
);
}
}
}
});
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋ "location_update"๋ผ๋ ํ์ ์ผ๋ก ์ ์กํ๋ฉด
- ํด๋น ๋ฉ์ธ์ง ํ์ ์ ๋ฐ์์ ๋ nearbyUsers์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ์ฌ์ฉ์๋ฅผ ์ ์ฅํ ํ, ์น ์์ผ์ ์ ์ํ ์ฌ์ฉ์ (์น ์์ผ์ด OPEN ์ํ์ธ clients)์๊ฒ nearby_users๋ผ๋ ๋ฉ์ธ์ง ํ์ ์ผ๋ก ๊ทผ์ฒ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ณด๋ด์ค๋๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ์๋ก์ด ์ฌ์ฉ์๊ฐ ์๊ฐ์ฐจ๋ฅผ ๋๊ณ ์ ์ํ๋๋ผ๋ ์ ์ํ ๋๋ง๋ค "location_update" ํ์ ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ฒ ๋๊ณ ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ฒ ๋ฉ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ...