New Name์ Text, SVG, Image, GIF๋ฅผ ์ด์ฉํด ์ฝ๊ฒ ์ธ๋กํ ๋ช
ํจ์ ์์ฑํ ์ ์๋ ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์
์
๋๋ค.
๋ช ํจ์ ์์ฑํ๊ณ ์ด๋ฏธ์ง ํน์ GIF๋ก ์ ์ฅํ์ฌ ์์ฝ๊ฒ ๋ช ํจ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์ ๋ชฉํ๋ ๋ชจ๋ฐ์ผ์ด๋ผ๋ ํน์ฑ์ ๋ง์ฐ์ค๊ฐ ์๋ ์๊ฐ๋ฝ์ ์ด์ฉํด GUI๋ฅผ ์ ์ด์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด๋ณด๊ณ ์ ํ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด "ํฐ์น๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง๋ฅผ ํธ์งํ๋ ๊ฒ์ ์ด๋จ๊น?" ๋ผ๋ ๊ณ ๋ฏผ์์ ์์ํด ๋ฒ์๋ฅผ ํธ๋ํฐ ํ๋ฉด์ผ๋ก ํ์ ์์ผ ๋ช ํจ ์๋ํฐ๋ผ๋ ์ปจํ ์ธ ๋ก ๊ฒฐ์ ์ง๊ฒ ๋์์ต๋๋ค.
๊ธฐ์กด์ ๋ช ํจ์ ์ค์บํด ํธ๋ํฐ์ ์ ์ฅํ๋ ์ํฉ์ ์ ์ ๊ฐ ์ฌ์ฉํ๋ ์ ์ฅ์์ ์๊ฐ์ ํด๋ณด์์ ๋, "์ค๋ฌผ์ ์ค์บํ๋ ๊ฒ์ด ์๋ ์ฒ์๋ถํฐ ๋ช ํจ์ ๋ฐ์ดํฐ๋ก๋ง ๊ฐ๊ณ ๋ค๋ ์ ์๊ฒ ํ๋ฉด ๋๊ฒ ๋ค" ๋ผ๋ ์๊ฐ์ผ๋ก ์ด์ด์ก์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋ช ํจ์ ์์ ์ ์์ด๋ดํฐํฐ๋ฅผ ๋ํ๋ด๋ ์์ ์ค ํ๋๋ผ ์๊ฐํ์ต๋๋ค. ์ด์ GIF ๊ฐ์ ๋์ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ๋ค๋ฉด ๋์งํธ ๋ช ํจ์ด ๋ ์ฌ๋ฐ์ด ์ง ๊ฑฐ๋ผ ์๊ฐํด ์ ๋ชฉํด๋ณด๊ณ ์ ํ์์ต๋๋ค.
GIF๊ฐ ๋ช ํจ์ ์ถ๊ฐ๋๋ค๋ฉด ์ด๋จ๊น?
NEWNAME์ผ๋ก ๋ง๋ ์์ ๋ช ํจ๋ค๊ณผ ์๋น์ค ํ๋ฉด
๐ฅ ์์์ผ๋ก ํ์ธํ๊ธฐ!
ํ๋ก์ ํธ ์งํ ์ค ์ ์ผ ๋จผ์ ๊ณ ๋ คํ๋ ๋ถ๋ถ์ ํฐ์น์์๋ฅผ ์ด๋ป๊ฒ ๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ปจํธ๋กค ํ ์ง ์์ต๋๋ค.
๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ํน์ฑ์ ์๊ฐ๋ฝ์ ์ ์ค์ฒ๋ฅผ ์ด์ฉํด ์์๋ฅผ ์ํ๋ ๋๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ์์๋ผ๊ณ ์๊ฐํ์๊ณ , ์ด๋ฌํ ์ ์ค์ฒ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ฅ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํด๊ฒฐํ๋ฉด ์์กด์ฑ์ด ๋์์ง ๊ฒ์ด๋ผ ํ๋จํ์์ต๋๋ค.
์ด์ RN์ ๋ด์ฅ API์ธ PanResponder๋ฅผ ์ด์ฉํด ๋ฉํฐ ํฐ์น๋ฅผ ํ๋์ ์ก์
์ผ๋ก ๋ฐ๊ฟ ์ ์๋ ๊ธฐ๋ฅ์ ๋ํด ๊ทผ๋ณธ์ ์ผ๋ก ์์๊ฐ๋ณด๊ณ ์ ํ์์ต๋๋ค.
PanResponder๋ RN์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ Gesture Responder System์ ์ํด ํฐ์น๊ฐ ํ๋ ์ผ์ ์์ธก์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
PanResponder์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋PanResponder์ ์ ์ ๋ฉ์๋์ธPanResponder.create๋ฅผ ํตํด PanResponder์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.- ์ด๋ฅผ React์ ํจ์ํ ์ปดํฌ๋ํธ ์์์ ์ํ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ useRef ๋๋ useEffet์ useState๋ฅผ ๊ฒฐํฉํ ์ํ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ์ ๋ useRef๋ฅผ ์ด์ฉํ์ง ์๊ณ useEffect์ useState๋ฅผ ์ด์ฉํ์์ต๋๋ค. ๊ทธ ์ด์ ๋ useRef๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌํ์ธํ
์ด ๋์ง ์๊ณ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ผ๋,
์ด๋ฏธ์ง๋ GIF ๋๋ ๋ค๋ฅธ ์์๋ค์ ํฌ๊ธฐํน์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ ์์
์ ๋ฆฌํ์ธํ
์ด ๋ค์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ๋์ ๋ฐฉ๋ฒ์ด๋ผ ํ๋จํ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก RN์์์๋ ์ด๋ค View๋ฅผ ํฐ์นํ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํด ์ ์ค์ฒ์ ๋์ํ๋ ์ด๋ฒคํธ ํธ๋ค๋ง์ด ๊ฐ์ฅ ์๋ View(RN UI์ ๊ธฐ๋ณธ ๋จ์)๋ก ๋ถํฐ ์์ํฉ๋๋ค.
์ด๋ฅผ ์ ์ค์ฒ ์ปจํธ๋กค์ด ๋ด๋ถ์ ์์ View๋ถํฐ ์ด๋ฒคํธ๋ฅผ ์ปจํธ๋กค ํ๋ ๊ฒ์ ์์น ์๋๋ค๋ฉด PanResponder์ onStartShouldSetPanResponder ์์ฑ์ true๋ก ๋ง๋ค์ด์ค์ผ ํฉ๋๋ค.
๋ํ PanResponder๋ก ์ธ์คํด์ค๋ฅผ ๋ถ๋๋ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ View๊ฐ ์๋ RN์ ๋ด์ฅ API์ธ Animated.View์ Animated.Value๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค.
๋ค์์ onPanResponder์ ์์ฑ์ ๋๋ค.
onPanResponderGrant:PanResponder์ ์๊ฐ๋ฝ์ด ๋ฟ๊ณ ๋์ ์ฒ์ ์์ง์ผ ์์ ์ด๋ฒคํธ๋ฅผ ์ก์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ ์์ฑ์ ๋๋ค.onPanResponderMove: ์์ง์ด๋ ๋์ค ์ด๋ฒคํธ๋ฅผ ์ก์ ์ผ๋ก ๋ฐ๊พธ๋ ์์ฑ์ ๋๋ค. ์ด๋ ์๊ฐ๋ฝ์ด ์ฒซ ์์ง์์ด ์๊ธด ํ ๋ผ์ง๊ธฐ ์ ๊น์ง ์ผ๋ จ์ ์ฐ์์ ์ธ ์ ์ค์ฒ๋ฅผ ์ก์ ์ผ๋ก ์ปจํธ๋กค ํฉ๋๋ค.onPanResponderRelease: ์๊ฐ๋ฝ์ด ๋จ์ด์ง๋ ์๊ฐ ์ก์ ์ ์ ์ํ ์ ์์ต๋๋ค.
์์ ์์ฑ์ ์ด์ฉํด ์ฒ์ ์๊ฐ์ ์๊ฐ๋ฝ์ด ์ด๋ํ ๋งํผ ๋์ ์์ผ์ฃผ๋ฉด ๋์ง ์์๊น? ๋ผ๋ ์๊ฐ์ ํ์์ต๋๋ค.
ํ์ง๋ง ์ํ๋ ๋งํผ ๊ฐ์ด ์ด๋๋์ง ์๊ณ ๊ณ์ํด์ ๋์ ๋๋ ์ด์๊ฐ ์์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋๋ฅผ ํด๋ณด์๊ณ ๊ฐ์ ์ก์ ๋ง๋ค ์ด๊ธฐํ ์์ผ์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์๋๋ ์์ ์ฝ๋์ ๋๋ค.
์ฒ์ ๊ตฌํ ๋น์ ํฐ์น๋ฅผ ํด์ ์ด๋ํ ๊ฒฝ์ฐ, ์ํ๋ ๊ฐ ๋งํผ ์ด๋ํ์ง ์๊ณ ์์๋๋ ๊ฐ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ ์ป๋ ์ด์๊ฐ ๋ฐ์ํ์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ์๊ฐํด๋ณด๋ PanResponder๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ useState์ ๊ฒฝ์ฐ batch๋ผ๋ ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๋ ์์ฑ์ ์ด์ฉํด ์คํ์ด ๋ฉ๋๋ค.
์ด๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ์ด ๋๋ค ๋ณด๋ ์ฆ๊ฐ์ ์ผ๋ก ๊ฐ์ด ๋ฐ์ ๋์ง ์์ ์ ์์์ต๋๋ค.
์ด๋ก ์ธํด ํฐ์น๊ฐ ๋ ๋, ํฐ์น๊ฐ ๋ฐ๋ก ๋๋ฆฐ ํ์ฌ์ ๊ฐ๋ง ์ด์ฉํ ์ ์์๊ณ PanResponder ์ธ์คํด์ค ์์ useState๋ก ๊ด๋ฆฌํ ๊ฐ์ ๊ฒฝ์ฐ ์ฆ๊ฐ์ ์ผ๋ก ํผ๋๋ฐฑ๋์ด ๋ฐ์๋ ์ ์์์ต๋๋ค.
๊ทธ๋์ useRef๋ฅผ ์ด์ฉํ์์ต๋๋ค. useRef๋ ํญ์ ์ต์ ์ ์ํ๋ฅผ ์ฐธ์กฐํ ์ ์์๊ธฐ์ ํด๊ฒฐ ํ ์ ์์์ต๋๋ค.
์ด๋์ ๋ค๋ฃจ๋ ๊ฒ์ ํ๋์ ์๊ฐ๋ฝ์ด ์ด๋ํ ๊ฑฐ๋ฆฌ๋งํผ์ ๋์ ์ผ๋ก ํฉ์ฐํด ํ์๋ฅผ ํด์ฃผ์๋๋ฐ, ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ์ด๋ป๊ฒ ํด์ผํ ๊น? ๋ผ๋ ๊ณ ๋ฏผ์ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋์์ต๋๋ค.
์ด์ ์ฌ์ฉ์๊ฐ ์น์ํ๊ฒ ๋๋ ์ ์๋ ์ฌ์ด์ฆ ์กฐ์ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง ์๊ฐํด๋ณด๊ฒ ๋์์ต๋๋ค.
- ๋๊ฐ์ ์๊ฐ๋ฝ์ ์ด์ฉํด ํ์น ์ค,์์์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
- ์ฌ๋ผ์ด๋ ์คํฌ๋กค์ ์ด์ฉํด ์ ๋ฐํ๊ฒ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ!
์ ๋ ๋๊ฐ์ง์ ๋ฐฉ๋ฒ์ ๋ค ์ ์ฉํ๋, ์ฒ์ ๋ฐฉ๋ฒ์ธ ๋ ์๊ฐ๋ฝ์ ๊ฑฐ๋ฆฌ๊ฐ ์ฒ์ ๋ฟ์์ ๋๋ฅผ ๊ตฌํ๋ ๊ฒ๋ถํฐ ์์์ ํด๋ณด์๋ผ๊ณ ์๊ฐ์ ํ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ ๋ ์๊ฐ๋ฝ์ด ๋ฟ๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์์ต๋๋ค. ์ด์ PanResponder์ ๊ฐ ์์ฑ์ ๋ด๋ถ๋ฅผ ํ์ธํ์ต๋๋ค.
- ์ฌ๊ธฐ์
event์ธ์ ์์nativeEvent๋ฅผ ์ฐพ์๊ณ ๊ฑฐ๊ธฐ์์touches๋ผ๋ ๋ฐฐ์ด์ ๋ณผ ์ ์์์ต๋๋ค. - ์ดํ
touches๋ฐฐ์ด์ ๊ธธ์ด๋ ์๊ฐ๋ฝ์ด ๋ง๋ฟ์ ์๋ ์ํ์ ๊ธธ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
์ด๋ป๊ฒ ํ๋ฉด ๋ ์๊ฐ๋ฝ์ ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์ ์์๊น? ์ด ๊ทธ ๋ค์์ ํ๋ ์์ต๋๋ค.
- ํฌ๊ธฐ์ ์กฐ์ ์ ํ์น ์ค๋ฑ์ ํตํด ์กฐ์ ํ๋ค๋ ๊ฒ์ ์กฐ์ฌ๋ฅผ ํตํด ์ ์ ์์์ต๋๋ค.
- ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ ๊ทผํด ๋ณด๋ ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ๋ฅผ ๋ ์ฌ๋ฆด ์ ์์์ต๋๋ค.
- ์ฌ๊ธฐ์์ ๋ ์๊ฐ๋ฝ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ๋ฅผ ์ด์ฉํด
getDistanceํจ์๋ฅผ ํํํ์ฌ ๊ฐ์ ๊ตฌํ์์ต๋๋ค.
onPanResponderGrant์distance๋ฅผ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ก์ ์ค ๋คonPanResponderMove๋ฅผ ์ด์ฉํด ์ด๋ ์ค์ผ ๋์ ๊ฐ๊ณผ ์ด๊ธฐ ๊ฐ์ ๋น๊ตํ์ฌscaleFactor๋ฅผ ๊ณ์ฐํด์ฃผ์์ต๋๋ค.
- ์ด๋ฅผ ์ด์ฉํด
Animate.View์ ํฌ๊ธฐ๋ฅผ ๋ณํ ์์ผ ์ฃผ์์ต๋๋ค.
๊ทธ ์ดํ๋ ๋น๋ก๊ฐ ์๋ X์ถ๊ณผ Y์ถ์ scale์ ๊ฐ๋ณ์ ์ผ๋ก ์กฐ์ ํ ์๋ ์์๊น? ๋ผ๋ ๊ณ ๋ฏผ์ ํด๋ณด๊ฒ ๋์์ต๋๋ค.
- ์ด๋ฒ์๋ ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์๋ ์๊ฐ๋ฝ์ X์ถ ์ด๋ ๋ฒ์์ Y์ถ ์ด๋ ๋ฒ์์ค ํฐ ๋ถ๋ถ์ด ์ค์ฌ์ด ๋์ด ์ด๋ํ๋ฉด ๋๊ฒ ๋ค ๋ผ๊ณ ์๊ฐํ์์ต๋๋ค.
sizeProportionMode๋ฅผ ์ค์ ํ ๋ค ๋น๋ก ๋ชจ๋๊ฐ ์๋ ๋๋X์Y์scaleFactor๋ฅผ ๊ฑฐ๋ฆฌ์ ์ฐจ๋ฅผ ์ด์ฉํด ๊ตฌํด์ฃผ์์ต๋๋ค.
์ด๋ ๊ฒ ์์ ๊ณ ๋ฏผ๋ค์ ์ง๋์ณ ์ค๋ ์ด๋ฏธ์ง์ ์์๋ค์ ํฐ์น๋ฅผ ์ด์ฉํด ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํ์์ผ๋, ์ถ๊ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. Text, Image, Gif, SVG๋ค์๊ฒ ๊ฐ๊ฐ์ ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํ๊ณ , ๋ ์ด์ด๋ฅผ ๊ด๋ฆฌํ๋ ์์ ์ ํ๊ธฐ ์ํด ๊ฐ ๊ฐ์ฒด๋ง๋ค์ ์ํ๋ฅผ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์์ ์ด ํ์ํ์ต๋๋ค.
๊ฐ ์ปดํฌ๋ํธ์ ์๋ ๋ฉํธ๋ค์ ํ๋๋ก ๋ชจ์ ์ ์๋ ์ ์ญ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ๊ณ , ์ด๋ฅผ ์ํด Redux๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค.
ํ๋์ ํ๋ฉด์ ์ฌ๋ฌ ์์๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด ๋ณธ ๋ค, ๊ฐ ์์๋ง๋ค Elements๋ฅผ ๋ถ๋ฆฌํด ๋ ๋๋งํ ์ ์๊ฒ ํ์์ต๋๋ค.
Text์์ ์์
TextEditor์ปดํฌ๋ํธ๋ฅผ ํตํดText์ถ๊ฐ๋ฅผ ๋๋ฅผ ๊ฒฝ์ฐ,Redux๋ฅผ ํตํดtextSlice์ ํฌํจ๋๊ณTextElements์์ ๋ ๋๋ง ๋ฉ๋๋ค.- ์ถ๊ฐ๋ ์์๋ค์ ๋ค์
EditorRenderer์ปดํฌ๋ํธ์์editorSlice์ ์ถ๊ฐํด์ค ํ Layer๋ฅผ ๋ถ์ฌํฉ๋๋ค.
๋ชจ๋ ์์๊ฐ ๋ ๋๋ง ๋๋ View
์ด๋ฏธ์ง ํด์ ๊ฒฝ์ฐ์๋ ํธ์ง์ด ์์ฃผ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ ์ด์ด๊ฐ ์์๋ก ๋ฐ๋ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์์์ ๋ถ์ฌํ layer๋ฅผ ๋ณํ์ํฌ ํ์๊ฐ ์์ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น? ๊ฐ ๋๋ฒ์ฌ ํ๋๋ก ๋ ์ฌ๋์ต๋๋ค. ์๊ฐํ ๋ฐฉ๋ฒ์ ์ด๊ฑธ ๋จ๋ฐฉํฅ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋์ง ์์๊น? ๋ผ๋ ์๊ฐ์ผ๋ก ์งํํ์์ต๋๋ค.
textElements=>allElements=>layerElementslayerElements=>textElements(layer ๋ณ๊ฒฝ์ฌํญ ๋ฐ์)
์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ๊ฐ์ฒด๋ค์ ๋ค์ ๋ ๋๋ง ์์ผ์ฃผ๋ ์์ ๊น์ง ์๋ฃํ์์ผ๋, ๊ฐ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์ด๋ป๊ฒ ํ๋๋ก ์ ์ฅํด์ผ ํ์ง? ๋ผ๋ ์๊ฐ์ด ๋ ์ฌ๋์ต๋๋ค.
์ด๋ฅผ ์ํด ์กฐ์ฌ๋ฅผ ํด๋ณธ ๋ค ๋๊ฐ์ง์ ๋ฐฉ๋ฒ์ ํ์ธํ๊ฒ ๋์์ต๋๋ค.
- ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณํ ์์ผ ํ๋์ ์ด๋ฏธ์ง๋ก ๋ง๋๋ ๋ฐฉ๋ฒ
- ํ๋์ ์์ญ์ ์บก์ณํ๋ ๋ฐฉ๋ฒ
์ด ์ค์์ 2๋ฒ์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ํ๋์ ์บก์ณ ์์ญ๋ง ๊ด๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ํธ๋ค๋งํ๊ธฐ์ ์ฉ์ดํ ๊ฒ์ด๋ผ ์๊ฐํด ์งํํ์์ต๋๋ค.
์ด์ ๋ค์ ๋ฌธ์ ๋ Image์ ๊ฒฝ์ฐ์๋ ์ฝ๊ฒ Expo์ ๋ด์ฅ API๋ฅผ ์ด์ฉํด ์บก์ณ๋ฅผ ํ๋ฉด ๋์ง๋ง GIF์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์ ์ฅํ ์ ์์๊น?์ ๋ํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
GIF๋ก ๋ณํ ํด์ฃผ๋ ๊ฒ์ PNG๋ก ์์ญ ๋ด์ ๊ฐ์ฅ ๊ธด GIF์ ๊ธธ์ด ๋งํผ ํ๋ ์๋ง๋ค ์บก์ณํด์ค ๋ค ๊ทธ๊ฒ์ GIF๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋์ง ์์๊น? ๋ผ๋ ์ ๊ทผ์ผ๋ก ์์ํด ๋ณด์์ต๋๋ค.
PNG๋ฅผ GIF๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ง ์๊ณ ์๋ํด ๋ณด์์ผ๋, PNG๋ฅผ GIF๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์๋นํ ๋ฌด๋ฆฌ๊ฐ ์์๊ธฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋จํ์์ต๋๋ค.
์ด์๋ ๋ฌธ์ ๋ ์์์ต๋๋ค.
RN์ด ๊ฐ์ง๋ ํ๊ณ์ :RN์ด๊ธฐ ๋๋ฌธ์PNG๋ฅผGIF๋ก ๋ฐ๊พธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐNODE๊ธฐ๋ฐ์ด๊ธฐ์ ์ฌ์ฉํ ์ ์์ด ์๋ฒ๋ก ๋ณด๋ด์ค ๋ค ๊ทธ๊ฒ๋ค์ ์๋ฒ์์GIF๋ก ๋ง๋ค์ด ๋ค์RN์ผ๋ก ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ ์ฑํํ์์ต๋๋ค.- ๋ฒ๊ฑฐ๋ก์ด ์ผ๋ จ์ ์์
:
PNG๋ฅผGIF๋ก ๋ฐ๊พธ๋ ์์ ์ ์๋นํ ๋ง์ ์์ ์ด ํ์๋ก ์ฌ๊ฒจ์ง๋๋ค.
PNG๋ฅผ ํ๋ ์๋ง๋ค ์บก์ณํ๊ณExpo์ ํ์ผ ์์คํ ์ ์ ์ฅ- ํ์ผ ์์คํ
์ ์ ์ฅ๋
PNG๋ฅผbase64๋ก ์ธ์ฝ๋ฉ base64๋ก ์ธ์ฝ๋ฉํPNG๋ฐฐ์ด์ ์๋ฒ๋ก ๋ณด๋ด์ฃผ๊ธฐ- ์๋ฒ์์๋
base64์ ๋์ฝ๋ฉํ์ฌGIF๋ก ๋ณํํ ๋ค ๋ค์base64๋ก ์ธ์ฝ๋ฉ ํ ํRN์ผ๋ก ๋ฐํ RN์์๋base64๋ฅผ ๋ค์ ๋์ฝ๋ฉํ ํGIF๋ก ์ ์ฅํ๊ธฐ.
์ฌ๊ธฐ์์ base64๋ ์ด๋ฏธ์ง๋ฑ์ ์ฝ๊ฒ ๋ณํํ ์ ์๋ ์์คํค์ฝ๋์ ๋ฌธ์๋ค๋ก ์ด๋ฃจ์ด์ง 64์ง๋ฒ์ผ๋ก ์ธ์ฝ๋ฉํ ๋ฐฉ์์
๋๋ค.
frame์ด ๋ฐ๋ณต๋๋ ์ ๋งํผ capture๋ฅผ ํด์ค ๋ค
frames์ capture๊ฐ ๋ ๊ฒ์ ํ๋ก๋ฏธ์ค๋ฅผ ํตํด ์ฒดํฌ => ์ด๊ฒ๋ค์ base64๋ก ๋ณํํด์ ๋ค์ ๋ฐฐ์ด์ ๋ด์ ์๋ฒ๋ก ์ ์ก.
์๋ฒ์์ ๋ฐ์ ๋ค
์๋ฒ์์ GIF ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด GIF ๊ตฌํ
Buffer๋ฅผ ์ด์ฉํด ํ ํ๋ ์์ base64๊ฐ ๋ค ๋ค์ด์ค๋ฉด ํ๋ํ๋๋ง๋ค sharp ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด PNG๋ก ๋ค์ ๋ง๋ค์ด ์ค ๋ค GIFEncoder๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์ ๋ง๋ค ๋ฃ์ด GIF๋ก ๋ง๋ค์ด ์ฃผ์์ต๋๋ค.
ํ๋์ ์ฑ๊ณต์ ์ธ GIF๊ฐ ์์ฑ๋์์ต๋๋ค!
์ด๋ป๊ฒ ํ๋ฉด ์ ์ ์นํ์ ์ผ๋ก ๋ง๋ค ์ ์์ ๊น?
์ ๋ ํญ์ ์ ์ ์ ์ ์ฅ์์ ์๊ฐํด ๋ณด๊ธฐ ๋๋ฌธ์ ์ ์ ๊ฐ ๋ถํธํจ์ ๋๋ผ์ง ์์ ํ๋ฉด ๋จ๊ณ์ ์กฐ์๋ถ๋ฅผ ๊ตฌํํ๊ณ ์ถ์์ต๋๋ค.
์ฒซ๋ฒ์งธ๋ ๋ชจ๋ฐ์ผ ์ด๋ผ๋ ํน์ฑ์ ์๊ฐ๋ฝ์ผ๋ก ์ ์ดํด ์ปจํธ๋กค ํ๋ ๊ฒ๋ค์ด ์น๋ณด๋ค ๋ ํฌ๊ฒ ๋ค๊ฐ์ฌ ์ ์๋ ์์๋ผ๊ณ ํ๋จํ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํฐ์น๋ก ์กฐ์ํ๋ ๊ฒ์ ์ด๋ป๊ฒ ํ๋ฉด ์ข ๋ ์ ์ ๋ค์ด ๋๋ผ๊ธฐ์ ํธํ๊ฒ ํ ์ ์์๊น? ๋ผ๋ ๊ณ ๋ฏผ์ด ์๊ฒผ์ต๋๋ค.
๋๋ฒ์งธ๋ ํ๋ฉด ๊ตฌ์ฑ์ ์ ์ ๋ค์ด ๊ธฐ์๊ฐ์ ๋๋ผ์ง ์์ ํ๋ฉด ๋จ๊ณ์ GUI๋ก ๊ตฌ์ฑํ๊ณ ์ถ์์ต๋๋ค.
Layer์ ์์๋ฅผ ๋ณ๊ฒฝํ ๋ ๋๋๊ทธ ์ค ๋๋์ ํ์ฉํ๋ ๊ฒ์ด ์ฌ์ฉ์ ๊ฒฝํ ๋ฉด์์ ์ข ๋ ์นํ์ ์ผ ๊ฒ์ด๋ผ ํ๋จํ์์ต๋๋ค.- ์ด๋ฅผ ์ํด
PanResponder์ ์ด๋ฒคํธ ์์์ ๋๋๊ทธํ ๋ ์ด์ด๋ฅผ ์ฎ๊ธฐ๋ ํ์๊ฐ ์ผ์ ์์น ๋ฒ์ ์ด์์ ๋์ด๊ฐ ๋ ์๋ฃ์ ์์๊ฐ ๋ณ๊ฒฝ๋๊ฒ ํ์์ต๋๋ค. newIndex๋ฅผ ์์ฑํ ๋ค ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ด์ฉํด ๋ฐฐ์ด์ ์์๋ฅผ ๋ณ๊ฒฝํด ์ฃผ์์ต๋๋ค.zIndex๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ค์ ์ฌ์ ๋ ฌ ํด์ค ๋ค ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋ ์์ ์ ์งํํ์์ต๋๋ค.Stack(LIFO) ๊ตฌ์กฐ๋ฅผ ์ฐจ์ฉํด ๋ง์ง๋ง ์๊ธด ์๋ ๋ฉํธ๊ฐ ๊ฐ์ฅ ์์ ์์ด๊ฒ ์ค๊ณํ์์ต๋๋ค.
3rd Party ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์์กด์ฑ์ ๋์ด๊ธฐ ๋ณด๋ค๋, ์์ฒด์ ์ผ๋ก Color Picker๋ฅผ ๊ตฌํํด ์ด๋ฏธ์ง ์๋ํฐ ํด์ ์์ ๋๋ฅผ ๋์ด๊ณ ์ถ์์ต๋๋ค. Fill, Stroke, Opacity Slider๋ฅผ ๊ตฌํํ์๊ณ ,
PanResponder๋ฅผ ์ฌ์ฉํด Opacity Slider๋ฅผ ์ปจํธ๋กค ํ๊ณ ์ถ์์ต๋๋ค.
์ด์ ์๊ฐ๋ฝ์ ์์น๋ฅผ Opacity Handler์ ์ ํ ์์ผ ๊ทธ ์์์ x์ขํ๋ก ์ด๋ํ ๊ฐ ๋งํผ์ Opacity๋ฅผ ๊ณ์ฐํ์์ต๋๋ค.
1 ์ฃผ์ฐจ : ๊ธฐํ ๋ฐ ์ค๊ณ
- ์์ด๋์ด ์์ง
- ๊ธฐ์ ์คํ ์ ์
- Git ์์ ํ๋ก์ฐ ๊ฒฐ์
- Figma๋ฅผ ์ฌ์ฉํ Mockup ์ ์
- MongoDb๋ฅผ ์ด์ฉํ DB Schema ์ค๊ณ
- Notion์ ์ด์ฉํ ์นธ๋ฐ ์์ฑ
2 ~ 3 ์ฃผ์ฐจ : ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ๋ฐํ
-
RN ๊ตฌํ
-
๋ฐฑ์๋ ์๋ฒ ๊ตฌํ
-
๋ฆฌ๋๋ฏธ ์์ฑ
- ๊ด๋ฆฌ์ ์ฉ์ด: ํ๋์ ์ ์ฅ์๋ก ๋ถํฐ ๊ทผ์์ ์ผ๋ก ๊ด๋ฆฌ๋๋ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
- ์์ธก์ฑ: ์๊ฒฉํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ๊ณตํ๊ณ , ์ด์ ์ํ์ ์ก์ ์ ๋ฐ์ ๋ค์ ์ํ๋ฅผ ๋ฐํํ๋ ์์ ํจ์์ธ ๋ฆฌ๋์๋ฅผ ํตํด ์์ธก ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- ๋๋ฒ๊น : ์ฑ์ ์ํ๊ฐ ์ธ์ , ์ด๋์, ์, ์ด๋ป๊ฒ ๋ฐ๋์๋์ง ์ฝ๊ฒ ์ถ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ ์ฉํฉ๋๋ค.
- ํ์ฅ์ฑ: ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ๋ฌด๊ฑฐ์ ๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ์ ์ฉ์ดํด ๋์ ํ์ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ด ์ฌ์ฉํ์์ต๋๋ค.
- ์์ ๋ก์ด ์คํค๋ง: ๊ท๊ฒฉํ ๋ ์คํค๋ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ์ํ ๋ ์์ ๋กญ๊ฒ ์์ ํ ์ ์์ด ํ์ฅ ๋ํ ์์ ๋กญ์ต๋๋ค.
- ๋ฌธ์ ์งํฅ: ๋ค์ํ ๋ฐ์ดํฐ ํ๋ ์ธํธ๋ฅผ ๋ด์ ์ ์๋ ์ ์ฐํ JSON(BSON) ์ ์ฌ ํ์์ผ๋ก ์ ์ฅ๋์ด, ๋ณต์กํ ๊ฒ์ ๋จ์ํ ์ํค๊ธฐ์ ์ฉ์ดํฉ๋๋ค.
- ํ๋ถํ ์ฟผ๋ฆฌ: ๋ค์ํ ํ ์คํธ ๊ฒ์๊ณผ ์์น ๋ฑ ํ๋ถํ ์ฟผ๋ฆฌ ์ธ์ด์ ๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ์ ๊ณตํด DB๋ฅผ ์์ฝ๊ฒ ์ด์ฉํ ์ ์์ต๋๋ค.
React Native๋ฅผ ์ฒ์ ๋ค๋ค๋ณด๋ฉฐ ๋๊ผ๋ ์ ์ "์๊ฐ๋ฝ์ด๋ผ๋ ์ ์ ์ผ๋ก ๋ฒ์ด์ง๋, ์ ๋ง์ ์ผ๋ค์ด ์๊ตฌ๋" ์์ต๋๋ค. ์น๋ง์ ๊ณต๋ถํ๋ค๋ฉด ์ง์คํด๋ณด์ง ๋ชปํ์ ์ ์ค์ณ๋ผ๋ ๋ถ๋ถ์ด ์ฌ๋ฏธ์๋ ์์๋ก์จ ์์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋์์ ๊ธฐ์กด์ ์ ๊ฐ ์ฌ์ฉํ๋ ์ฑ๋ค์ด ๊ทธ๋ฅ ํํฌ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๊ณ ๋ํ ์ผ์ ์ฑ๊ธด ๋ถ๋ถ๋ค์ด ์ ๋ง ๋ง๊ตฌ๋๋ผ๋ ๊ฒ์ ๋ค์๊ธ ๋๊ปด๋ณด๊ฒ ๋์์ต๋๋ค. ์ด๋ฒ ๊ฒฝํ์ ํตํด ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ชจ๋ฐ์ผ ์๋น์ค๋ค์ ์๊ฐ๋ฝ์ด ๋๋ฆด ๋ ๋ถํฐ ๋ผ์ด์ง ๋ ๊น์ง์ ์ผ๋ค์ ๋ํ ๊ด์ฌ์ ๋ง์ด ๊ฐ์ ธ๋ณด๊ฒ ๋ ๊ณ๊ธฐ๊ฐ ๋์ด ์ ์๊ฒ ์ข์ ์ํฅ์ ์ฃผ์์ต๋๋ค.
์ ๋ ์์ผ๋ก๋ ์ด์ ๊ฐ์ด ํด๊ฒฐํด์ผ ํ ์์๋ค์ด ๊ฐ๋ํ ํ๋ก์ ํธ๋ค๊ณผ ํจ๊ปํ ๊ฒ์ธ๋ฐ ์ด ์ํฉ์ด ๊ฐ๋ฐ์ ์ง์์ ์ผ๋ก ํฅ๋ฏธ์๊ฒ ๋ง๋ค์ด ์ค๋ค ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ์ง์์ ์ธ ํฅ๋ฏธ์ ํ๊ตฌ๋ฅผ ํตํด ์ฌ๋ฌ ํ๋ก์ ํธ๋ค์ ํ์ด ๋๊ฐ๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์ด ์ข์ ๊ฒฝํ์ด์์ต๋๋ค.





























