YouTube Data API v3 ํ์ฉ๋ฒ
YouTube์ ์์์ ์๋ ์ ๋ก๋ํ๋ ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ถ์ด์ YouTube Data API v3์ ์์ ์ ๋ก๋, SRT ์๋ง ์ ๋ก๋, ๋ค๊ตญ์ด ์ ๋ชฉ/์ค๋ช ๋ฑ๋ก ํ๋ฆ์ ๊ณต๋ถํด๋ณด์์ต๋๋ค.


YouTube์ ์์์ ์๋ ์ ๋ก๋ํ๋ ์๋น์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ถ์ด์ YouTube Data API v3์ ์์ ์ ๋ก๋, SRT ์๋ง ์ ๋ก๋, ๋ค๊ตญ์ด ์ ๋ชฉ/์ค๋ช ๋ฑ๋ก ํ๋ฆ์ ๊ณต๋ถํด๋ณด์์ต๋๋ค.
Tree-sitter์ MCP๋ก ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ทธ๋ํํํด Claude Code์ Codex์ ๋ฆฌ๋ทฐ ์ปจํ ์คํธ๋ฅผ ์ค์ด๋ code-review-graph์ ์๋ ์๋ฆฌ์ ์ ์ฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
์ธํด์ ํ๋ฉด์ Claude Code์ฉ ๋ฉํ ์คํฌ ํ๋ฌ๊ทธ์ธ Harness๋ฅผ ๊ณต๋ถํ๋ฉฐ, ๋ณต์กํ ์์ ์ ์์ด์ ํธ ํ๊ณผ ์คํฌ๋ก ๋ถํดํ๋ ๋ฐฉ์๊ณผ ์ค์น/์ฌ์ฉ๋ฒ, ๋์ ์ ์ฃผ์์ ์ ์ ๋ฆฌํฉ๋๋ค.
React๋ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ key๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์์์ ์๋ก์ด ์์๋ฅผ ๋งค์นญํ๋ค. index๋ ํญ๋ชฉ์ ์์น ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ ์ฝ์ ์ด๋ ์ญ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ด ๋ฐ๋๊ณ , ์ด๋ก ์ธํด React๊ฐ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ์ปดํฌ๋ํธ๋ก ์ธ์ํด state๋ DOM์ ์๋ชป ์ฌ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ key๋ก๋ index ๋์ ๋ณ๊ฒฝ๋์ง ์๋ ๊ณ ์ ํ id๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๋ค.
๊ฐ์ฒด/๋ฐฐ์ด selector ๋ฆฌ๋ ๋๋ง ์ก๋ ๊ฐ์ฅ ํ์ค์ ์ธ ๋ฐฉ๋ฒ
Vite + React ๋น๋ ๊ฒฐ๊ณผ๋ฅผ vite-plugin-singlefile๋ก ๋จ์ผ HTML์ ์ธ๋ผ์ธํ์ฌ file://, ๋ด๋ถ๋ง, ๋ฉ์ผ ์ฒจ๋ถ ํ๊ฒฝ์์๋ ๋ฐ๋ก ์ด ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
๊ด๋ฆฌ์ ํ์ด์ง์ ๋ธ๋ผ์ฐ์ ์๋ฆผ์ ๋ถ์ด๋ ๊ธฐ๋ณธ ํ ๋ถํฐ, ์ฑํ ์ฒ๋ผ ๋น๋ฒํ ์ด๋ฒคํธ์ ์ฟจ๋ค์ด ํจํด๊น์ง ๋จ๊ณ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
๋ด๋ถ๋ง์ด๋ ์์๋ฐ์ด๋ ์ฐจ๋จ ํ๊ฒฝ์์ npm install ์์ด๋ Node.js ํ๋ก์ ํธ๋ฅผ Docker๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. npm_cache.tar.gz๋ก NPM ์บ์๋ฅผ ๋ฏธ๋ฆฌ ์์นด์ด๋ธํด ์ธ๋ถ ๋ ์ง์คํธ๋ฆฌ ์ ๊ทผ ์์ด ์์กด์ฑ์ ์ค์นํ๊ณ , npm ci์ npm install์ ์ฐจ์ด๊น์ง ์ ๋ฆฌํฉ๋๋ค.
ํ๋ก ํธ์๋ ๋ฌธ์ํ์ ํ์์ฑ๋ถํฐ ์ค๊ณ/ADR, APIยท์ปดํฌ๋ํธ ๋ฌธ์, ์๊ฐ ํ๊ท, a11y, CVE ๋ณด์ ํธ๋ํน
n8n์ ์๊ฐ์ ์ธ ์ํฌํ๋ก์ฐ ์ค๊ณ์ ๊ฐ๋ ฅํ ์๋ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์คํ์์ค ํด์ ๋๋ค. ๋ณธ ๊ธ์์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ์์ ์์, ๋ฐ๋ณต ํ ์คํธ ์๋ํ์ QA ์ ๋ฌด ํจ์จํ๋ฅผ ์ํด n8n์ ์ค๋ฌด์ ์ ์ฉํ ๊ฒฝํ์ ๊ณต์ ํ์์ต๋๋ค.
Redux๋ ์์ธก ๊ฐ๋ฅํ ์ํ ๊ด๋ฆฌ ๋๊ตฌ์ง๋ง, ๋ณต์กํ ์ค์ ๊ณผ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ก ์ธํด ์ฌ์ฉ์ด ๋ถ๋ด์ค๋ฌ์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Zustand๋ Redux์ ํต์ฌ ์ฒ ํ์ธ Flux ํจํด์ ์ ์งํ๋ฉด์, ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ฐํ ๋ฐฉ์์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ธ์์๋ Zustand์ ์ค๊ณ ์ฒ ํ, ์ค์ ์ง์คํ ๊ตฌ์กฐ, Slice Pattern, ๊ทธ๋ฆฌ๊ณ Redux์์ ๊ตฌ์กฐ์ ์ฐจ์ด์ ์ ์ค์ ์ฝ๋ ์์ ์ ํจ๊ป ์ค๋ช ํฉ๋๋ค.
Recoil์ React ์นํ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ง๋ง, ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ๊ตฌ์กฐํ์ ์ด๋ ค์๊ณผ React ์ธ๋ถ ์ํ ์ ๊ทผ์ ์ ์ฝ์ด ๋ถ๋ช ํด์ก์ต๋๋ค. ์ด ๊ธ์์๋ Recoil์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ Zustand๋ก ์ฎ๊ฒจ๊ฐ ๋ฐฐ๊ฒฝ๊ณผ, Zustand๋ฅผ ์ ํํ ๊ฒฐ์ ์ ์ด์ ๋ค์ ์ค๋ช ํฉ๋๋ค.
์นด์นด์คํก, ๋ผ์ธ, ์ธ์คํ๊ทธ๋จ ๋ฑ์ ์ธ์ฑ ๋ธ๋ผ์ฐ์ ์์๋ ์น์ฌ์ดํธ ๊ธฐ๋ฅ์ด ์ ํ๋๊ฑฐ๋ ๋น์ ์ ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๊ธ์์๋ ์ฌ์ฉ์ ์์ด์ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฑ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์งํ๊ณ , ์ฌ์ฉ์๋ฅผ ํฌ๋กฌ ๋๋ ์ฌํ๋ฆฌ ๋ฑ ์ธ๋ถ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ํ๋ ์ฝ๋ ๊ตฌํ ๋ฐฉ์์ ์์ธํ ์ค๋ช ํฉ๋๋ค.
๋ถ์ฒFC FRIEND COMMUNITY ํ๋ก์ ํธ์์ ์ฌ์ฉ์ ์ฑํฅ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ธฐ ์ํด react-chartjs-2๋ฅผ ํ์ฉํด ๋ ์ด๋ ์ฐจํธ๋ฅผ ๊ตฌํํ ๊ฒฝํ์ ์๊ฐํฉ๋๋ค. Chart.js๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ปค์คํฐ๋ง์ด์ง, UX ๊ณ ๋ ค์ฌํญ, ์ฝ๋ ์ค๊ณ๊น์ง ์์ธํ ๋ถ์ํฉ๋๋ค.
OCR ์์คํ ์์ ํน์๊ธฐํธ ์ธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ ํ ํ ํ๋ฆฟ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๊ด์ ์์ ํ์ด๋ธ ๊ธ์ ๋๋ค. ํ ํ๋ฆฟ ํฉํ ๋ฆฌ์ ๋งค๋์ ๊ตฌ์กฐ๋ฅผ ํตํด ๊ธฐ๊ธฐ/์ธ์ด/์์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์ ์ฐํ ํ์ฅ์ ๊ฐ๋ฅ์ผ ํ๊ณ , ์ด๋ฅผ ํตํด ํ๋ก ํธ์๋์ Template Method ํจํด๊ณผ์ ์ ์ฌ์ฑ์ ๋์ถํด๋์ต๋๋ค.
OCR์์ ๋๋ฝ๋๋ ํน์๊ธฐํธ ๋ฌธ์ ๋ฅผ JPEG ํจํดํ ๊ฐ๋ ์์ ์ฐฉ์ํ ํ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ๊ฒฝํ ๊ณต์
XMLHttpRequest, fetch, axios ๋ฑ์ผ๋ก ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ withCredentials ์ต์ ์ CORS ์ ์ฑ , ์ฟ ํค ์ฒ๋ฆฌ์ ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋์ด ์์ต๋๋ค. ์ด ๊ธ์์๋ ํด๋น ์ต์ ์ ์๋ฏธ, ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ์ฌ๋ฐ๋ฅธ ์ค์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์ฃผ์ํด์ผ ํ ๋ณด์ ์ด์๋ฅผ ์ ๋ฆฌํ์ต๋๋ค.
JWT๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๋๋์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ฑ๊ณผ ํธ์์ฑ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. ์ด ๊ธ์์๋ LocalStorage์ ์ฟ ํค์ JWT๋ฅผ ์ ์ฅํด๋ณธ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๊ฐ๊ฐ์ ์ฅ๋จ์ ๊ณผ ์ฃผ์ํ ์ ์ ์ ๋ฆฌํ๊ณ , XSS, CSRF ๋ฑ ์ฃผ์ ๊ณต๊ฒฉ์ ๋ํ ๋์ ๋ฐฉ์์ ์ค๋ช ํฉ๋๋ค.
์น์ฌ์ดํธ์ ์ด๋ฏธ์ง ์ต์ ํ๋ ์ฌ์ฉ์ ๊ฒฝํ, ์๋, SEO์ ๋ชจ๋ ์ํฅ์ ๋ฏธ์น๋ ์ค์ํ ์์์ ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฏธ์ง ํ์ ์ ํ๋ถํฐ ์์ถ ๋๊ตฌ ํ์ฉ, ๋ฐ์ํ ์ด๋ฏธ์ง ์ค์ , Lazy Loading, CDN, ์ ๊ทผ์ฑ ๊ฐ์ ๊น์ง ์น ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ํ ์ค์ ํ์ ์ ๋ฆฌํ์ต๋๋ค.
์ ๊ทํํ์์ ๋ฌธ์์ด์์ ํน์ ํจํด์ ์ฐพ๊ณ ๋์ฒดํ๋ฉฐ ์ถ์ถํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ค์ฌ์ผ๋ก ์ ๊ทํํ์์ ์ฃผ์ ๋ฉํ๋ฌธ์, ๋ฐ๋ณต ํจํด, ์ ๋ฐฉ/ํ๋ฐฉํ์, ํ์์ ๋งค์นญ๊ณผ ๋นํ์์ ๋งค์นญ๊น์ง ๋ค์ํ ์ค์ ์์ ์ ํจ๊ป ํต์ฌ ๊ฐ๋ ์ ์ ๋ฆฌํ์ต๋๋ค.
React์์ ์ฌ์ฉ์ ์ ๋ ฅ ํผ์ ๊ด๋ฆฌํ ๋ ์ํ ์ฒ๋ฆฌ, ์ ํจ์ฑ ๊ฒ์ฌ, ์ ์ถ ๋ก์ง ๋ฑ์ด ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ Formik ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง, ์ฝ๋ ์์ ์ ๋ค๋ฅธ ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋น๊ต๋ฅผ ํตํด ์ค๋ช ํ๊ณ , Formik์ ์ ํํ ๋ ๊ณ ๋ คํ ์ ์๋ ์ฃผ์ ์ฅ์ ์ ์ ๋ฆฌํ์ต๋๋ค.
์ฝ๋งค์นญ(ver3): ํ๋ก์ ํธ ํ๊ณ
CRA ๋ง๊ณ Vite๋ก React ์ค์ ํ๊ธฐ
UseEffect๊ฐ ๋๋ฒ ์คํ๋๋ ์ด์
React์์ ์คํฌ๋กค ์์น ์ ์งํ๊ธฐ
Recoil๋ก ๊ฐํธํ ์ํ ๊ด๋ฆฌํ๊ธฐ
๋ธ๋ผ์ฐ์ ์ ๋จ์ผ ๋๋ ๋์ผ ๋ชจ๋ํฐ ํ๊ฒฝ์์ window.open()์ ์ฌ์ฉํ์ฌ ํ์ ์ฐฝ์ ํ๋ฉด ์ค์์ ์ ํํ๊ฒ ์์น์ํค๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
npm, pnpm, npx, yarn ์ ๋ฆฌ
git ๋ช ๋ น์ด ์ ๋ฆฌ
์ React์ธ๊ฐ
Vanilla-extract ์ฌ์ฉ ์ด์
์ฝ๋งค์นญ(ver2): ํ๋ก์ ํธ ํ๊ณ
์ฝ๋งค์นญ(ver1.5): ํ๋ก์ ํธ ํ๊ณ
์ฝ๋งค์นญ(ver1): ํ๋ก์ ํธ ํ๊ณ
COMATCHING ํ์ ๋ฐฐ๊ฒฝ
Share-it: ํ๋ก์ ํธ ํ๊ณ
Share-it ํ๋ก์ ํธ์ ํ์ ๋ฐฐ๊ฒฝ
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ํ๊ธฐ