Remotion ๊ฐ์ด๋
React๋ก ๋น๋์ค๋ฅผ ๋ง๋๋ Remotion ํ๋ ์์ํฌ ์์ ๊ฐ์ด๋
๐ฌ ๊ธฐ์ด
Remotion โ React๋ก ๋น๋์ค๋ฅผ ๋ง๋๋ ํ๋ ์์ํฌ
JSX ์ปดํฌ๋ํธ๊ฐ ๊ณง ๋น๋์ค ํ๋ ์์ด ๋๋ ํ๋ก๊ทธ๋๋งคํฑ ๋น๋์ค ์์ฑ
Remotion์ React ์ปดํฌ๋ํธ๋ฅผ ํ๋ ์ ๋จ์๋ก ๋ ๋๋งํ์ฌ MP4/WebM ๋น๋์ค๋ฅผ ์์ฑํ๋ ์คํ์์ค ํ๋ ์์ํฌ. After Effects๋ Premiere ๋์ ์ฝ๋๋ก ๋น๋์ค๋ฅผ ๋ง๋ค ์ ์์ด, ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๋๋ ๋น๋์ค ์์ฑ, ์๋ํ๋ ์์ ๋ฏธ๋์ด ์ฝํ ์ธ , SaaS ๋น๋์ค ๊ธฐ๋ฅ ๊ตฌํ์ ์ ํฉ
Remotion ๋ด๋ถ ์ํคํ ์ฒ โ ํ๋ ์์ ๋น๋์ค๋ก ๋ฐ๊พธ๋ ํ์ดํ๋ผ์ธ
Headless Chrome โ ์คํฌ๋ฆฐ์ท โ FFmpeg ์ธ์ฝ๋ฉ๊น์ง์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ ํด๋ถ
Remotion์ ๋ ๋๋ง์ 3๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง: (1) Webpack/esbuild๋ก React ๋ฒ๋ค ์์ฑ (2) Puppeteer๋ก Headless Chrome์์ ๊ฐ ํ๋ ์ ์คํฌ๋ฆฐ์ท (3) FFmpeg๋ก ์ด๋ฏธ์ง ์ํ์ค๋ฅผ MP4/WebM์ผ๋ก ์ธ์ฝ๋ฉ. ์ด ํ์ดํ๋ผ์ธ์ด ์ฝ๋๋ฅผ ๋น๋์ค๋ก ๋ฐ๊พธ๋ ํต์ฌ
Remotion Composition โ ๋น๋์ค์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ
Composition, Sequence, Series๋ก ์ฅ๋ฉด์ ์กฐํฉํ๋ ์ ์ธ์ ๋น๋์ค ๊ตฌ์กฐํ
Remotion์์ ๋น๋์ค๋ Composition(์ต์์ ์ปจํ ์ด๋) โ Sequence(์๊ฐ ๊ตฌ๊ฐ ๋ถํ ) โ ๊ฐ๋ณ ์ปดํฌ๋ํธ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋จ. ๋ง์น React์์ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ค๊ณํ๋ฏ, ๋น๋์ค์ ์๊ฐ์ถ์ ์ ์ธ์ ์ผ๋ก ๊ตฌ์กฐํํ ์ ์์
๐ฏ ์ ๋๋ฉ์ด์ & ๋ฏธ๋์ด
Remotion ์ ๋๋ฉ์ด์ โ spring()๊ณผ interpolate()๋ก ๋ชจ์ ๋ง๋ค๊ธฐ
๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ์คํ๋ง๊ณผ ๋ณด๊ฐ ํจ์๋ก ์์ฐ์ค๋ฌ์ด ๋น๋์ค ์ ๋๋ฉ์ด์ ๊ตฌํ
Remotion์ CSS transition ๋์ ํ๋ ์ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉ. spring()์ ๋ฌผ๋ฆฌ ์์ง ๊ธฐ๋ฐ์ผ๋ก ์์ฐ์ค๋ฌ์ด ๋ฐ์ด์ค/๊ฐ์์, interpolate()๋ ํ๋ ์ ๋ฒ์๋ฅผ ์์์ ๊ฐ ๋ฒ์๋ก ๋งคํ. ๋ ํจ์ ์กฐํฉ์ผ๋ก ์ ๋ฌธ์ ์ธ ๋ชจ์ ๊ทธ๋ํฝ ๊ตฌํ ๊ฐ๋ฅ
Remotion ์ค๋์ค & ์๋ง โ ์ฌ์ด๋์ ๋น์ฃผ์ผ์ ๋๊ธฐํ
<Audio>, <OffthreadVideo>, useAudioData()๋ก ์ค๋์ค/๋น๋์ค ์์ค๋ฅผ ํ๋ ์์ ๋๊ธฐํ
Remotion์ ์ค๋์ค๋ฅผ ํ๋ ์ ๋จ์๋ก ์ ์ด ๊ฐ๋ฅ. <Audio>๋ก BGM/ํจ๊ณผ์์ ์ฝ์ ํ๊ณ , useAudioData()๋ก ํํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋น์ฃผ์ผ๋ผ์ด์ ๊ตฌํ. <OffthreadVideo>๋ก ๊ธฐ์กด ๋น๋์ค๋ฅผ ํฉ์ฑํ๊ณ , @remotion/captions๋ก ์๋ง์ ํ๋ ์ ์ ๋ฐ๋๋ก ๋๊ธฐํ
๐ ํ๋ก๋์
Remotion ๋ฐ์ดํฐ ๋๋ฆฌ๋ธ ๋น๋์ค โ API/DB ๋ฐ์ดํฐ๋ก ๋น๋์ค ์๋ ์์ฑ
calculateMetadata + delayRender๋ก ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋น๋์ค์ ์ฃผ์ ํ๋ ํจํด
์ ์ ๋น๋์ค๋ฅผ ๋์ด, API ์๋ต์ด๋ DB ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋์ค๋ฅผ ๋์ ์์ฑํ๋ ํจํด. calculateMetadata๋ก ๋ ๋๋ง ์ ๋ฐ์ดํฐ๋ฅผ fetchํ๊ณ , getInputProps()๋ก ์ปดํฌ๋ํธ์ ์ฃผ์ . delayRender()๋ก ๋น๋๊ธฐ ๋ก๋ฉ ์๋ฃ๋ฅผ ๋ณด์ฅํ์ฌ ๋น ํ๋ ์ ์์ด ์์ ํ ๋ ๋๋ง ๊ฐ๋ฅ
Remotion Lambda โ AWS์์ ์์ฒ ๊ฐ ๋น๋์ค๋ฅผ ๋ณ๋ ฌ ๋ ๋๋ง
Lambda ํจ์๊ฐ ํ๋ ์์ ๋ถ์ฐ ๋ ๋๋งํ๊ณ S3์์ ๊ฒฐํฉํ๋ ์๋ฒ๋ฆฌ์ค ๋น๋์ค ํ์ดํ๋ผ์ธ
Remotion Lambda๋ ๋น๋์ค ๋ ๋๋ง์ AWS Lambda๋ก ๋ถ์ฐ ์ฒ๋ฆฌ. ํ๋์ ๋น๋์ค๋ฅผ N๊ฐ ์ฒญํฌ๋ก ๋ถํ ํ์ฌ N๊ฐ Lambda๊ฐ ๋์ ๋ ๋๋ง โ S3์์ ์ฒญํฌ๋ฅผ ๊ฒฐํฉํ์ฌ ์ต์ข ๋น๋์ค ์์ฑ. ๋ก์ปฌ์์ 10๋ถ ๊ฑธ๋ฆฌ๋ ๋ ๋๋ง์ 1๋ถ ์ด๋ด๋ก ๋จ์ถ ๊ฐ๋ฅ
Remotion Player โ ์น ๋ธ๋ผ์ฐ์ ์์ ๋น๋์ค๋ฅผ ์ค์๊ฐ ์ฌ์
@remotion/player๋ก React ์ฑ์ ์ธํฐ๋ํฐ๋ธ ๋น๋์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์๋ฒ ๋
Remotion Player๋ ๋ ๋๋ง ์์ด React ์ปดํฌ๋ํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ค์๊ฐ ๋น๋์ค์ฒ๋ผ ์ฌ์ํ๋ ์ปดํฌ๋ํธ. ์ฌ์ฉ์๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ๋ฉด ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ด, SaaS ๋น๋์ค ์๋ํฐ๋ ๋น๋์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ํ์ฉ
Remotion ์ค์ ํ โ ํ๋ก๋์ ๋น๋์ค ํ๋ก์ ํธ์ ๋ฒ ์คํธ ํ๋ํฐ์ค
ํ๋ก์ ํธ ๊ตฌ์กฐ, ์ฑ๋ฅ ์ต์ ํ, ๋๋ฒ๊น , ๋ฐฐํฌ๊น์ง ์ค์ ๋ ธํ์ฐ ๋ชจ์
Remotion ํ๋ก์ ํธ๋ฅผ ํ๋ก๋์ ์์ ์ด์ํ๋ฉด์ ์ป์ ์ค์ ํ: ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ, ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ(prefetch, ์ด๋ฏธ์ง ์ต์ ํ, ๋ฉ๋ชจ์ด์ ์ด์ ), ๋๋ฒ๊น ๊ธฐ๋ฒ, CI/CD ํ์ดํ๋ผ์ธ ์ค๊ณ, ์ผ๋ฐ์ ์ธ ์ค์์ ํด๊ฒฐ๋ฒ
๐ Remotion ์ฝ๋ ์ฝ๊ธฐ
Remotion ์ฝ๋ ๋ถ์ โ Bundle ์์คํ ๊ณผ Webpack/esbuild ํตํฉ
bundle()์ด React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ๊ฐ๋ฅํ HTML๋ก ๋ณํํ๋ ๊ณผ์ ์ ์์ค ์ฝ๋๋ก ์ถ์
Remotion ๋ ๋๋ง์ ์ฒซ ๋จ๊ณ์ธ ๋ฒ๋ค๋ง์ ์์ค ์ฝ๋ ๋ ๋ฒจ์์ ๋ถ์. packages/bundler/์ Webpack ์ค์ , packages/studio/์ esbuild ์ค์ , ๊ทธ๋ฆฌ๊ณ CompositionManager๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ณผ์ ๊น์ง. ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ React ํ๋ก์ ํธ๊ฐ ์ด๋ป๊ฒ Headless Chrome์์ ์คํ ๊ฐ๋ฅํ HTML๋ก ๋ณํ๋๋์ง ์ดํด
Remotion ์ฝ๋ ๋ถ์ โ renderMedia()์ ํ๋ ์ ๋ ๋๋ง ๋ฃจํ
Puppeteer๋ก ๊ฐ ํ๋ ์์ ์คํฌ๋ฆฐ์ทํ๊ณ FFmpeg๋ก ํฉ์น๋ ๋ ๋๋ง ํต์ฌ ๋ฃจํ๋ฅผ ์์ค ์ฝ๋๋ก ๋ถ์
packages/renderer/์ renderMedia() โ renderFrames() โ stitchFramesToVideo() ์ฒด์ธ์ ์ถ์ . Puppeteer๊ฐ Chrome ํ์ด์ง์ currentFrame์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ, delayRender/continueRender์ ๊ตฌํ, ๋ฉํฐ์ค๋ ๋ ํ๋ ์ ๋ถ๋ฐฐ, FFmpeg ์คํฐ์นญ๊น์ง์ ์ ์ฒด ๋ ๋๋ง ํ์ดํ๋ผ์ธ
Remotion ์ฝ๋ ๋ถ์ โ Sequence์ ํ์๋ผ์ธ ์๊ฐ ๊ด๋ฆฌ์ ๊ตฌํ
SequenceContext๋ก ๋ก์ปฌ ํ์์ ๊ตฌํํ๋ ๋ด๋ถ ๋ฉ์ปค๋์ฆ๊ณผ useCurrentFrame()์ ๋์ ์๋ฆฌ
Remotion์ ์๊ฐ ๊ด๋ฆฌ ํต์ฌ์ SequenceContext. <Sequence from={60}>์ด ์์ ์ปดํฌ๋ํธ์ frame์ 0์ผ๋ก ๋ฆฌ์ ํ๋ ๋ก์ปฌ ํ์์ React Context๋ก ๊ตฌํ. useCurrentFrame()์ SequenceContext์ ์ค์ฒฉ์ ๊ณ ๋ คํ์ฌ ์ต์ข ํ๋ ์์ ๊ณ์ฐ. ์ด ํจํด์ด ์ฅ๋ฉด์ ๋ ๋ฆฝ์ ๊ฐ๋ฐ๊ณผ ์์ ๋ก์ด ๋ฐฐ์น๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ
Remotion ์ฝ๋ ๋ถ์ โ spring() ๋ฌผ๋ฆฌ ์์ง์ ๋ด๋ถ ๊ตฌํ
๊ฐ์ ์คํ๋ง ๋ฏธ๋ถ๋ฐฉ์ ์์ JavaScript๋ก ์๋ฎฌ๋ ์ด์ ํ๋ spring()์ ์ํ๊ณผ ์ฝ๋
spring()์ ๋จ์ํ ์ด์ง ํจ์๊ฐ ์๋๋ผ ์ค์ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ . ๊ฐ์ ์คํ๋ง(damped harmonic oscillator)์ ๋ฏธ๋ถ๋ฐฉ์ ์์ ๋งค ํ๋ ์ ์์น์ ์ผ๋ก ํ์ด 0โ1 ๊ฐ์ ์์ฑ. mass, damping, stiffness ํ๋ผ๋ฏธํฐ๊ฐ overdamped/underdamped/critically damped ์ค ์ด๋ค ํด๋ฅผ ์ ํํ๋์ง ๊ฒฐ์
๐ก ์ค์ ํ์ฉ
Remotion vs Sora vs Runway โ ๋น๋์ค ์์ฑ ํด ๋น๊ต์ ์ ํ ๊ธฐ์ค
์ฝ๋ ๊ธฐ๋ฐ vs AI ์์ฑ vs ์ ํต ํธ์ง โ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ๊ฐ์ ๊ณผ ์ ํฉํ ์ฉ๋ ์ ๋ฆฌ
๋น๋์ค ์์ฑ ํด์ 3๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ก ๋๋จ: (1) ์ฝ๋ ๊ธฐ๋ฐ(Remotion, Motion Canvas) โ ๋ชจ์ ๊ทธ๋ํฝ/๋ฐ์ดํฐ ๋น์ฆ์ ์ต์ (2) AI ์ด๋ฏธ์ง ์์ฑ(Sora, Runway, Kling) โ ์ค์ฌํ/์๋ค๋งํฑ์ ์ต์ (3) ์ ํต ํธ์ง(Premiere, DaVinci) โ ๋ชจ๋ ์์์ ๋์. Remotion์ ์ฌํ์ฑ 100%, ์์ ํ ์ปค์คํฐ๋ง์ด์ง, ๋๋ ์๋ ์์ฑ์ ๊ฐ์
Remotion ํธ๋ฌ๋ธ์ํ โ ์์ฃผ ๋ฐ์ํ๋ ์๋ฌ์ ํด๊ฒฐ๋ฒ
๋ ๋๋ง ์๋ ์ ํ, delayRender ํ์์์, useState ๋ฌดํ ๋ฃจํ ๋ฑ ์ค์ ์๋ฌ ๋ชจ์
Remotion ๊ฐ๋ฐ ์ค ์์ฃผ ๋ง๋๋ 5๊ฐ์ง ์๋ฌ์ ํด๊ฒฐ๋ฒ ์ ๋ฆฌ: (1) ๋ ๋๋ง์ด ๋๋ฆผ โ concurrency ์ฆ๊ฐ/Lambda ์ฌ์ฉ (2) delayRender ํ์์์ โ continueRender ํธ์ถ ๋๋ฝ (3) useState ๋ฌดํ ๋ฃจํ โ useCurrentFrame + interpolate ์ฌ์ฉ (4) CSS ์ ๋๋ฉ์ด์ ๋ฏธ์๋ โ Remotion API ์ฌ์ฉ (5) Lambda ์น๋ผ์ธ ํค โ concurrency ์กฐ์
Claude Code ร Remotion โ AI๋ก ๋น๋์ค ์ฝ๋๋ฅผ ์์ฑํ๋ ํ๋กฌํํธ ํ ํฌ๋
ํจ๊ณผ์ ์ธ ํ๋กฌํํธ ๊ตฌ์กฐ์ 5๊ฐ์ง ์ค์ ํ๋กฌํํธ ์์๋ก ๋น๋์ค ๊ฐ๋ฐ ๊ฐ์
Claude Code๋ก Remotion ๋น๋์ค ์ฝ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๋ ํ๋กฌํํธ ํ ํฌ๋. ํ๋กฌํํธ์ ํฌํจํ 4๊ฐ์ง ์์(๋น๋์ค ์ข ๋ฅ, ์๊ฐ ์์, ์ ๋๋ฉ์ด์ , ๊ธธ์ด)์ 5๊ฐ์ง ์ค์ ํ๋กฌํํธ ์์: ๋ก๊ณ ์ ๋๋ฉ์ด์ , ๋ฐ์ดํฐ ๋น์ฃผ์ผ๋ผ์ด์ ์ด์ , ํ์ดํ๋ผ์ดํฐ ํ ์คํธ, ํธ๋์ง์ , ํํฐํด ์ดํํธ