-
Notifications
You must be signed in to change notification settings - Fork 2
๐ ๋ ๋๋ง ๋ฒ์ธ์ ํ๋!
ํํ๋กญ๊ฒ ๊ฐ๋ฐ์ ํ๊ณ ์๋ ์ด๋๋ ,,
๋ง์คํฐํด๋์ค์์ ์ฑํ ์ ์ ๋ ฅํ๋ฉด ์คํธ๋ฆฌ๋ฐ ํ์ด์ง์ ๋ถํ์ํ ๋ ๋๋ง์ด ์ผ์ด๋๋ค๋ ํผ๋๋ฐฑ์ ๋ฐ์์ต๋๋ค.
React Dev Tools์ Highlight updates when components render
์ต์
์ ์ฒดํฌํ๊ณ ,
๋ ๋๋ง ์ฌ๋ถ๋ฅผ ํ์ธํด ๋ดค์ต๋๋ค.
์ด๋ ๊ฒ ๋ฒ์ธ ์ฐพ๊ธฐ๊ฐ ์์์ด ๋์์ต๋๋ค
๊ฐ์ฅ ๋จผ์ React Dev Tools Profiler๋ฅผ ์ด์ด์ ์ ํํ ์ด๋ค ์ปดํฌ๋ํธ๋ค์ด ๋ ๋๋ง๋๊ณ , ์ด๋ค ์ด์ ๋ก ๋ ๋๋ง์ด ๋๋์ง ํ์ธํด ๋ดค์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ์ปดํฌ๋ํธ์ AudioController๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ์์ด์ฝ๋ค๊ณผ ์ฑํ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๋ ๋๋ง ๋๋ ์์๋ค์ ๋ถ๋ชจ ์์์์ ๊ฐ ์์๋ค์ด ์์กด์ฑ์ด ์๋ ๊ฒ์ธ๊ฐ ํ์ธํ์ต๋๋ค.
export function StreamingPage() {
const { isConnected, connect, reset, userCount } = useSocketStore();
const { clearMessages } = useChatMessageStore();
const { roomId } = useParams<{ roomId: string }>();
useEffect(() => {
// ์์ผ ์ฐ๊ฒฐ
}, [roomId]);
return (
<div className="flex flex-row h-screen">
<div className="flex-grow min-w-[calc(100%-340px)]">
<NetworkBoundary key={roomId}>
<StreamingContainer />
</NetworkBoundary>
</div>
<div className="h-screen bg-grayscale-900 flex-shrink-0 w-[340px] text-grayscale-100 px-8 pt-10 pb-10 flex flex-col">
<div className="flex justify-between items-center mb-4">
<div className="text-2xl font-bold">์ฑํ
</div>
<div className="flex items-center gap-2">
<Person />
<span className="text-lg">{userCount}๋ช
</span>
</div>
</div>
<ChattingContainer />
</div>
</div>
);
}
๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค ๋ณด๋ Page ๋ ์ด์์ ๊น์ง ์ฌ๋ผ์ค๊ฒ ๋์์ต๋๋ค.
StreamingContainer
์์ ์ค๋์ค์ปจํธ๋กค๋ฌ๊ฐ ๋ ๋๋ง์ด ๋๋ฉด, Person
์์ด์ฝ๊ณผ ChattingContainer
๊ฐ ๋ ๋๋ง ๋๋ ๊ฒ์ด์์ต๋๋ค.
ํ์คํ๊ฒ ์๊ธฐ ์ํด์ ์ฑํ
๊ณผ ๊ด๋ จ๋ div
๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๋ฉด์ React.memo
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์ ์ด์
์ ์งํํ์ต๋๋ค.
export const Chatting = React.memo(function ChatSection() {
const userCount = useSocketStore((state) => state.userCount);
return (
<div className="h-screen bg-grayscale-900 flex-shrink-0 w-[340px] text-grayscale-100 px-8 pt-10 pb-10 flex flex-col">
<div className="flex justify-between items-center mb-4">
<div className="text-2xl font-bold">์ฑํ
</div>
<div className="flex items-center gap-2">
<Person />
<span className="text-lg">{userCount}๋ช
</span>
</div>
</div>
<ChattingContainer />
</div>
);
});
์ฑํ ๋ถ๋ถ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ ์ด์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
ํ์ง๋ง ๋ ๋๋ง์ ๊ณ์ ๋์์ต๋๋ค.
๋ค๋ฅธ ์์ธ์ ์ฐพ์์ผ ํ์ต๋๋ค.
export function StreamingPage() {
const { connect, reset } = useSocketStore();
const { clearMessages } = useChatMessageStore();
const { roomId } = useParams<{ roomId: string }>();
useEffect(() => {
// ์์ผ ์ฐ๊ฒฐ
}, [roomId]);
return (
<div className="flex flex-row h-screen">
<div className="flex-grow min-w-[calc(100%-340px)]">
<NetworkBoundary key={roomId}>
<StreamingContainer />
</NetworkBoundary>
</div>
<Chatting />
</div>
);
}
์ฑํ ์ปดํฌ๋ํธ๋ง ์ป์ ์ฑ๋ก ๋ค์ ์คํธ๋ฆฌ๋ฐ ํ์ด์ง๋ก ๋์์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ํ์ด์ง์ ์ํ ๋ณ์๋ค์ ํ์ธํด๋ดค์ต๋๋ค.
๊ต์ฅํ ์์ํด๋ณด์ด๋ ์ ์ญ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์๋ ์์ผ ํจ์๋ฅผ ์ฐพ์์ต๋๋ค.
ํ์ฌ ์์ผ์ ๊ดํ ๋ด์ฉ์ zustand
๋ฅผ ์ด์ฉํด useSocketStore
๋ก ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์์ต๋๋ค.
๋ฌธ๋ zustand
๋ก ๊ด๋ฆฌํ๋ ์ํ๋ค์ ๋ ๋๋ง์ด ๋ค์ ๋ ๊ฒ์ด๋ค ๋ผ๋ ์๊ฐ์ผ๋ก ํ์ธํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
zustand์์ ์ ์ฒด ์คํ ์ด๋ฅผ ๊ตฌ๋ ํ๊ฒ ๋๋ฉด, ์คํ ์ด์ ๋ด๊ณ ์๋ ๋ชจ๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ตฌ๋ ์ค์ธ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ ๋๋ง ๋๋ค
๋ฐ๋ผ ํน์ state๋ง ๊ตฌ๋ ํด ์ ํ์ ์ฐธ์กฐ๋ฅผ ํตํด ํ์ํ ๊ฒ๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
// ๋ถํ์ํ ๋ ๋๋ง ๋ฐ์
const { clearMessages } = useChatMessageStore();
// ํ์ํ state๋ง ๊ตฌ๋
const clearMessages = useChatMessageStore((state) => state.clearMessages);
ํ์ํ state๋ง ๊ตฌ๋ ์ ํ๋ ์ค์ 2๊ฐ๋ฅผ ์์ฒญํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์์ธ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ ๋์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ณผ์ ์์ ์ํ๊ฐ ๊ณ์ ์ ๋ฐ์ดํธ ๋๋ ๊ฒฝ์ฐ, useEffect๋ ์ํ ์ ๋ฐ์ดํธ ํจ์๊ฐ ์๋ก๋ฅผ ๋ฌดํํ ํธ์ถํ๋ ๊ฒฝ์ฐ ๋ฑ์ด ์์ต๋๋ค.
๋ณ๊ฒฝํ useSocektStore ์ฐธ์กฐ ํจ์์์ zustand selector ํจ์๊ฐ ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฌดํ ์ ๋ฐ์ดํธ ๋ฃจํ๊ฐ ๋ฐ์ํ์ฌ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋๋ค.
๊ฐ๊ฐ ๋ฐ๋ก selector๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง, zustand์ shallow๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
const { connect, reset } = useSocketStore(
useShallow((state) => ({ connect: state.connect, reset: state.reset })),
);
์ฑํ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง๋์ง ์๋ ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค!!
- zustand์ shallow๊ฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋๋ง์ ๋ ๋๋ง์ ์ํจ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
- React Dev Tools์ Profiler ์ฌ์ฉ์ด ๋ฅ์ํด์ก์ต๋๋ค.
- ์ค๊ณ๋ฅผ ๋ ๊ผผ๊ผผํ ํ๋ค๋ฉด ์์ธ ํ์ ์ด ๋ ๋นจ๋์ ๊ฒ ๊ฐ์, ์ปดํฌ๋ํธ ์ค๊ณ์ ์ค์์ฑ์ ๋๋ผ๊ฒ ๋์์ต๋๋ค.
๐ ffmpeg๋ stderr๋ก ๋๋ฒ๊น
์ ํ๋ ์ด์
๐ HLS ํ๋กํ ์ฝ์ ๊ดํ ์ ๋ฆฌ ๋ฐ FFmpeg ์ฌ์ฉ๊ธฐ
๐ ๋นํธ๋ tsconfig.json์ด ์ธ ๊ฐ?
๐ NestJS ๊ธฐ๋ณธ ๊ฐ๋
- Modules
๐ Socket.io ์ต(๊ฐ)์ ํ
๐ ๋์ปค์ nginx์ ์ฌ์ฉ๊ธฐ
๐ ๋ถํํ
์คํธ๋ฅผ ํด๋ณด์
๐ FSD ์ฌ์ฉ๊ธฐ, ๊ทผ๋ฐ ์ด์ ๋๋ง์ ๊ท์น์ ๊ณ๋ค์ธ
๐ CICD ๊ตฌ์กฐ ์์
๐ ์จ๋ฒ ๋จ์๋ก ์คํธ๋ฆฌ๋ฐ ํ๊ธฐ (with HLS)
๐ HLS๋ก ์์
์ฃผ๊ณ ๋ฐ๊ธฐ
๐ vite + react + typescript ํ๊ฒฝ์์ path alias ์ค์
๐ React Scan์ด ๋ญ์ฃ ?
๐ ๋ก์ปฌ ํ๊ฒฝ ๊ฐ๋ฐ ๋ชจ๋ ๋ฐฐํฌ
๐ ์จ๋ฒ ์ ์ฒด๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ค๊ณ ? (with HLS)
๐ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํ
์คํธ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
๐ ์๋ก๊ณ ์นจ ์ HLS ERROR
๐ input ํ๊ทธ์ ํ๊ธ ์
๋ ฅ ํ, Enter๋ฅผ ๋๋ฅด๋ฉด ํจ์๊ฐ ๋๋ฒ ํธ์ถ๋๋ ์ค๋ฅ
๐ nginx proxy pass๋ฅผ ๋ฐ๊ฟจ๋๋ ์๊ธด ์๋ฌ - ์ค์จ๊ฑฐ ์ธ์ ๋ฌธ์
๐ ๋ฐฐํฌ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ-์๋ฒ WS handshake
๐ ๋ ๋๋ง ๋ฒ์ธ์ ํ๋!
๐ ๊ทธ๋ผ์ด๋ ๋ฃฐ
๐ฅ ํ์ ์๊ฐ
๐ ์ฝ๋ & ๊น ์ปจ๋ฒค์
๐ณ ๊น branch ์ ๋ต
๐ ๋
ธ์
๋ฌธ์ ์ ์ฅ์
๐จ ํผ๊ทธ๋ง
๐งโ๐ป ๊ธฐํ ๊ณต์ ๋ฐํ ์๋ฃ
๐ค 2์ฃผ์ฐจ ๋ฐํ ์๋ฃ
๐ ๋ฐฑ๋ก๊ทธ
๐ 1์ฃผ์ฐจ
๐ 2์ฃผ์ฐจ
๐ 3์ฃผ์ฐจ
๐ 4์ฃผ์ฐจ
๐ 5์ฃผ์ฐจ
๐๏ธ 1์ฃผ์ฐจ
๐๏ธ 2์ฃผ์ฐจ
๐๏ธ 3์ฃผ์ฐจ
๐๏ธ 4์ฃผ์ฐจ
๐๏ธ 5์ฃผ์ฐจ
โจ 1์ฃผ์ฐจ
โจ 2์ฃผ์ฐจ
โจ 3์ฃผ์ฐจ
โจ 4์ฃผ์ฐจ