Re-Direction์ ๊ฐ๋ก ์์์ ํผ์ฌ์ฒด์ ์์ง์์ ๋ถ์ํด์ ์ธ๋ก ์์์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
Deployed website | Frontend Repository | Backend Repository
- ๐ Preview
- ๐ Tech Stacks
- ๐ฅ Motivation
- ๐น๏ธ Features
- ๐ Challenges
- 1. ์ด๋ป๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ชจ์ ๋ถ์์ ํ ์ ์์๊น?
- 2. ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ๋น๋์ค์ ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ
- 3. ๊ฒฐ๊ณผ์์์ ์ต์ ํํ์ฌ ์ ์ ๋ง์กฑ๋ ๋์ด๊ธฐ
- 4. ๊ธ๊ท์ ์คํฐ์ปค๋ฅผ ์ด๋ป๊ฒ ์์์ ์ฝ์ ํ ๊น?
- 5. ๊ตฌ์กฐ๋ฅผ ์ต์ ํํ์ฌ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ
- ๐ Schedule
- ๐ํ๋ก์ ํธ ์๊ฐ
์์ฆ์ ํธ๋ ๋์ธ ์ธ์คํ๊ทธ๋จ์ ์คํ ๋ฆฌ๋ ํฑํก์ ๊ฐ๋ก์์์ ์ฌ๋ฆฌ๋ ค๊ณ ํ ๋๋ฉด ๊ทธ ์ค์ ๊ฐ์ฅ ๋ง์ ๋๋ ์ธ๋ก๊ตฌ๊ฐ์ ์ ํํ๋ฉด์ ๋๊ฐํ๋ ์ ์ด ์์ ๊ฒ์
๋๋ค. ์ถค์ ์ถ๋ ์น๊ตฌ๊ฐ ์ข์ฐ๋ก ํฌ๊ฒ ์์ง์ด๊ฑฐ๋, ๊ฒฐํผ์์์ ์
์ฅํ๋ ๋ถ๋ถ๊ฐ ์ฐ์ธก ๋์์ ์ข์ธก ๋์ผ๋ก ์ด๋์ ํ๋ค๋ฉด, ์ ๋ฌธ ์์ํธ์ง ํ๋ก๊ทธ๋จ์ด ์ ๊ณตํ๋ ๋ชจ์
ํธ๋ํน์ ์ด์ฉํ์ง ์๋ ์ด์ ์ ๋นํ ์ธ๋ก๊ตฌ๊ฐ์ ๊ณ ๋ฅด๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์์ ๊ฐ์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก, ์ผ๋ฐ์ธ๋ค๋ ์์ฝ๊ฒ ๊ฐ๋ก์์์ ํ์ด๋ผ์ดํธ ๊ตฌ๊ฐ๋ง์ ๊ณจ๋ผ์ ์ธ๋ก์์์ผ๋ก ๋ณํํ ์ ์๋ ํด์ ๋ง๋ค ์๋ ์์์ง ๊ณ ๋ฏผํ๊ฒ ๋์์ต๋๋ค. ์ด๋ฒ์ ์งํํ ํ๋ก์ ํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์์ ํธ๋๋๊ฐ ๊ฐ๋ก์์ ์ธ๋ก๋ก ๋ฐ๋์ด๊ฐ๋ ํ์ฌ์ ๋ง์ ๋ถ๋ค์ด ํ์๋ก ํ์ง ์์๊น ํฉ๋๋ค. ๋ํ AI ์์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ผ๋ก ๋ชจ์
์ ๋ถ์ํด๋ณธ๋ค๋ ์ ์์ ๋์ ์๊ตฌ๋ฅผ ๋ถ๋ฌ์ผ์ผ์ผฐ๊ณ , ์ด์ ์ ์์๊ณผ ์ ๋๋ฉ์ด์
์ ์ ์ํ ๊ฒฝํ์ด ์์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ํตํด ๋น๋์ค๋ฅผ ์ง์ ๋ณํํ๋ ๋ฒ์ ์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด ๋ฐฐ์๋ณธ๋ค๋ ์ ์์ ๊ฐํ ๋๊ธฐ๋ถ์ฌ๊ฐ ๋์์ต๋๋ค.
- ์ฌ์ฉ์๋ Upload your video๋ฒํผ์ ํด๋ฆญํด์ ๋์์์ ๊ณ ๋ฅด๊ฑฐ๋ ๋๋๊ทธ์ค๋๋์ ํ์ฌ ๋์์ ์
๋ก๋๋ฅผ ํ ์ ์์ต๋๋ค.
- ์ต๋ ํ์ผ ์ฌ์ด์ฆ๋ 100MB์ด๋ฉฐ, ๋์์ ํฌ๋งท๋ง ์ ๋ก๋ ๊ฐ๋ฅํฉ๋๋ค. ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋ ํ์ผ์ด ์ ๋ก๋ ๋ ๊ฒฝ์ฐ, ๊ด๋ จ ์๋ด๋ฌธ๊ตฌ๊ฐ ์ฐ์ฌ์ง ํ์ด์ง๋ก ์ด๋๋ฉ๋๋ค.
- ์ฌ์ฉ์๋ ๋ชจ์
ํํธ๋งต์ ํตํด ๋ชจ์
๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ์ํ๋ ๊ตฌ๊ฐ๊ณผ ์๋ฏผ๋๋ฅผ ์ปจํํ ์ ์์ต๋๋ค.
- ๋ชจ์ ํธ๋ํน์ ์ ์ฉํ๊ณ ์ถ์ ๊ตฌ๊ฐ์ ์ค์ ํด์ฃผ๋ฉด ์ด ๊ตฌ๊ฐ๋ด์ ๋ชจ์ ๋ง ์ถ์ ํ์ฌ ์ธ๋ก์์์ด ์์ฑ๋ฉ๋๋ค.
- ๋ชจ์
ํธ๋ํน ์๋ฏผ๋๋ฅผ sensitive, medium, modest ์ค์์ ์ทจํฅ์ ๋ฐ๋ผ ์ค์ ํด์ค๋๋ค.
- sensitive: ๋ชจ์ ์ ๋น ๋ฅด๊ฒ ์ถ์ ํ๋ ๋ค์ ์ฐ๋งํ ์ ์์ต๋๋ค.
- modest: ๋ชจ์ ์ ์ฒ์ฒํ ์ถ์ ํ๋ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์ต๋๋ค.
- ์ฌ์ฉ์๋ ๊ฒฐ๊ณผ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฌธ๊ตฌ์ ์คํฐ์ปค๋ฅผ ์ ํํ์ฌ ์์์ ๊พธ๋ฏธ๊ณ ์ปจํํ ์ ์์ต๋๋ค. ๊พธ๋ฏธ๊ธฐ๋ฅผ ์์น์์ผ๋ฉด ๊ทธ๋๋ก ์ปจํ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- ์ฐ์ธก์๋จ์ ์คํผ์ปค๋ฒํผ์ ํด๋ฆญํ์ฌ ์๋ฆฌ๋ฅผ ์ผ๊ฑฐ๋ ๋ ์ ์์ต๋๋ค.
- ๋ฌธ๊ตฌ๋ ์ด 8๊ฐ์ง ํฐํธ๊ฐ ์ค๋น๋์ด ์์ผ๋ฉฐ ๋๋๊ทธ์ค๋๋์ ํตํด ์์ ๋กญ๊ฒ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ํ์ฌ ์์ด๋ง ์ง์ํ๊ณ ์์ต๋๋ค.
- ์์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (๋นจ๊ฐ, ํ์, ํ๋, ๊ฒ์ )
- ๋ฐฐ๊ฒฝ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (ํ์, ๊ฒ์ , ํฌ๋ช )
- ์คํฐ์ปค๋ ์ด 9๊ฐ์ง ๋์์ธ์ด ์ค๋น๋์ด ์์ผ๋ฉฐ ๋๋๊ทธ์ค๋๋์ ํตํด ์์ ๋กญ๊ฒ ๋ฐฐ์นํ ์ ์์ต๋๋ค.
- ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ด ์๋์ผ๋ก ๋ค์ด๋ก๋๋์ด download ํด๋์ ์ ์ฅ๋ฉ๋๋ค. ์ฌ์ฉ์๋ .mp4 ํ์ฅ์์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ข์ธก ์๋จ์ ๋ก๊ณ ๋ฅผ ํด๋ฆญํ๊ฑฐ๋ try with another video?๋ฅผ ํด๋ฆญํ๋ฉด ๋ฉ์ธํ์ด์ง๋ก ๋์๊ฐ๋๋ค.
3์ฐจ์์ ๊ณต๊ฐ์์์ ์ฌ๋ฌผ์ด ์ด๋ํ๋ ๊ฒ์ ์ฐ๋ฆฌ๋ โ์์ง์โ์ด๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ฉด ์ ์์๋งค์ฒด์์ โ์์ง์โ์ ์ด๋ป๊ฒ ์ ์ ๋ ์ ์์๊น์?
์์๋ ๋ง์ ์์ ์ด๋ฏธ์ง๊ฐ ์ฐ์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ ํํ์ฌ ํ๋ฉด์ด ์์ง์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋๋ ๋์งํธ๋งค์ฒด์ ๋๋ค. ์ด๋ฌํ ์์์ ์ด๋ฃจ๋ ์ฐ์๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ ์์ด๋ผ๊ณ ํฉ๋๋ค. ํ์ฌ ๋ณด๊ณ ์๋ ํ๋ ์๊ณผ ๋ค์์ ์ฌ ํ๋ ์, ๊ทธ ์ฌ์ด์ โ๊ฒฉ๋ ฌํ ์์ ๋ณํโ๊ฐ ์๋ค๊ณ ํ ๋, ํ๋ฉด์ ๋จ์ํ ํ์ํ๋ ์๊น์ ๋ฐ๊พผ๊ฒ์ ๋ถ๊ณผํ์ง๋ง ์ฌ๋์ ์ด๋ฅผ ๋ณด๊ณ โ์์ง์โ์ด๋ผ๊ณ ์ธ์ํฉ๋๋ค.
์ ๋ ์ด ๊ฐ๋ ์ ์ฐฉ์ํด์, ์์์ ๋ณํ๊ฐ ์ผ๋ง๋งํผ์ ๋ฉด์ ์์, ์ผ๋ง๋ ๊ฒฉ๋ ฌํ๊ฒ ์ผ์ด๋ฌ๋์ง๋ฅผ ๋ถ์ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ ์ถฉ๋ถํ ๋ชจ์ ๋ถ์์ด ๊ฐ๋ฅํ์ง ์์๊น ์๊ฐํ์ต๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ผ๋ก๋ ๋ฉํฐ๋ฏธ๋์ด ํ์ผ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ด, ์ด๋ป๊ฒ ํ๋ก์ ํธ๋ฅผ ์์ํด์ผํ ์ง ๋ง๋งํ์ต๋๋ค.
๋ฐ๋ผ์ ์กฐ์ฌ๋ฅผ ์งํํ์ฌ ์คํ์์ค ๋ฉํฐ๋ฏธ๋์ด ํ๋ ์์ํฌ์ธ FFmpeg์ ์กด์ฌ๋ฅผ ์๊ฒ ๋์์ต๋๋ค. FFmpeg๋ npm ํจํค์ง๊ฐ ์๋๊ธฐ ๋๋ฌธ์, ์ปค๋งจ๋๋ฅผ ํตํด ์ํธ์์ฉํ๊ธฐ ์ํด์ Node.js ๋ด์ฅ๋ชจ๋์ธ child_process
์ ํ์ฉํ์ต๋๋ค.
๋ํ ๋์์ํ์ผ์ ๋ฉํ ๋ฐ์ดํฐ๋ ๊ฐ๋ก ์ธ๋ก ํฌ๊ธฐ ๊ฐ์ ๊ท๊ฒฉ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ FFmpeg๊ฐ ์ ๊ณตํ๋ ๋๊ตฌ์ธ FFprobe๋ฅผ ์ด์ฉํด์ผํ์ต๋๋ค.
๋ค์์ผ๋ก, FFmpeg๋ก ์ถ์ถํ ํ๋ ์ ์ด๋ฏธ์ง์ ํฝ์
์ ๋ถ์ํ๊ธฐ ์ํด์๋ ์ด๋ค ๊ธฐ์ ์ด ํ์ํ ์ง ์กฐ์ฌ๋ฅผ ํ ๊ฒฐ๊ณผ, Canvas API์ getImageData()
์ ๋ธ๋ ๋ฉ์ ์ํ ์์ฑ์ธ globalCompositeOperation
์ ์ด์ฉํ ์์๊ฐ ๋ง์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๋ฌด๊ฑฐ์ด ๋ฉํฐ๋ฏธ๋์ด ํ์ผ์ ๋ค๋ฃจ๋ ํน์ง์ด ์๋ค๋ณด๋ ํด๋ผ์ด์ธํธ์์ ์ผ๋ จ์ ํต์ ์์ ์๋ฐฑ, ์์ฒ๊ฐ์ ๋ฌํ๋ ์ด๋ฏธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ผ์ ํผํ๊ณ ์ถ์์ต๋๋ค. ๋ํ ์์์ ๋ถํด => ์ฒ๋ฆฌ => ์ฌ์กฐ๋ฆฝํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๊น์ง์ ๊ณผ์ ์์ ์ ์ ์๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ ๋ํ์ฌ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์ํธ์์ฉํ๋ ๊ณผ์ ์ด ์๋ ์ ๋ ๊ณ ๋ คํ์ฌ, Canvas API๋ ์ ํ์ง์์ ์ ์ธํ์์ต๋๋ค.
์๋ฒ์ฌ์ด๋์ธ Node.js์์ ์ด์ฉ๊ฐ๋ฅํ ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๋ค ๊ฒ๋ค์ด ์์ ์ง ์กฐ์ฌํด๋ณด์, ๋ํ์ ์ผ๋ก Jimp์ Sharp๊ฐ ์๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ๋จ์ ์ ๋น๊ตํด๋ณด์์ผ๋ C๋ก ๊ฐ๋ฐ๋ Sharp๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ ๋ฒค์น๋งํน ์ ์๊ฐ ์๋์ ์ผ๋ก ๋์, ์๋ง์ ๋น๋์ค ํ๋ ์์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผํ๋ ํ๋ก์ ํธ์ ๋ฑ ๋ง๊ฒ ๋ค๊ณ ํ๋จํ์ฌ ์ฑํํ์์ต๋๋ค. ๋ํ Sharp๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ Canvas API์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ธ๋ ๋ฉ์ ์ํ composite ๋ด์ฅ๋ฉ์๋๋ ์กด์ฌํ์๊ธฐ์ Canvas API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง ๋ชจ์ ๋ถ์์ ๊ณผ์ ์ ๊ทธ๋๋ก ์คํ์ํฌ ์ ์์ผ๋ฆฌ๋ผ ์๊ฐํ์ต๋๋ค.
composite๋ ๋ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋๋ก, ์ต์ ์ผ๋ก "difference"๋ฅผ ์ฃผ์ด ๋ ์ด๋ฏธ์ง ์ฌ์ด์ ๋ฌ๋ผ์ง ๋ถ๋ถ์ด ๊ฐ์กฐ๋๋๋ก ํ ์ ์์ต๋๋ค.
๐บ difference์ต์
์ ์ ์ฉํ ํฉ์ฑ์ด๋ฏธ์ง
์์ง์์ด ๊ฑฐ์ ์๋ ํฝ์ ์ ์ด๋์ด ์๊น์ ๋๊ณ ์์ง์์ด ๋ง์ ํฝ์ ์ ๋ฐ์ ์๊น์ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. RGB๋ ํฝ์ ์ด ๊ฐ์ง ์ผ์์์ ์์ฑ์ผ๋ก์จ ์์์ด ๋ฐ์ ์๋ก RGB์ ํฉ๊ณ ์ค์ฝ์ด๊ฐ ๋์ต๋๋ค. ์ฆ ์ ์ด๋ฏธ์ง์ ๋ชจ๋ ํฝ์ ์ RGB ์ค์ฝ์ด ๋ถ์์ ํ๋ฉด ๋ณํ๊ฐ ๊ฒฉ๋ ฌํ๋ ๋ถ๋ถ์ ๊ฐ๋ ค๋ผ ์ ์๊ฒ ๋ฉ๋๋ค.
์์ ๋ฏธ๋์ด๋ฅผ ํธ์งํ๋ ์์ ์ ์ปดํจํฐ์ ์ฑ๋ฅ์ ํ๊ณ๊น์ง ๋์ด๋ด์ ์ด๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋ ์ ๋๋ก ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ํ๋ ๋ฌด๊ฑฐ์ด ์์ ์ ๋๋ค. ๋ฆฌ๋๋ ์ ์ ์น ๊ธฐ๋ฐ์ ์ปจ๋ฒํฐ๋ก์จ ๋๊ตฌ๋ ์บ์ฅฌ์ผํ๊ฒ ์ด์ฉ ๊ฐ๋ฅํด์ผํ๋ ๋งํผ ํผํฌ๋จผ์ค์ ์ฑ๋ฅํฅ์์ ์์ฃผ ์ค์ํ ๊ณผ์ ์ค ํ๋์์ต๋๋ค. ํผํฌ๋จผ์ค๊ฐ ์ข์ง ๋ชปํ๋ฉด ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ ๋์ ๊ธฐ๋ค๋ ค์ผํ๋ฏ๋ก ์ ์ ๊ฒฝํ์๋ ์ข์ง ์์ ๋ฟ๋ง ์๋๋ผ, ์๋ฒ์๋ ๋ถํ๊ฐ ์ฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
์๋ฅผ ๋ค์ด 25fps์ 1280 x 720 ์์์ด ์๋ค๊ณ ํ ๋, ๊ณ ์ 15์ด ๋จ์ง๋๋ ์์์์ ์ถ์ถ๋๋ ํ๋ ์์ 384๊ฐ์
๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ์
๋ถ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ก์ง์ด ์ํํด์ผํ๋ ํฝ์
์ ๊ฐ์๋ ์ด 8847360000๊ฐ๋ก ์ด๋ง์ด๋งํ ๋ถ๋์ด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ํผ์ฌ์ฒด์ ์๋๊ฐ ์ด์์์ค์ด ์๋ ์ด์, 25๋ถ์ 1์ด์ ๋ชจ์
์ ํ๋ ํ๋ ๋ถ์ํ ํ์๋ ์์ผ๋ฉฐ, ์ด๋ฏธ์ง์ ํ๋ฆฌํฐ๊ฐ ๋ฎ๋๋ผ๋ ํฐ ์์ญ์ ๊ฑธ์น ์์ ์ฐจ์ด๋ฅผ ๋ถ์ํ๋๋ฐ๋ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ ๋ ๋ฐ๋ผ์ ์ด๋น 13๋งค๋ก ์ถ์ถํ ํ๋ ์์ ๊ฐ์๋ฅผ ์ ๋ฐ๊ฐ๋์ผ๋ก ์ค์ด๊ณ , ํฌ๊ธฐ ๋ํ 100 x 56์ผ๋ก ๋ํญ ์ถ์ํ์์ต๋๋ค.
์ด๋ฏธ์ง ํ์ ๋ํ PNG-24๋ณด๋ค ๋นํธ์๊ฐ ์ ์ด ํ๊ฒฐ ๊ฐ๋ฒผ์ด PNG-8๋ฅผ ์ฑํํ์์ต๋๋ค.
์์ ๋ ๋ฐฉ๋ฒ์ ์ ์ฉํด๋ณด๊ณ ๋ถ์์ฉ ํ๋ ์ ํด๋์ ์ด ์ฉ๋์ ๋น๊ตํด๋ณด๋, 15์ด ์์ ๊ธฐ์ค์ผ๋ก 823KB์ ํด๋๊ฐ ์์ฑ๋์์ต๋๋ค. ๊ธฐ์กด์ 141.1MB์ ๋น๊ตํ์ฌ ๋๋ผ๋งํฑํ๊ฒ ๊ฐ๋ฒผ์์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ์ ์ผ๋ก ํผํฌ๋จผ์ค๋ ํฌ๊ฒ ํฅ์๋๋ ๋ชจ์ต์ ํ์ธํ ์ ์์์ต๋๋ค.
FFmpeg์ Sharp๋ฅผ ์ด์ฉํ ๋ชจ์ ๋ถ์์ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์์ ๊ฐ์ต๋๋ค. ์์ธํ ํ๋ํ๋ ์ง์ด๋ณด๊ฒ ์ต๋๋ค.
-
๋น๋์ค ์ ๋ก๋
์ ์ ๊ฐ ํด๋ผ์ด์ธํธ์์ ๋น๋์ค๋ฅผ ์ ๋ก๋ํ๋ฉด multer๋ฅผ ํตํ์ฌ ๋ฐฑ์๋๋ก ์ ์ก๋๊ฒ ๋ฉ๋๋ค. -
๋ถ์์ฉ ์ ํ๋ฆฌํฐ ํ๋ ์ ์ถ์ถ
๋จผ์ FFmpeg๋ฅผ ์ด์ฉํ์ฌ ํ๋ ์๊ฐ์ ๋น๊ต๋ฅผ ์ํด์ ์์์ ์ด๋ฃจ๋ ํ๋ ์๋ค์ ์ถ์ถํฉ๋๋ค.
์ค์ง ๋ถ์์ฉ์ผ๋ก ์ฐ์ผ ์์ ์ด๋ฏ๋ก ์ ํ๋ฆฌํฐ์ ํ๋ ์๋ค์ ์ด๋น 13๋งค๋ง ์์ฑํด์ค๋๋ค. -
๋ชจ์ ํํธ๋งต ์์ ์์ฑ
Sharp์ composite ๋ฉ์๋๋ฅผ ํตํด ๋ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํ์ฌ ๋ณํํ ๊ตฌ๊ฐ๋ง์ ๋์ถํฉ๋๋ค. -
๋ถ์ํ ์์ญ ์ปจํ
์ ์ ๋ ๋ฐํ๋ ๋ชจ์ ํํธ๋งต ํ๋ฆฌ๋ทฐ ์์์ ํ ๋๋ก ๋ชจ์ ๋ถ์์ ์์ฒญํ ์์ญ๊ณผ ์๋ฏผ๋๋ฅผ ์ปจํํฉ๋๋ค. -
๊ณ ํ๋ฆฌํฐ ํ๋ ์ ์ถ์ถ
FFmpeg๋ฅผ ์ด์ฉํ์ฌ ์๋ณธ์์์์ ๊ณ ํ๋ฆฌํฐ์ ํ๋ ์์ ์ด๋น 25๋งค๋ก ์ถ์ถํด์ค๋๋ค. -
์์ญ ๋ด๋ถ์์ ๋ชจ์ ๋ถ์, ์ต์ ํ
์ด๋ฏธ์ง์ ํฝ์ ์ ์ํํ๋ฉฐ ์ค์ฝ์ด๊ฐ ๊ฐํ ์ธ๋ก์ค์ ์์น๋ฅผ ๋ฐฐ์ด์ ๋ด์ต๋๋ค.
๋ฐฐ์ด์ ๋ด์์ง ์ฌ๋ถ๋ฅผ ๊ฐ๋ฆฌ๋ ๊ธฐ์ค์ ์ธ Threshold๋ ์คํ์ ํตํด ์ป์ ์ ์ ํ ์ซ์๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ ํฝ์ ์ด ๋จ์ ๋ ธ์ด์ฆ์ธ์ง ๋ชจ์ ์ ํด๋นํ๋์ง๋ฅผ ๊ฐ๋ ค์ค๋๋ค.
"๋ชจ์ ๋ถ์ ๋ฐฐ์ด"์ ์ค์์ ๊ตฌํ ํ, ํฌ๋กญ์ ๊ธฐ์ค์ ์ด ๋๋ ์ข์ธก ์ต์๋จ์ ์ขํ๊ฐ์ ๊ตฌํ์ฌ "์ขํ ๋ฐฐ์ด"์ ๋ฃ์ด์ค๋๋ค.
์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ์ป์ ์ ์๋๋ก ๋ฐฐ์ด๋ด๋ถ์ ์ขํ๊ฐ์ ์ต์ ํํด์ค๋๋ค. -
ํ๋ ์์ ํฌ๋กญํ์ฌ ์ธ๋ก์์ ์์ฑ
์ขํ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ Sharp๋ฅผ ์ด์ฉํด ํ๋ ์๋ค์ ํฌ๋กญํด์ค๋๋ค.
ํฌ๋กญ์ด ์๋ฃ๋ ํ๋ ์๋ค์ FFmpeg๋ฅผ ์ด์ฉํด ๋น๋์ค๋ก ํฉ์ณ์ค๋๋ค.
์ด๋์ ๋ฏธ๋ฆฌ ์ค๋นํด๋์๋ ์ค๋์ค ํ์ผ๊ณผ ์์์ ํจ๊ป ๋จน์ฑํด์ค๋๋ค. -
๊พธ๋ฏธ๊ธฐ ์ปจํ
์ ์ ๋ ๋ชจ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ๊ณ ์์์ ๊พธ๋ฐ ์ ์์ต๋๋ค. ๊พธ๋ฏธ๊ธฐ๋ฅผ ํ์ง์๊ณ ๊ทธ๋๋ก ์ปจํํ๋ฉด 10๋ฒ์งธ ๋จ๊ณ๋ก ๊ฑด๋๋๋๋ค. -
๊พธ๋ฏธ๊ธฐ ๋ฐ์ํ์ฌ ์ต์ข ์์ ์์ฑ
FFmpeg์ ํํฐ๋ฅผ ์ด์ฉํ์ฌ ์ ์ ๊ฐ ์ ์ถํ ๋์์ธ๋๋ก ์์์ ํธ์งํ๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑํฉ๋๋ค. -
์ต์ข ์์ ๋ฐํ
S3์ ์ ๋ก๋๋ ๊ฒฐ๊ณผ๋ฌผ์ url์ ์ด์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๊ฒ ํฉ๋๋ค.
๋ชจ์ ๋ถ์์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ด๊ธด ์ขํ๋ฐฐ์ด์ ๋จ์ํ ๋ชจ์ ์ค์ฝ์ด๊ฐ ๋์๋ ๋ถ์์ ์ค์์ ์ถ์ ํ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ, ์ขํ๋ค์ด ์๋ก๊ฐ์ ์ฐ๊ฒฐ๋์ด์์ง ์๊ฑฐ๋ ๋์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋๋ก ์ต์ ํ ์์ด ํ๋ ์์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ฌ๋์ด ๊ด๋ํ๊ธฐ์๋ ๋งค์ฐ ๋ถํธํ๊ณ ์ฐ๋งํ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐํ๋์ด ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ฒ ๋์์ต๋๋ค.
์ค๊ตฌ๋๋ฐฉ์ธ ์ซ์์ ๋ถํฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ด์ด์ฃผ๊ธฐ ์ํด์, ์๋์ ์ธ๊ฐ์ง์ ํจ์๋ฅผ ๊ฑฐ์ณ ๋ฐฐ์ด ๋ด๋ถ์ ์ขํ๋ค์ ์ต์ ํํด์ฃผ์์ต๋๋ค.
์ด๋ฅผ ์ํด์ ๊ณณ๊ณณ์์ ์ ํ๋ณด๊ฐ๋ฒ โlinear interpolationโ์ด๋ผ ์ผ์ปซ์ด์ง๋ ๋ ์ง์ ์ฌ์ด์ ์ค๊ฐ ๊ฐ์ ๊ตฌํ๋ ๊ฐ๋ ์ด ํ์ฉ๋์์ต๋๋ค.
๋์ค ์ปค๋ฒ ์์, ํน์ ๊ผฌ๋ฆฌ๋ฅผ ๊ณ์ ํ๋๋ ๊ฐ์์ง ์์์ด ์๋ ์ด์, ๋ชจ์ ์ด ์ฆ์๋๋ ๊ตฌ๊ฐ์ ์ด๋ค ์์์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ๊ตฐ๋ฐ์ ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด ์์ โ๋ชจ์ ์์โ ์ฆ, 0์ด ์์ฌ์๋ ๋ฌธ์ ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ๋ชจ์ ์ด ๋๋ ๊ตฌ๊ฐ๊ณผ ๋ค์ ์์๋๋ ๊ตฌ๊ฐ ์ฌ์ด์ ๋งค๋๋ฝ๊ฒ ์ด์ด์ฃผ๋ ํจ์๋ฅผ ๊ตฌํํ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ํ ์ค ๋ชจ์ ์ด ๋๋์ 0์ด ๋ฐ๊ฒฌ๋๊ฒ ๋๋ฉด ๋ชจ์ ์ด ๋ค์ ์์๋๊ธฐ ์ ๊น์ง์ gap์ ์ธ๊ณ , increment๋ฅผ (๋ค์ ๊ฐ - ์ด์ ๊ฐ / gap) ๋ํ์ฌ ์กฐ๊ธ์ฉ ์์นํ๋ ๊ฐ๋ค์ ํ๋ ํ๋ pushํด ์ค๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ฐ์์ ์ผ๋ก 0์ด ๋ฑ์ฅํ๋ ๊ตฌ๊ฐ์ด ์ ํจํ ๊ฐ๋ค๋ก ์ฑ์ธ ์ ์์์ต๋๋ค.
- ์ ๋ก๋๋๋ ์์์๋ ๋ ธ์ด์ฆ๊ฐ ์๊ฑฐ๋, ํ๋ฉด์ ๊ฐ์ฅ์๋ฆฌ์ ๋ฑ์ฅํ๋ ํ์ธ์ด ์์ ์ ์์ต๋๋ค. [โฆ , 10, 5, 10 , โฆ], [โฆ , 35, 10, 36 , โฆ] ๊ณผ ๊ฐ์ด ๋ ์ซ์๋ค์ ์ฌ์ด์ ๊ธ๊ฒฉํ๊ฒ ์ฐจ์ด๊ฐ ๋๋ ์๊ฐ ๋ค์ด์์ ๊ฒฝ์ฐ, ๊ฐ์ด๋ฐ ์ซ์๋ฅผ ์ค๊ฐ๊ฐ์ผ๋ก ๋ฎ์ด์์ฐ๋ ํจ์๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ธ๊ฒฉํ ์นด๋ฉ๋ผ๊ฐ ์๋ฑํ ๊ณณ์ผ๋ก ์ด๋ํ๋ ๋ถ์ ์ ํ ๋ถ๋ถ์ ๋ง์ด ์ค์ผ ์ ์์์ต๋๋ค.
- ์ ์ ๊ฐ ์ ํํ n์ ๋ถ๊ธฐ์ ์ผ์, ๋ถ๊ธฐ์ ๋ค ์ฌ์ด๋ฅผ ์ ํ์ผ๋ก ๋๋ฌ์ฃผ๋ ๋ก์ง์
๋๋ค.
๋ฏผ๊ฐ๋์ ๊ฐ, ์ฝ์ ์กฐ์ ํ๋ ์ฌ๋ผ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ ์ ๊ฐ ๊ฐ๋๋ฅผ ์ค์ ํ๋ฉด ์ด๋์ ๋ ๋น ๋ฅด๊ธฐ์ ๋ฏผ๊ฐ๋๋ก ์นด๋ฉ๋ผ๊ฐ ๋ชจ์ ์ ์ถ์ ํ ์ง๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค. n์ ์ซ์๊ฐ ๋ฎ์ผ๋ฉด ๋ถ๊ธฐ์ ์ฌ์ด๊ฐ ์ข์์ ธ ์ถ์ ์ด ์ ํํ์ง๋ง ๋ค์ ์ฐ๋งํ๋ฉฐ, n์ ์ซ์๊ฐ ๋์ผ๋ฉด ๋ถ๊ธฐ์ ์ฌ์ด๊ฐ ๋ฉ์ด์ ธ ๋ถ๋๋ฝ์ง๋ง ๋ ์๋ฏผํ ์ถ์ ์ ๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
- ์ฌ๋ผ์ด๋๋ sensitive, medium, modest์ ์ธ๊ฐ์ง ์ ํ์ง๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ์ ์ ์คํ์ ํตํด ์์์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ถํ๋ ์ซ์๋ค๋ก ํ ๋นํ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐฐ์ด ๋ด๋ถ์ ์ซ์๊ฐ ๋ถ๋๋ฌ์ด path๋ฅผ ์ด๋ฃจ๊ฒ ๋์ด ๋ง์น ์นด๋ฉ๋ผ๊ฐ ํผ์ฌ์ฒด๋ฅผ ์ซ์ ์ด๋ํ๋ ๋ฏํ ์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํํ ์ ์์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ค๋นํ๋ฉฐ ์ฌ์ฉ์๊ฒฝํ์ ๋ฏธ๋ฆฌ ๋ถ์ํ์ฌ ๋๋ ์ ์, ์ ์ ๊ฐ ์นด๋ฉ๋ผ๋ฅผ ๊ฐ๋ก๋ก ๋ค๊ณ ์ ํ ๋๋ ๋๋ถ๋ถ ํผ์ฌ์ฒด๊ฐ ๋ ์ด์์ด๊ฑฐ๋ ์ข์ฐ๋ก ๋์ด์ ์ผ์ด์ค๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ ๊ธฐ์ ๋ ์ด์์ ํผ์ฌ์ฒด๊ฐ ๊ฐ๋ก์์์ ๋ถํฌ๋์ด์์ ๊ฒฝ์ฐ, ๋จ์ํ๊ฒ ๋ชจ์ ์ด ์ผ์ด๋ ๊ตฌ์ญ์ ์ค์์ ๋ถ์ํ๋ ํ ๋ก์ง์ผ๋ก๋ ์ ์ ๊ฐ ๋ง์กฑ์ค๋ฌ์ํ ๋งํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ์ ํ๊ณ๊ฐ ์์์ต๋๋ค.
๊ณ ๋ฏผ ๋์ ์ฌ์ฉ์์๊ฒ ํฌ๋งํ๋ ๊ตฌ์ญ์ ์ปจํ๋ฐ๋ ๋จ๊ณ๋ฅผ ๋์ ํ๊ธฐ๋ก ํ์์ต๋๋ค. ๋น๋์ค ์์ ์์ญ ์ ๋ ํฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ๋๋๊ทธ์ค๋๋์ ํตํด ์์ ์์ฌ๋ก ์กฐ์ ์ด ๊ฐ๋ฅํ๋๋ก ํ์ต๋๋ค. ์ ์ ๊ฐ ์ํ๋ ์์ญ์ ์ง์ ํ ๋ค ์ ์ถํ ๊ฒฝ์ฐ, ์์ญ์ ๋ด๋ถ์์๋ง ๋ชจ์ ๋ถ์ ์ํ๋ก์ง์ด ๋์ํ๋๋ก ํ์์ต๋๋ค. ์ถ๊ฐ๋ก, ์ ์ ๊ฐ ์ง์ ํ ์์ญ์ด ๊ฒฐ๊ณผ ์์์ ๊ฐ๋ก๊ธธ์ด์ ๊ฑฐ์ ๋์ผํ ๋์๋ (3ํฝ์ ์ฐจ์ด ๋ด) ๋ชจ์ ๋ถ์์ ํฌ๋งํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด๊ณ , ์ ํํ ์์ญ์ ํฌ๋กญํ ๊ฒฐ๊ณผ์์์ ๋ฐํํ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
Re-Direction์ ์ผ๊ตด์ด๋ ์ฌ๋ฌผ์ธ์๊ณผ๊ฐ์ AI๊ธฐ์ ์ ์ฐ์ง ์๋ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ํผ์ฌ์ฒด๊ฐ ๋ง๊ฑฐ๋ ๋ฐฐ๊ฒฝ์ด ์ฌํ๊ฒ ์๋์น๋ ๊ฒฝ์ฐ ๋ชจ์ ๋ถ์์ ํ๊ณ๋ฅผ ๋ณด์ด๋ ์ผ์ด์ค๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ๋์ดํ ๋ง์ ์ต์ ํ์ ๊ฐ์ ์ฑ ์ ํตํด์ ๋ณด๋ค ์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํํ๊ณ ์ด๋ฅผ ๋ฐ์๋ณธ ์ฌ์ฉ์์ ๋ง์กฑ๋๋ฅผ ํฌ๊ฒ ๋์ผ ์ ์์์ต๋๋ค.
๊ฐ์ข ์ด๋ฒคํธ์ ์์ฑ์ ๋ํด ๊ณต๋ถํ ๊ธฐํ๋ฅผ ๊ฐ์ ธ๋ณด๊ธฐ ์ํ์ฌ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋ฅ์ ํต์ฌ์ธ ๋๋๊ทธ์ค๋๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ด ์ง์ ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
์ ๋๋๊ทธ์ค๋๋ ๋ก์ง์ ์ฐ์ธ ์ฌ๋ฃ๋ค์ ์๋์ ๊ฐ์ต๋๋ค.
mouseDown
: ๋ง์ฐ์ค ์ผ์ชฝ๋ฒํผ์ ๋๋ฅด๋ ์ด๋ฒคํธ: ํ๊ฒ์ ์ขํ ๊ฐฑ์ ์ ์์ํฉ๋๋ค.mouseMove
: ๋ง์ฐ์ค๋ฅผ ์์ง์ด๋ ์ด๋ฒคํธ: ํ๊ฒ์ ์ขํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.mouseUp
: ๋ง์ฐ์ค ์ผ์ชฝ๋ฒํผ์์ ์๊ฐ๋ฝ์ ๋ผ๋ ์ด๋ฒคํธ: ํ๊ฒ์ ์ขํ ๊ฐฑ์ ์ ์ข ๋ฃํฉ๋๋ค.useRef
: ์คํฌ๋ฆฐ ์์ ๋น๋์ค์ขํ๋ฅผ ํ์ ํด์ฃผ์ด ์ผ์ชฝ์๋จ ๊ผญ์ง์ ์ด ์๋์ฐ ๋ฆฌ์ฌ์ด์ฆ์ ์๊ด์์ด ํญ์ 0, 0์ผ๋ก ์ด๊ธฐํ๋ ์ ์๋๋ก ํด์ค๋๋ค.
์ด๋ก์จ ๋๋๊ทธ์ ํ๊ตฌ์ญ์ด ์ด๋ ํ ๊ฒฝ์ฐ๋ผ๋ ๋น๋์ค์ ์ ํํ ์ผ์นํ๊ฒ ๋ฉ๋๋ค.ClientX
,ClientY
: ํ๊ฒ์ ์์น๊ฐ ๋ง์ฐ์ค์ปค์ ์์น๋ฅผ ๋ฐ๋ผ ๊ฐฑ์ ๋ ์ ์๋๋ก ์คํฌ๋ฆฐ์ ์ปค์์ ์ค์๊ฐ ์์น๋ฅผ ํ์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ํ๋ ์์ญ์ ํ๊ฒ์ด ๋ฒ์ด๋์ง ๋ชปํ๋๋ก ๊ฐ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์ผ๋ฆฌ๋ฆฌํด ๋ก์ง์ ๋ถ์ด์ ์์ ์ ์ธ ๋๋๊ทธ์ค๋๋ ๊ธฐ๋ฅ์ด ์์ฑ๋์์ต๋๋ค.
์ํ์ข์ฐ๋ณ๊ณผ ์ฌ๋ฐฉ์ ๊ผญ์ง์ ์ ๋ฒ์ด๋๋ ์กฐ๊ฑด๋ค์ ๊ฒฝ์ฐ ๊ฐ์ข
์ซ์์ ๋ถ๋ฑํธ๋ค๋ก ํํ๋๊ธฐ ๋๋ฌธ์ ์ฃผ์์ ๋์ ์์ด๋ ๊ฐ๋
์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ฐ๋ผ์ ์ ์ด๋ฏธ์ง์ฒ๋ผ ๊ฐ ์์ธ์ํฉ๋ค์ ๋ณ์ํํ๊ณ ๊ฐ์ข
๋งค์ง๋๋ฒ๋ค์ ๋ชจ๋ ์์์ฒ๋ฆฌํ๋ ๋ฆฌํฉํฐ๋ง์ ์ํํ์ฌ ๊ฐ๋
์ฑ์ ํฅ์์์ผฐ์ต๋๋ค.
๊พธ๋ฏธ๊ธฐ ์์์ ๊ฒฝ์ฐ ์ฌ์ด์ฆ๊ฐ ์ข ๋ฅ๋ณ๋ก ์ ๊ฐ๊ฐ์ด๋ฉฐ ๊ธ๊ท input ๋ํ ๋ด์ฉ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋์ ์ผ๋ก ๋ณํฉ๋๋ค. ๋ฐ๋ผ์ ํ๊ฒ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๊ฑฐ๋ ์์์ง๋๋ผ๋ ๋ฐ์ํ์ผ๋ก ์์ญ์ ํ์ ํด์ค ์ ์๋๋ก ๊ฐ์ ์์ผ์ฃผ์์ต๋๋ค. ์ด๋ฅผ ์ํด์ useRef๋ฅผ ์ด์ฉํ์ฌ ํด๋น ์์์ DOM๋ ธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ฌ ํ์ฉํ์์ต๋๋ค.
- ์คํฐ์ปค ์ปดํฌ๋ํธ ์์
const stickerRef = useRef<HTMLImageElement>(null);
function setElementScale() {
if (stickerRef.current) {
setTargetElementScale(stickerRef.current.width, stickerRef.current.height);
}
}
// ...
<img
// ๊ฐ์ข
์ดํธ๋ฆฌ๋ทฐํธ
ref={stickerRef}
/>
์ด์ด์ ์ ์ ๊ฐ ์์๋ฅผ ๋๋๊ทธํ๊ธฐ ์ํด ํด๋ฆญํ์ ์ setElementScale ํจ์๊ฐ ์๋๋์ด, targertElementScale์ ํ๊ฒ ์คํฐ์ปค์ ํฌ๊ธฐ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธฐ๋๋ก ํ์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ ์ด์ด์ ๋๋๊ทธ์ค๋๋์ ๋ด๋นํ๋ ํจ์๋ด๋ถ์์ ๋๋๊ทธ ์์ญ์ ํ ํด์ฃผ๋๋ฐ ์ฌ์ฉ๋๊ฒ ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋จ์์ ์์๊พธ๋ฏธ๊ธฐ์ ๊ด๋ จํ ์ธํฐํ์ด์ค๊ฐ ๋ชจ๋ ์์ฑ๋์, ๋ค์์ผ๋ก ์ ์ ๊ฐ ์ปจํํ ๋์์ธ์ ์ค์ ๋ก ์ด๋ป๊ฒ ์์์ ์ฝ์ ํ ๊ฒ์ธ๊ฐ๋ผ๋ ๋ฌธ์ ์ ๋ด์ฐฉํ์ต๋๋ค. ๋ฐํ๋์ด ์ค๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์ ์ ๊ฐ ์ค์ ํ๊ณ ์ ์ถํ ๋ชจ์ต๊ณผ ์ค์ฐจ ์์ด ์ ํํ๊ฒ ์ผ์นํด์ผํ๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
๋จผ์ , ๋ค์ํ ์กฐ์ฌ์ ์ํ์ฐฉ์ค๋ฅผ ํตํด์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ์ต๋๋ค.
- ffmpeg์ ํํฐ ์ปค๋งจ๋๋ฅผ ์ด์ฉํ๋ฉด ๊ธ์๋ ์ด๋ฏธ์ง๋ฅผ ์์์ ์ํ๋ ์์น์ ์ฝ์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
- ffmpeg์ โdrawtextโ ์ปค๋งจ๋์๋ ๋ฐฐ๊ฒฝ์, ๊ฐํ, ๊ฐ์ด๋ฐ ์ ๋ ฌ๋ฑ์ด ์ ์ฉ๋์ง ์๋๋ค. ๊ธ์จ์ ๋ฐฐ๊ฒฝ์์ ๊ฒฝ์ฐ, ๊ทธ ์ญํ ์ ๋์ ํด์ค โ์ฌ๊ฐํโ์ drawbox๋ฅผ ์ด์ฉํด ๋ณ๋๋ก ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
- ์์์ ์ฝ์ ํ ํฐํธ์ ์ด๋ฏธ์ง ํ์ผ์ local path์์ ๋ถ๋ฌ์์ผํ๋ฉฐ, S3 url์ ์ง์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด๋ฏธ์ง ์ฝ์ ๊ธฐ๋ฅ์์ .svgํ์ฅ์๋ ์ง์ํ์ง ์๋๋ค.
์๋ฅผ ์ฐธ๊ณ ํ์ฌ, ํด๋ผ์ด์ธํธ ์ธก์์ FFmpeg์ ์ปค๋งจ๋์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ถ๋ ค ์๋ฒ์ ์ ์กํ์์ต๋๋ค. ๋ํ, .ttfํ์ผ๊ณผ .pngํ์ผ์ ๋ชจ๋ S3์ ์ ๋ก๋ํ๊ณ , edit ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ FFmpeg์ ์์ ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ํ์ํ ํ์ผ๋ค์ ๋ด๋ ค๋ฐ๋๋ก ํ์ต๋๋ค.
์์ ์ ์ํ ์ฌ๋ฃ๋ค์ ๋ค์ด๋ก๋๊ฐ ๋ชจ๋ ์๋ฃ๋๋ฉด, ๊ธ๊ท์ ์คํฐ์ปค์ ์ ๋ฌด์ ๋ฐ๋ผ FFmpeg ์ปค๋งจ๋์ Argument๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
"-i",
path.join(SAVING_DIR_RESULT, "result_video.mp4"),
// 0๋ฒ์งธ ๋ฏธ๋์ด: ๋น๋์ค
"-i",
downloadedFiles.stickerPath,
// 1๋ฒ์งธ ๋ฏธ๋์ด: ์คํฐ์ปค
"-filter_complex",
// ํํฐ์ ์ฉ ์ปค๋งจ๋. ์ดํ๋ ํ๋ผ๋ฏธํฐ.
`[1:v]scale=150:-1[scaled_sticker];[0:v][scaled_sticker]overlay=x=${stickerX}:y=${stickerY},drawbox=x=${fontX}:y=${fontY - 7}:w=${fontWidth}:h=35:color=${fontBg}:t=fill,drawtext=text=${fontContent}:x=${fontX}+${fontWidth}/2-text_w/2:y=${fontY}:fontsize=30:fontcolor=${fontColor}:fontfile=${downloadedFiles.typefacePath}`,
// [1:v]... 1๋ฒ์งธ ์ธ๋ฑ์ค ์์์ธ ์คํฐ์ปค์ ์ค์ผ์ผ์ ์กฐ์
// [0:v]... 0๋ฒ์งธ ์ธ๋ฑ์ค ์์์ธ ๋น๋์ค ์์ ์คํฐ์ปค๋ฅผ ์ค๋ฒ๋ ์ด, drawbox= ๊ธ๊ท ๋ค์ชฝ์ ์์นํ ๋ฐ์ค๋ฅผ ์์ฑ, drawtext= ๊ธ๊ท๋ฅผ ์์ฑ.
"-y",
// ๋ฎ์ด์ฐ๊ธฐ ํ์ฉ
path.join(SAVING_DIR_EDITED_RESULT, "edited_video.mp4"),
// ์ ์ฅํ ๊ฒฝ๋ก๋ฅผ ์ง์ & ๊ฒฐ๊ณผํ์ผ ์ด๋ฆ์ค์
๐บ ์คํฐ์ปค์ ๊ธ๊ท๋ฅผ ๋์ ์ ์ฉํ ๊ฒฝ์ฐ ์๊ท๋จผํธ ์์
- HTML์ inputํ๊ทธ์ ์์ฑ์์ ์ง์ํ๋ โtransparentโ์ ๊ฒฝ์ฐ, FFmpeg๊ฐ ์์๋ฃ๋ ์์ฑ๋ช ์ ์๋๋ฏ๋ก, ๋ถ๊ธฐ๋ฅผ ์ค์ ํด์ฃผ์ด โtransparentโ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง drawbox๋ฅผ ์์ฑํ๋ ๋ก์ง์ ์ปค๋ฉ๋ ๋ฐฐ์ด์ pushํ๋๋ก ํ์ต๋๋ค.
- ๋ํ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ ๊ฐ๋ ๋ FFmpeg๋ ์์ง ๋ชปํ๋ฏ๋ก FFmpeg ์ปค๋งจ๋ ๋ฌธ๋ฒ์ ์ด์ฉํ์ฌ ๊ณ์ฐ์์ ์์ฑํด์ผ๋ง ํ์ต๋๋ค.
HTML๊ด๋ จ ์์ฑ๊ฐ๋ค์ FFmpeg๊ฐ ์ง์ํ๋ ํ์์ ๊ฑธ๋ง๊ฒ ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ๋ง์น ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ์ฐ์ธ ๊ธ์ ๋ฒ์ญ์์ ๊ณผ ํก์ฌํ๋ค๊ณ ๋๊ผ์ต๋๋ค. ๊ธด ์๊ฐ๋์์ ์ํ์ฐฉ์ค ๋์ ์ฌ๋ฐ๋ฅธ ์ปค๋งจ๋๋ฌธ๋ฒ์ ์ ์ฉํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๋จ์์ ์ ์ ๊ฐ ์ค์ ํ ๋ชจ์ต์ด ๋๊ฐ์ด ์์์ ์ฝ์ ๋ ๊ฒ์ ๋ณด์์ ๋๋ ํฌ๋ํฐ ๋ณด๋์ ๋๋ ์ ์์์ต๋๋ค.
์ด๊ธฐ์๋ ๊พธ๋ฏธ๊ธฐ ์์์ ํญ๋ชฉ์ด ํฐํธ์ ์คํฐ์ปค, ๋จ ๋๊ฐ์ง์์ ๋ฐ๋ผ ๊ฐ์ข state ๋ฐ ๋ก์ง๋ค์ ์ง์์์ ๋ ์์ ์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๋งค์ฐ ๋์ ์ํ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ GIF๋ ๊ทธ๋ฆฌ๊ธฐ, ํํฐ ๋ฑ ๋ค๋ฅธ ์๋ก์ด ๊พธ๋ฏธ๊ธฐ ์์๊ฐ ์ถ๊ฐํ๊ฒ ๋ ๋, ์๋ง์ ๊ณณ์์ ์์ ์ด ์ผ์ด๋์ผ ํ๋ค๋ฉด ๊ฐ๋ฐฉํ์์์น์ ์ด๊ธ๋๊ณ ์ค๋ณต์ฝ๋๊ฐ ์ฆ๊ฐํ ๊ฒ์ด ์์๋์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋ ๋์ ์ค๊ณ๋ ์์๊น ๊ณ ๋ฏผํ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋์์ต๋๋ค.
์ฒซ๋ฒ์งธ๋ก, ๊ฐ ์์ ๋ณ๋ก ์ ์ ํด์ฃผ์๋ ๋๋๊ทธ ์ ๋ฌด, ์ขํ ๋ฑ์ ์คํ ์ดํธ๋ฅผ ์ ๊ฑฐํ๊ณ ๊ณต์ฉ์คํ ์ดํธ๊ฐ ์์์ ์ข ๋ฅ๋ ๊ฐ์์ ๊ด๊ณ์์ด ๋์ํ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ฆฌํฉํฐ๋งํด์ฃผ์์ต๋๋ค.
- ๋ณ๊ฒฝ ์
๐บ ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ๋์์ผ๋ก ํํ. ์ค๋ณต ์ฝ๋๊ฐ ์์์ ๊ฐ์๋ณ์ ๋น๋กํ์ฌ ๋ฐ์.
- ๋ณ๊ฒฝ ํ
์ด๋ก์จ ๊ฐ ์์์ isDragging์ด true/false๋ก ํ ๊ธํ๋ ๊ฒ์ด ์๋๋ผ ํ๊ฒ๋ช ์ด isDragging์ ์ง์ ๋ด๊ธฐ๋๋ก ํด, ํญ๋ชฉ์ ๊ฐ์์ ์๊ด์์ด ํ ์์ state์ ์ธํฐ๋ง์ผ๋ก DnD๊ฐ ์๋ํ๋๋ก ํ์์ต๋๋ค.
๋๋ฒ์งธ๋ก, ๊ฐ ์์์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ state๋ค์ ํฉ์ด์ ธ์๊ธฐ์ ํ ๊ฐ์ฒด์ ๊น๋ํ๊ฒ ๋ชจ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ ๊ฐ ์ด๋ค ์์๋ฅผ ์ ํํ๋ฉด ๊ด๋ จ ๊ฐ์ฒด๊ฐ selectedDecos๊ฐ์ฒด์ ๋์ ์ผ๋ก ์ถ๊ฐ / ์ ๊ฑฐ๋๋๋ก ๋ฆฌํฉํฐ๋งํ์์ต๋๋ค.
- ๋ณ๊ฒฝ ์
๐บ ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ๋์์ผ๋ก ํํ. ์ ๊พธ๋ฏธ๊ธฐ ์์๊ฐ ์ถ๊ฐ๋์ผํ ๊ฒฝ์ฐ ๊ด๋ จ state๋ฅผ ๋ณ๋๋ก ์๋ก ์์ฑํ๊ณ selectedDecos๋ด๋ถ์ name๊ณผ url ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฑ ๋ณต์กํ ์์ ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค.
- ๋ณ๊ฒฝ ํ
์ ์์๊ฐ ์ถ๊ฐ๋๋๋ผ๋ selectedDecos์ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ ํ๋ ์์์ ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ๋ด๊ธด selectedDecos๊ฐ ๊ทธ๋๋ก ๋ฐฑ์๋ ์์ฒญ์์ ํ์ด๋ก๋์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ ๋ฐ์ดํธ๋ฅผ ํตํด api๋ฆฌํ์คํธ ์ ๋ณด๋ด๋ ๊ฐ์ฒด ๋ด๋ถ๋ฅผ ์์ ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ํด์๋์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋์์ธ ์์ ๋ณ ์ขํ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ์ coord state๊ฐ ์๋, selectedDecos์ ํ์๊ฐ์ฒด ๋ด๋ถ์ ์ ์ฅ๋๋๋ก ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ handleMouseMove์์๋ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก์ต๋๋ค.
- ๊ธฐ์กด ์ฝ๋
function handleMouseMove(event) {
switch (isDragging) {
case "sticker":
moveDecoElement(videoRect, event, setStickerCoord, targetElementScale);
break;
case "font":
moveDecoElement(videoRect, event, setFontCoord, targetElementScale);
break;
}
}
๊ธฐ์กด์๋ ์์๋ณ๋ก ์ขํ state๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ธฐ์ setStickerCoord, setFontCoord๊ณผ ๊ฐ์ ์๋ง์ setter๋ฅผ ์ธ์๋ก ์ ๋ฌํ๊ธฐ ์ํด swtich๋ฌธ์ ํ์ฉํ์์ต๋๋ค.
- ๊ฐ์ ํ
function handleMouseMove(event) {
moveDecoElement(isDragging, videoRect, event, setCoord, targetElementScale);
}
ํ๊ฒ์ ๋ณด๊ฐ ๋ด๊ธด isDragging์ ์ธ์๋ก ๋ฐ์, ํด๋น ํ๊ฒ์ ๊ฐ์ฒด ๋ด๋ถ ์ขํ๋ฅผ ๋ณ๊ฒฝํด์ค๋๋ค. ๋ฐ๋ผ์ ์ ์์์ ์ถ๊ฐ์ ๋ง์ถ์ด switch๋ฌธ์ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฑ์ ๋ฒ๊ฑฐ๋ก์์ด ์์ด์ง๊ฒ ๋์์ต๋๋ค.
๊ตฌ์กฐ๋ฅผ ์ต์ ํํ๋ ๋ฆฌํฉํฐ๋ง์ ์งํํ๋ฉด์ ๋ฌด์์ ๊ตฌํ์ ๋์ ํ๊ธฐ ์ด์ ์ ๋์์ธํจํด์ ๊ธฐ์ด์ง์์ ํ ๋๋ก ์ ์ ํ ์ด๊ธฐ ๊ณํ์ ์๋ฆฝํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง๋ฅผ ๋ช ํํ ๊นจ๋ฌ์์ต๋๋ค. ์์ผ๋ก๋ ํจ์จ์ ์ธ ํจํด์ ๋ํ ๊ณต๋ถ์ ์ค์ต์ ๊ณ์ํ์ฌ ์ ํ์ ํ์ฅ์ฑ์ ๋์ด๊ณ , ๋ฏธ๋์ ๋์์ธ ๋ณ๊ฒฝ์ ๋๋นํ ์ ์๋ ํ์ ๊ธธ๋ฌ๋๊ฐ๊ณ ์ ํฉ๋๋ค.
-
ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2023๋ 8์ 7์ผ - 9์ 5์ผ
-
1์ฃผ์ฐจ
- ์์ด๋์ด ์์ง, ์ ์
- ๊ธฐ์ ์คํ ๊ฒฐ์ ๋ฐ ๊ฒ์ฆ
- ESLint, Prettier ์ค์
- KANBAN ์์ฑ
-
2์ฃผ์ฐจ
- ๋ฆฌ์กํธ ๋ฐ Node.js/Express ํ๊ฒฝ ์ธํ
- RESTful API ์์ฑ
- ๋ฉ์ธํ๋ฉด ๊ตฌํ
- ๋ก๋ฉ ๊ตฌํ
- ์์ญ์ง์ ๋ก์ง ๊ตฌํ
-
3์ฃผ์ฐจ
- ์์ ๋ถ์๊ณผ์ ๊ตฌํ
- ์์ ํฌ๋กญ ๋ฐ ๋ฐํ๊ณผ์ ๊ตฌํ
- ์์ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
-
4์ฃผ์ฐจ
- ๋ฐฐํฌ
- ํ ์คํธ์ฝ๋ ์์ฑ
- README ์์ฑ
์์๊ด๋ จ ์์ ์ ํ๋ค๋ณด๋ฉด ์ปดํจํฐ๊ฐ ๋จ๊ฑฐ์์ง๊ณ ํฌ์ด ๋น ๋ฅด๊ฒ ๋์๊ฐ๋๋ค. ์ด๋ ๋ฏ ์จ๊ฐ CPU์ ๊ทธ๋ํฝ์นด๋๋ฅผ ๊ณ ์์ํค๋ฉฐ ๋ฌด๊ฒ๊ณ ๋ณต์กํ ์์ ๋ค์ ์ํํ๋ ์์ ํธ์งํด๋ค์ด ์ค์ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์๋์ง๋ ๋๋ต์ ์ผ๋ก๋ง ์๊ณ ์์์ ๋ฟ ๋ด๋ถ ๋ก์ง๋ค์ ๋ํด์๋ ์์ธํ ์์๋ณธ ์ ์ด ์์์ต๋๋ค. ์ด๋ฒ ๊ฐ์ธํ๋ก์ ํธ์์ ์์ ๋ณํํด ๊ตฌํ์ ์ค์ ๋์ ํด๋ณด๋ฉด์ ๊ฐ ํฝ์ ์ RGB์์ฑ์ ์ ๊ทผํ๊ฑฐ๋ ํธ์งํ๋ ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ ๊ณ์ ํ์ค์ด๋ผ ๋ถ๋ฆฌ์ธ์ ๋๋ก ์ค์ํ ์์ํธ์ง ํ๋ ์์ํฌ๋ฅผ ๋ค๋ค๋ณผ ์ ์๊ฒ ๋์ด ๋ฌด์ฒ ๋ป ๊น์์ต๋๋ค.
์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ ๋๋ ์ ๋ง์ ๋ก์ง๋ค์ ๋ ๋ฆฝ์ ์ด๊ณ ๋ช ํํ๊ฒ ์ง๊ณ , ์ด๋ค์ ๋ชจ์ ํ๋์ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ์ ์ํจ๋ค๋ผ๊ณ ์ด๋ก ์ ์ผ๋ก ๋ฐฐ์ ์ผ๋ ์ค์ ๊ฐ๋ฐ๊ฒฝํ์ด ์์ด๋ ์ด๋ฅผ ์ ๋๋ก ์ดํดํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ๋ก์ ํธ์์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋๋ค ์ค์ค๋ก ๊ตฌ์ถํ๊ณ , ์ ์ ์ ํด๋ฆญ๋ถํฐ ๊ฒฐ๊ณผ ๋ฐํ๊น์ง์ ์ผ๋ จ์ ๊ณผ์ ์ ์ง์ ๊ตฌํํด๋ณธ ๊ฒ์ ์์ฃผ ์์คํ ๊ฒฝํ์ด์์ต๋๋ค. ๋ถ์กฑํจ์ผ๋ก ์ธํด ์ด๊ธฐ ๋์์ธํ๋ API๋ฅผ ์ค๊ฐ์ ์์ ํ๊ฑฐ๋ ํ๋ก ํธ์๋๋จ์ ๋ก์ง์ ๋ฐฑ์๋๋ก ๋๊ฑฐ ์ด์ฌ์ํค๋ ๋ฑ ์ด๋ฐ์ ๋ฐ ์ํ์ฐฉ์ค๋ ์์์ต๋๋ค. ํนํ API์ ์์ ์ ๋๋จํ ๋ฆฌ์์ค๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๋์์ธ์ด ์ผ๋ง๋ ์ค์ํ๊ณ ์ ์คํด์ผํ๋์ง ์ ์คํ ๊นจ๋ฌ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ฅ๊ฐ๋ฐ๊ณผ ๊ตฌ์กฐ์ ์์ ๊ฐ์ ๊ณผ์ ๋ค์ด ์ฒ์์๋ ๋ฌด์๋ฌด์ํ๊ฒ ๋๊ปด์ง๋๋ผ๋ ๋นํฉํ์ง ์๊ณ ์นจ์ฐฉํ๊ฒ ๋จ๊ณ๋ฅผ ๋ฐ์๊ฐ๋ฉด, ์ํํธ์จ์ด๊ฐ ์์ํ๋๋ก ์๋ํด์ฃผ๋ฉด์ ๋ณด๋๊ณผ ํํฌ๊ฐ ์๊ฒจ์ค๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
์์ผ๋ก๋ ๋ง์ ์ํํธ์จ์ด ๊ฐ๋ฐ๊ฒฝํ์ ํตํ์ฌ ์ง์ํํ๋ก ์๊ณ ์๋ ๊ฒ์ ์ง์ ์ค์ฒํ๊ณ ์ค์ค๋ก ์ฒดํํ๋ ๊ธฐํ๋ฅผ ๊ฐ์ง๊ณ ์ถ์ต๋๋ค. ์์ ์ฐ์ ๋๋ ๊ฒฝํ์ ํ ํ์ ๋ ํฐ ์ฐ์ ๋์ ํ ์ ์๋ฏ์ด, ํ๋ก์ ํธ์ ์์ค๊ณผ ๋๋ถ์ด ์ ๋ํ ํจ๊ป ์ฑ์ฅํด ๋๊ฐ๊ณ ์ถ์ต๋๋ค.