๋ฉํฐํฐ์น๋ก ์์ด๋์ด๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ค์๊ฐ ํ์ ์ด ๊ฐ๋ฅํ ๋ธ๋ ์ธ์คํ ๋ฐ ์๋น์ค
- ์์ด๋์ด ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- ๊ธฐ๋ฅ ์๊ฐ
- ๊ธฐ์ ์คํ
- ๊ฐ๋ฐ ๊ณผ์ ์์ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ
- ํ๊ณ
๊ธฐ์กด์ ๋ฐ์คํฌํ ๊ธฐ๋ฐ ์์ฐ์ฑ ๋๊ตฌ๋ ์ฃผ๋ก ํค๋ณด๋์ ๋ง์ฐ์ค๋ฅผ ์ค์ฌ์ผ๋ก ํ ์ ํํ๋ ์ ๋ ฅ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ํด๋ฆญ, ๋๋ธํด๋ฆญ, ๋๋๊ทธ์ ๊ฐ์ ๋์์ ์ต์ํ์ง๋ง, ์ฐฝ์์ ์ด๊ณ ๊ฐ๊ฐ์ ์ธ ์์ ์์๋ ๋๋๋ก ์ ์ ์ด๋ผ๊ณ ๋๊ปด์ง๋๋ค. ํนํ ๋ณต์กํ ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ฆฌํ๊ฑฐ๋ ์๊ฐ์ ์ผ๋ก ๊ตฌ์กฐํํ ๋, ์ด๋ฌํ ๋๊ตฌ๋ค์ด ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ ์ง๊ด์ฑ๊ณผ ์ ์ฐ์ฑ ๋ฉด์์ ๋ถ์กฑํจ์ด ์์ต๋๋ค. ํ์ง๋ง ํฐ์น ๋๋ฐ์ด์ค์์ ๋ฉํฐ ํฐ์น๋ฅผ ํ์ฉํ๋ฉด ์๊ฐ๋ฝ์ ์์ฐ์ค๋ฌ์ด ์์ง์์ ๋ฐํ์ผ๋ก ๋ค์ํ ์ ๋ ฅ ๋ฐฉ์์ ์ง์ํด, ์ ํํ๋ ์์ฐ์ฑ ๋๊ตฌ๊ฐ ์ ๊ณตํ ์ ์๋ ์๋กญ๊ณ ์ฐฝ์์ ์ธ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๋ฉํฐ ํฐ์น ๊ธฐ๋ฐ ์ธํฐํ์ด์ค๋ ๋จ์ํ ์์ฐ์ฑ์ ๋์ด๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ์ฐฝ์์ ์ด๊ณ ์คํ์ ์ธ ๋ธ๋ ์ธ์คํ ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ์์ด๋์ด๋ฅผ ๊ตฌ์กฐํํ๊ฑฐ๋ ๋ ธ๋๋ฅผ ํธ์งํ ๋, ๊ธฐ์กด์ ๋๊ตฌ์ฒ๋ผ ๋ณต์กํ ๋ฉ๋ด์ ๋จ์ถํค์ ์์กดํ๋ ๋์ , ์๊ฐ๋ฝ ์ ์ค์ฒ ํ๋๋ก ๊ฐ๋จํ๊ฒ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์๊ฐ๋ฝ์ผ๋ก ๋ ธ๋์ ํฌ๊ธฐ์ ๊ฐ๋๋ฅผ ์์ ํ๊ณ ์ธ ์๊ฐ๋ฝ์ผ๋ก ๋ ธ๋์ ํํ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ค ์๊ฐ๋ฝ์ ๋๋๊ทธ ๋์์ผ๋ก๋ ๋ ธ๋์ ๋๋น์ ๋์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ, ๋ฌผ๋ฆฌ์ ์ธ ์ ์ค์ฒ๋ฅผ ํตํ ์ํธ์์ฉ์ ๋จ์ํ ํด๋ฆญ๋ณด๋ค ๋ ์ง๊ด์ ์ด๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง๋๋ค. ๋, ๋ ์๊ฐ๋ฝ์ ๋ฒ๋ ค ์์ด๋์ด์ ์ฐ๊ฒฐ์ ์ ํ๋ํ๊ณ , ์ธ ์๊ฐ๋ฝ์ ์ฌ์ฉํด ๋ ธ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ฌ์ ์ํ๋ ๊ณผ์ ์ ๋ง์น ์ข ์ด ์์ ์ง์ ๊ทธ๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ชฐ์ ๊ฐ์ ์ค๋๋ค.
์ง๊ธ์ ์์ดํจ๋ ํน์ ์ค๋งํธํฐ์์ ์์ฐ ๊ฐ๋ฅํฉ๋๋ค.
(ํฐ์น๋ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐ๋ฝ ๋ฒํธ๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.)
- ๋๋ธ ํด๋ฆญ: ๋ํ ๋ ธ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํ ์๊ฐ๋ฝ ๋๋๊ทธ: ๋ํ ๋ ธ๋์ ์์น๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๋ ์๊ฐ๋ฝ ํ์น: ๋ ์๊ฐ๋ฝ์ ๊ฑฐ๋ฆฌ์ ๊ฐ๋๋ฅผ ํตํด ๋ํ ๋ ธ๋์ ํฌ๊ธฐ์ ๊ฐ๋๋ฅผ ํธ์งํ ์ ์์ต๋๋ค.
- ์ธ ์๊ฐ๋ฝ: ์ธ ์๊ฐ๋ฝ ์ค, 1๋ฒ์งธ์ 3๋ฒ์งธ์ ๊ฐ๋๋ฅผ ํตํด ๋ํ ๋ ธ๋์ ์ข ๋ฅ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๋ค ์๊ฐ๋ฝ: ๋ค ์๊ฐ๋ฝ ์ค, 1๋ฒ์งธ์ 4๋ฒ์งธ์ ๊ฑฐ๋ฆฌ๋ฅผ ํตํด ๋ํ ๋ ธ๋์ ๋์ด์ ๋๋น๋ฅผ ๊ฐ๊ฐ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ๋ค์ฏ ์๊ฐ๋ฝ: ๋ค์ฏ ์๊ฐ๋ฝ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๋ํ ๋ ธ๋์ ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๋ํ ๋ค์ ๋๋ธ ํด๋ฆญ: ๋ํ ๋ ธ๋๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
- ์ต๋ช ๋ก๊ทธ์ธ์ ์ ๊ณตํ๊ณ ์ฌ์ฉ์๋ ๋๋ค์ ์ด๋ฆ์ผ๋ก ๋ณด๋๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
- ๋ณด๋์ ์ ๋ชฉ์ ํธ์งํ ์ ์๊ณ , ์๋ก์ด ๋ณด๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ๋ณด๋์ ๋ฐฐ๊ฒฝ ํจํด์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (Dot / Line)
- ๋ณด๋ ํธ์ง ๋ชจ๋์ ๋ ธ๋ ํธ์ง ๋ชจ๋๋ก ํ ๊ธ๋งํ ์ ์์ต๋๋ค.
- ํด์งํต ๋ฒํผ์ผ๋ก ๋ณด๋๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
์ ๋ Brave ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ํฐ์น ๋๋ฐ์ด์ค์ธ ์์ดํจ๋์์๋ ์ด๋ป๊ฒ ๋๋ฒ๊น ์ ํ ์ง ๊ณ ๋ฏผ์ด ๋์์ต๋๋ค. (์์ง๊น์ง Brave ์์ ์์ดํจ๋ ์ฐ๊ฒฐํ์ฌ ๋๋ฒ๊น ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชป์ฐพ์์ต๋๋ค๐ฅฒ) ์์ดํจ๋๋ Apple ์ ๊ฐ๋ ฅํ ํต์น(?) ์๋์ ์๊ธฐ ๋๋ฌธ์ Safari ๋ฅผ ํตํด ๋๋ฒ๊น ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
์์ดํจ๋๋ฅผ C ํ์ ์ ์ผ์ด๋ธ๋ก ์ฐ๊ฒฐํ๊ณ Safari ์๋จ์ Develop ์ ํด๋ฆญํ๊ณ ์๋์ ๊ฐ์ด iPadOS ๋ฅผ ํ์ธํ์ฌ ์ฝ์์ฐฝ์ ์ด์ด๋ณผ ์ ์์ต๋๋ค.
์์ง localhost ๋ก ๊ฐ๋ฐ์ค์ธ ํ๊ฒฝ์ด๋ผ๋ฉด, ํฐ๋ฏธ๋์ ์ด๊ณ ifconfig en0๋ฅผ ์ ๋ ฅํ์ฌ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ์ค์ ์ ๋ณด ์ค ์ฒซ ๋ฒ์งธ ์ด๋๋ท ์ด๋ํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. ์๋ ์ด๋ฏธ์ง์์ inet ๋ค์์๋ โIP ์ฃผ์โ + โ:ํฌํธ๋ฒํธโ ๋ฅผ ์์ดํจ๋ Safari ์ ์ ๋ ฅํ๋ฉด ์ ๋ ๋๋ง๋ฉ๋๋ค!
๋ฌดํ ์บ๋ฒ์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ทธ๋ฆฌ๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์์ต๋๋ค.
SVG(Scalable Vector Graphics)๋ ๋ฒกํฐ ๊ทธ๋ํฝ ๊ธฐ๋ฐ์ ์น ๊ธฐ์ ๋ก, ํฌ๊ธฐ ์กฐ์ ๊ณผ ํ์ง ์ ์ง์ ๊ฐ์ ์ ๊ฐ์ง๋ฉฐ, ๋ค์ํ ๊ทธ๋ํฝ๊ณผ ์๊ฐ์ ์์๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ๋/์ถ์ ์ ํ์ง ์ ์ง, ๊ตฌํ์ ๊ฐ๊ฒฐ์ฑ, CSS์์ ์ฐ๋, GPU ๊ฐ์ ์ง์, ๊ทธ๋ฆฌ๊ณ DOM ์กฐ์์ ์ ์ฐ์ฑ์ด ์ค์ํ๋ค๊ณ ํ๋จํ์ฌ SVG์ pattern์ ์ฑํํ๊ฒ ๋์์ต๋๋ค.
์ฅ์
- SVG๋ ๋ฒกํฐ ๊ธฐ๋ฐ์ผ๋ก, ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ฌ๋ ํ์ง ์ ํ ์์ด ๋ ๋๋ง๋๋ฏ๋ก ํ๋/์ถ์(Zoom)์๋ ์ ๋ช ํ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
- pattern ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฆฌ๋ ํจํด์ ๋ณด๋ค ์์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- DOM์ ์ถ๊ฐ๋ SVG ์์๋ฅผ ์ง์ ์กฐ์ํ๊ฑฐ๋ ์คํ์ผ์ ๋ณ๊ฒฝํ๊ธฐ๋ ์ฉ์ดํฉ๋๋ค. SVG๋ ์์ฒด์ ์ผ๋ก ๋ด๋ถ DOM์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- CSS์์ ์ฐ๋์ด ๊ฐ๋ฅํ์ฌ, fill ์์ฑ์ ํ์ฉํด ํจํด ์คํ์ผ๋ง์ ๊ฐํธํ๊ฒ ํ ์ ์์ต๋๋ค.
- SVG๋ ๋ธ๋ผ์ฐ์ ์ GPU ๊ฐ์์ ํ์ฉํ๋ฏ๋ก, ํ๋/์ถ์ ์ ๋น๊ต์ ๋ถ๋๋ฝ๊ฒ ๋์ํฉ๋๋ค.
๋จ์
- DOM ์์๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํนํ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ด๋ ๋น ๋ฅธ ๋์ ์ฒ๋ฆฌ ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ์ ๊ตํ ๊ทธ๋ฆฌ๋ ํจํด ์ ์ด๊ฐ ์ด๋ ต์ต๋๋ค.
- Canvas์ฒ๋ผ ํฝ์ ๋จ์๋ก ์ธ๋ฐํ๊ฒ ์ ์ ํฌ๊ธฐ, ๊ฐ๊ฒฉ ๋ฑ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ์๋ ์ ์ฝ์ด ๋ฐ๋ฆ ๋๋ค.
์ฅ์
- Canvas๋ ๋ฒกํฐ๊ฐ ์๋ ํฝ์ ๋จ์๋ก ๋ ๋๋ง๋๋ฏ๋ก, ๋๊ท๋ชจ ๊ทธ๋ํฝ ์ฒ๋ฆฌ์ ์ ํฉํ๋ฉฐ ๊ณ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค.
- DOM ์์๋ฅผ ์ถ๊ฐํ์ง ์์ผ๋ฏ๋ก, ๋๋์ ์ ์ด๋ ๋ณต์กํ ๊ทธ๋ํฝ์ ๋ ๋๋งํ ๋ DOM ๋ณต์ก๋๊ฐ ์ค์ด๋ค์ด ํจ์จ์ ์ ๋๋ค.
- ๋์ ๋ ๋๋ง์ ๊ฐ์ ์ด ์์ต๋๋ค.
- JavaScript๋ฅผ ์ฌ์ฉํด ์ ์ ํฌ๊ธฐ, ๊ฐ๊ฒฉ, ์์น ๋ฑ์ ์ค์๊ฐ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
- ์ค์ด๋ ํฌ๊ณผ ๊ฐ์ ๋์๋ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ ๋๋ฉ์ด์ ๊ตฌํ์ ์ ๋ฆฌํฉ๋๋ค.
- Canvas๋ ํ๋ ์ ๋จ์๋ก ์ฌ๋ ๋๋ง์ ์ฒ๋ฆฌํ๋ฏ๋ก ์์ฐ์ค๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ์ง์ํฉ๋๋ค.
๋จ์
- ํ์ง ์ ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ํ๋/์ถ์ ์ ์ ํด์๋ ๋๋์ด ๋ค ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๊ณ ํด์๋ Canvas ์ค์ ์ผ๋ก ์ด๋ ์ ๋ ์ํํ ์ ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Canvas ํฌ๊ธฐ๋ฅผ ๋ค์ ์ค์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
- ๋ชจ๋ ์์๊ฐ ๋ ๋ฆฝ์ ์ธ DOM ์์๊ฐ ์๋๋ผ ํ๋์ ๋จ์ผ ํฝ์ ๋งต์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ด๋ ค์์ด ์์ต๋๋ค.
- Canvas๋ ํฝ์ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ DOM ์ด๋ฒคํธ์ ์ง์ ์ ์ผ๋ก ์ฐ๋ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ํน์ ์ ์ด๋ ์์ญ์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ณ๋์ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
ํ๋ ๋์คํ๋ ์ด๋ ๊ณ ํด์๋๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์, Device Pixel Ratio(DPR)์ ๋ฐ๋ผ ํ๋ฉด์ ํ์๋๋ ๊ทธ๋ํฝ์ ์ ๋ช ๋๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๊ธฐ๋ณธ ํด์๋๋ก๋ง Canvas๋ฅผ ์ค์ ํ๋ฉด, ํนํ ๊ณ ํด์๋ ๋์คํ๋ ์ด์์ ๊ทธ๋ํฝ์ด ํ๋ฆฟํ๊ฑฐ๋ ํฝ์ ์ด ๋๋๋ผ์ ธ ๋ณด์ผ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด window.devicePixelRatio๋ฅผ ํ์ฉํด ํ์ฌ ๋๋ฐ์ด์ค์ DPR ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ๊ฐ์ ๋๋ฐ์ด์ค์ ๋ฌผ๋ฆฌ์ ํฝ์ ๊ณผ CSS ํฝ์ ๊ฐ์ ๋น์จ์ ๋ํ๋ด๋ฉฐ, ๊ณ ํด์๋ ๋์คํ๋ ์ด์ผ์๋ก 1๋ณด๋ค ํฐ ๊ฐ(์: 2, 3 ๋ฑ)์ด ๋ฉ๋๋ค.
์ด ๊ฐ์ ๋ํ์ ์์น(x, y), ํฌ๊ธฐ(width, height), ์ ๋๊ป(lineWidth) ๋ฑ์ ๋ชจ๋ ๋ ๋๋ง ์์ฑ์ ๊ณฑํด์ค์ผ๋ก์จ ๋๋ฐ์ด์ค ํด์๋์ ๋ง์ถ ์ ๋ช ํ ๊ทธ๋ํฝ์ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, DPR์ด 2์ธ ๊ฒฝ์ฐ, ๋ํ์ ๋ชจ๋ ์์ฑ์ 2๋ฐฐ๋ก ํ๋ํด ๊ณ์ฐํ๊ณ Canvas๊ฐ ์ด๋ฅผ ๋ ๋๋งํ๋๋ก ์ค์ ํฉ๋๋ค.
Canvas ํ๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก CSS๋ก ์ค์ ๋ ํฌ๊ธฐ์ ์ค์ ๋ ๋๋ง์ ์ฌ์ฉ๋๋ ๋ด๋ถ ํด์๋(ํฝ์ ํฌ๊ธฐ)๊ฐ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ์ฆ, Canvas์ CSS ํฌ๊ธฐ์ ์ค์ ํฝ์ ํด์๋๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, ๊ทธ๋ํฝ์ด ํ๋ฆฟํ๊ฒ ๋ณด์ด๋ ํ์์ด ๋ฐ์ํฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, Canvas์ ๋ด๋ถ ํด์๋๋ DPR์ ๋ง์ถฐ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, CSS๋ก ์ง์ ๋ Canvas์ ํฌ๊ธฐ๊ฐ 400x300์ด๊ณ DPR์ด 2๋ผ๋ฉด, ๋ด๋ถ ํด์๋๋ฅผ 800x600์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
canvas.width
์canvas.height
๊ฐ์ DPR์ ๋ฐ๋ผ ์ฆ๊ฐ์์ผ ๊ณ ํด์๋๋ฅผ ์ง์.- Canvas์ ์คํ์ผ ํฌ๊ธฐ(
style.width
,style.height
)๋ฅผ ๊ธฐ์กด CSS ํฌ๊ธฐ์ ๋์ผํ๊ฒ ์ ์งํ์ฌ, ์๊ฐ์ ์ผ๋ก๋ ๋์ผํ ํฌ๊ธฐ๋ก ๋ณด์ด๋๋ก ์ค์ . - ์กฐ์ ๋ ํด์๋์ ๋ง๊ฒ ๋ชจ๋ ๊ทธ๋ํฝ ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ DPR๋ก ๊ณ์ฐํ์ฌ ๋ ๋๋ง.
์ด์ฒ๋ผ Canvas ์์ฒด์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉด, ํ๋/์ถ์๋ฅผ ํ๊ฑฐ๋ ๋๋ฐ์ด์ค ํ๊ฒฝ์ด ๋ณํ๋๋ผ๋ ๊ทธ๋ํฝ์ด ์ ๋ช ํ๊ฒ ์ ์ง๋ฉ๋๋ค. ํนํ ๊ณ ํด์๋ ๋์คํ๋ ์ด ํ๊ฒฝ์์ ์ด๋ฌํ ์ค์ ์ ๋์ฑ ์ค์ํ๋ฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ Canvas๋ฅผ ์๋์ผ๋ก ์ค์ผ์ผ๋งํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ํ์ง ์ ํ๋ฅผ ๋ฐฉ์งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
[DPR ์ ์ฉ ์ ]
[DPR ์ ์ฉ ํ]
๋ฉํฐํฐ์น ์ธํฐํ์ด์ค๋ ํฐ์น ๊ธฐ๋ฐ ๋๋ฐ์ด์ค์์ ์ฌ๋ฌ ์๊ฐ๋ฝ์ ๋์์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์
์ ์ง๊ด์ ์ผ๋ก ์ํํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ด๋ฅผ React ํ๊ฒฝ์์ ํ์ฉํ๊ธฐ ์ํด useMultiTouch
๋ผ๋ ์ปค์คํ
Hook์ ์ค๊ณํ์ผ๋ฉฐ, ์ด Hook์ ์ฌ๋ฌ ์๊ฐ๋ฝ ํฐ์น๋ฅผ ์ธ์ํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ํ ๋
ธ๋๋ฅผ ํธ์งํ๊ฑฐ๋ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
1. ๊ธฐ๋ณธ ๋์ ์๋ฆฌ
๋ฉํฐํฐ์น ์ธํฐํ์ด์ค๋ TouchEvent
๋ฅผ ํตํด ๋๋ฐ์ด์ค ํ๋ฉด์ ๊ฐํด์ง๋ ์ฌ๋ฌ ์๊ฐ๋ฝ์ ์์น, ์์ง์, ๊ฑฐ๋ฆฌ, ๊ฐ๋ ๋ฑ์ ๊ฐ์งํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ํํ๋ ค๋ ์์
์ ์ถ๋ก ํ๊ณ , ์ด์ ๋ฐ๋ผ ๋ํ์ ์์ฑ(ํฌ๊ธฐ, ํ์ , ์์ ๋ฑ)์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ํํ๋ก ๋ณํํ๋ ์์
์ ์งํํฉ๋๋ค.
์ค์ ๋ก ์ด๋ฒคํธ๋ฅผ ์ฝ์์ ์ฐ๊ณ ์์ดํจ๋์์ ํฐ์น๋ฅผ ํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด Touch Event ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ข ๋ ์์ธํ ๋ค์ฌ๋ค ๋ณด๋ฉด ์ ๊ฐ ๋๋๊ทธ ํด๋ Touch ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ํ์ฌ ์๊ฐ๋ฝ 3๊ฐ๋ก ํฐ์น๋ฅผ ํ๊ธฐ ๋๋ฌธ์, 3๊ฐ์ TouchList (์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด) ๊ฐ ์๊ณ , ๊ทธ List ์์๋ Touch ๋ผ๋ ์ธํฐํ์ด์ค๋ก ์กด์ฌํ๊ณ ์์ต๋๋ค.
2. ๋ฉํฐํฐ์น์ ํ์ฑํ์ ์ด๊ธฐํ
-
ํฐ์น ์ด๋ฒคํธ ์ถ์
์ฌ์ฉ์๊ฐ ํ๋ฉด์ ์๊ฐ๋ฝ์ ๋๋ ์๊ฐ๋ถํฐ
TouchEvent
๋ฅผ ํตํด ํฐ์น ์ขํ๋ฅผ ๊ฐ์งํฉ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฐ์น ํฌ์ธํธ(์๊ฐ๋ฝ์ ์์น ์ขํ)๋ฅผ ์ถ์ ํฉ๋๋ค. -
๋ฉํฐํฐ์น ์ํ ๊ด๋ฆฌ
๋ ์๊ฐ๋ฝ ์ด์์ด ๋์์ ํ๋ฉด์ ํฐ์นํ๋ฉด ๋ฉํฐํฐ์น ๋ชจ๋๊ฐ ํ์ฑํ๋ฉ๋๋ค. ์ด ์ํ๋
useRef
๋ฅผ ํ์ฉํด ์ง์์ ์ผ๋ก ์ถ์ ๋๋ฉฐ, ์๊ฐ๋ฝ์ด ํ๋ฉด์์ ๋ผ์ด์ง๋ฉด ์ด๊ธฐํ๋ฉ๋๋ค. -
์ด๊ธฐ ๋ฐ์ดํฐ ์ค์
๋ฉํฐํฐ์น๊ฐ ํ์ฑํ๋์์ ๋ ์ด๊ธฐ ๊ฑฐ๋ฆฌ์ ๊ฐ๋๋ฅผ ๊ณ์ฐํ๊ณ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ด์ด์ง๋ ์์ ์์ ๋น๊ต ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
3. ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ์ฒ๋ฆฌ ๋ฐฉ์
-
๋ํ์ ํฌ๊ธฐ์ ํ์ ์กฐ์
๋ ์๊ฐ๋ฝ์ผ๋ก ํฐ์นํ๋ฉด ์๊ฐ๋ฝ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ๊ฐ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
-
๊ฑฐ๋ฆฌ ๋ณํ
์๊ฐ๋ฝ ๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ ์ด๊ธฐ ๊ฑฐ๋ฆฌ๋ณด๋ค ์ฆ๊ฐํ๋ฉด ๋ํ์ด ํ๋๋๊ณ , ๊ฐ์ํ๋ฉด ์ถ์๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ํ์ ์ค์ผ์ผ์ ์กฐ์ ํฉ๋๋ค. ํฌ๊ธฐ๋ ์ต์ 0.5๋ฐฐ์์ ์ต๋ 3๋ฐฐ๊น์ง ์ ํํ์ฌ ๋ถํ์ํ ์๊ณก์ ๋ฐฉ์งํฉ๋๋ค.
-
๊ฐ๋ ๋ณํ
์๊ฐ๋ฝ ๊ฐ์ ๊ฐ๋ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ๋ํ์ ํ์ ์ํต๋๋ค. ๊ฐ๋๋ ์ด๊ธฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๋ฉฐ, ํ์ ๊ฐ์ ๋ผ๋์ ๋จ์๋ฅผ ๋(degree)๋ก ๋ณํํด ์ ์ฉ๋ฉ๋๋ค.
-
๋ํ์ ํํ ๋ณ๊ฒฝ
์ธ ์๊ฐ๋ฝ์ ์ฌ์ฉํ๋ฉด ๋ ์๊ฐ๋ฝ ๊ฐ์ ๊ฐ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํน์ ๋ํ์ ์ ํํ์ฌ ํ์ฌ ๋ ธ๋์ ํํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
-
๊ฐ๋ ๊ธฐ๋ฐ ๋ํ ์ ํ
์๊ฐ๋ฝ ๊ฐ ๊ฐ๋๊ฐ ์์์๋ก ๊ฐ๋จํ ๋ํ(์: ์ํ, ์ง์ฌ๊ฐํ)์ ์ ํํ๊ณ , ๊ฐ๋๊ฐ ์ปค์ง์๋ก ๋ณต์กํ ๋ํ(์: ๋ณ ๋ชจ์, ๋ค๊ฐํ)์ ์ ํํฉ๋๋ค.
-
์ ํ ๋ฒ์ ์ค์
๊ฐ๋๋ฅผ ๋จ๊ณ์ ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ํ์ ํํ๋ฅผ ์์ธก ๊ฐ๋ฅํ ๋ฒ์ ๋ด์์๋ง ๋ณ๊ฒฝํฉ๋๋ค. ์ด๋ ์๋์น ์์ ๊ณผ๋ํ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น์ ๋๋ค.
๋ค ์๊ฐ๋ฝ์ ์ฌ์ฉํ๋ฉด ํฐ์น๋ ์์ญ์ ์ต์, ์ต๋ ์ขํ๋ฅผ ๊ณ์ฐํ์ฌ ๋ํ์ ๊ฐ๋ก ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
-
ํฌ๊ธฐ ์ ํ
๋ํ์ ์ต์ ํฌ๊ธฐ๋ฅผ 100px๋ก ์ค์ ํ์ฌ ๋๋ฌด ์์ ํฌ๊ธฐ๋ก ์ธํด ๋ํ์ด ๋ณด์ด์ง ์๊ฑฐ๋ ์กฐ์์ด ์ด๋ ค์์ง๋ ์ํฉ์ ๋ฐฉ์งํฉ๋๋ค.
-
๋์ ํฌ๊ธฐ ๋ณ๊ฒฝ
๋ค ์๊ฐ๋ฝ ๊ฐ์ ๊ฑฐ๋ฆฌ ๋ณํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ํ์ ํญ๊ณผ ๋์ด๋ฅผ ๊ณ์ฐํด ์ค์๊ฐ์ผ๋ก ์ ์ฉํฉ๋๋ค.
- ๋ํ์ ์์ ๋ณ๊ฒฝ
๋ค์ฏ ์๊ฐ๋ฝ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ ์๊ฐ๋ฝ๊ณผ ๋ค์ฏ ๋ฒ์งธ ์๊ฐ๋ฝ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ํ์ ์์์ ๋ณ๊ฒฝํฉ๋๋ค.
-
๊ฑฐ๋ฆฌ์ ์์ ๋งคํ
๊ฑฐ๋ฆฌ๊ฐ ํน์ ์๊ณ๊ฐ์ ๋์ผ๋ฉด ํด๋น ๋ฒ์์ ํด๋นํ๋ ์์์ด ์ ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์งง์ ๊ฑฐ๋ฆฌ๋ ๋นจ๊ฐ์, ์ค๊ฐ ๊ฑฐ๋ฆฌ๋ ํ๋์, ๋ ๊ธด ๊ฑฐ๋ฆฌ๋ ํฌ๋ช ์์ผ๋ก ์ค์ ๋ฉ๋๋ค.
-
์ ์ฐํ ์์ ์ ํ
๊ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์๊ณ๊ฐ(threshold)์ผ๋ก ๋๋์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ค์ํ ์์์ ์ ๊ณตํ๋ฉฐ, ์ฌ์ฉ์๋ ์์์ ์ง๊ด์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ResizeObserver loop completed with undelivered notifications
์ด ๊ฒฝ๊ณ ๋ ๋ธ๋ผ์ฐ์ ์ฝ์์์ ์์ฃผ ๋ํ๋๋ ๋ฉ์์ง๋ก, ResizeObserver๊ฐ ๋ ์ด์์ ๋ณํ๋ฅผ ๊ฐ์งํ๋ ๊ณผ์ ์์ ์ผ๋ถ ์๋ฆผ์ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ์์ ๋ํ๋ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์น๋ช ์ ์ธ ์ค๋ฅ๋ ์๋์ง๋ง, ๋ ์ด์์ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ์์ ์ ์์ ๋๋ ์ด๋ฒคํธ ๋ฃจํ ์ฒ๋ฆฌ ๋ฐฉ์์์ ๋ฐ์ํฉ๋๋ค. ์ด ๊ฒฝ๊ณ ๋ ํน์ ํ ์ํ ๋ณ๊ฒฝ, DOM ์์ , ๋๋ ๋ฆฌ๋ ๋๋ง ์์ ์ด ResizeObserver์ ๊ฐ์ง ๋์๊ณผ ๊ฒน์น๋ฉด์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ค์๊ฐ๋ฝ์ผ๋ก Shape ์ ๋๋น์ ๋์ด๋ฅผ ์์ ํจ์ ์์ด์ ์ด ๊ฒฝ๊ณ ๊ฐ ๋ด์ต๋๋ค.
ResizeObserver๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
const resizeObserver = new ResizeObserver(() => {
setTimeout(() => {
// ์ํ ์
๋ฐ์ดํธ ๋๋ DOM ์์
}, 0);
});
๊ฐ์ธ ํ๋ก์ ํธ์ ํน์ง์ ๋ฝ์๋ฉด ํผ์๋ผ์ ๋ชจ๋ ๊ฒ์ด ์ฆ๊ฑฐ์ ๊ณ ๋ชจ๋ ๊ฒ์ด ์ธ๋ก์ ์ต๋๋ค.ํผ์๋ผ์ ๊ฒฐ์ ์ด ๋นจ๋์ง๋ง ํจ๊ป ๊ณ ๋ฏผํด์ค ์ฌ๋์ด ์๋ค๋ ๊ฒ์ด ํ ์๊ฐ์ ๊ฐํ๊ฒ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌํ๋ฐฉ์์ ๋๋ฆ ๊ฒฐ์ ํ์ฌ ๊ตฌํ์ ํ๋ค๋ณด๋ฉด ์์์น ๋ชปํ ๋ถ๋ถ์์ ์์์น ๋ชปํ ๋ฌธ์ ๋ฅผ ๋ง๋๊ณค ํ์ต๋๋ค. ์ด๋ฅผ ํ ๋ฉด ๋ฌดํ์บ๋ฒ์ค๋ผ๋๊ฐ, supabase ์ DB ์ค๊ณ ๋ฑ์์ ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ๋ง์๋๋ฐ, reset ํ๊ณ ๋ค์ ์๊ฐํด๋ณด๋ฉด ์๊ฐ๋ณด๋ค ๋จ์ํ ๋ฐฉํฅ์์ ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ๋, ์์ ํ๋ฉด์ svg ๋ canvas, ๊ทธ๋ฆฌ๊ณ react ์ ์ํํ๋ฆ ๋จ๋ฐฉํฅ ๊ตฌ์กฐ์ ๋ํด ๋ค์ ํ๋ฒ ๊นจ๋ซ๊ณ ์ตํ ์ ์๋ ์๊ฐ์ด์์ต๋๋ค. ์์ผ๋ก๋ ๊พธ์คํ ์ ๋ฐ์ดํธ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.