์ฃผ์ด์ง ๊ฒ์ ๋ณด๋์ ํด๋ฆฌ์ค๋ฏธ๋ ธ ๋ํ์ ์ ์ ํ ์ฑ์ ๋๊ฐ๋ ํผ์ฆ ํ์์ ์น ๊ฒ์์ ๋๋ค.
๊ทธ๋ฐ๋ฐ 3D๋ฅผ ๊ณ๋ค์ธ..!
-
ํด๋น ๊ฒ์์ ์ต์ ๋ฒ์ ์ Chrome, Firefox, Safari์์ ์ง์ํ๊ณ ์์ต๋๋ค.
-
ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ ์ ์ฌ๊ฐํ๋ค์ ๋ณ์ด ๋ง๋ฟ๊ฒ ๋ถ์ฌ ํ๋๋ก ์ด์ด ๋ง๋ ํ๋ฉด ๋ํ์ ๋ปํฉ๋๋ค.
git clone https://github.com/chlghks/polyomino-puzzle.git
cd polyomino-puzzle
npm install
npm run start
๋ค์ํ ๊ธฐ๋ฅ๋ณด๋ค๋ ํ๋์ ํ์คํ ์ปจ์ ์ ์ค์ฌ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์ถ์์ต๋๋ค.
3์ฐจ์์ด๋ผ๋ ์
์ฒด์ ์ธ ๊ณต๊ฐ์ ์ด์ฉํด์ ๋ฌด์์ธ๊ฐ๋ฅผ ๋ง๋ค์ด ๋ด๋ ๊ฒ ์์ฒด์ ํฐ ๋งค๋ ฅ์ ๋๊ผ๊ณ ,
ํ
ํธ๋ฆฌ์ค์ ํผ์ฆ ๋ธ๋ญ ๋ง์ถ๊ธฐ ๋์ด์์ ์์ด๋์ด๋ฅผ ์ป์ด 3D ํด๋ฆฌ์ค๋ฏธ๋
ธ ํผ์ฆ ๊ฒ์์ ๊ธฐํํ๊ฒ ๋์์ต๋๋ค.
- ๊ธฐ์ ์คํ ๊ฒํ
- ํ์คํฌ ์นด๋ ์์ฑ
- Mock up
- ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ
- Netlify ๋ฐฐํฌ
- ES6+
- React
- Three.js
- React-Three-Fiber
- React-Three/Drei
- Prop-Types
- Styled-Components
- Zustand
๋ฐ๋ณตํด์ ๋ง๋ค์ด์ง๋ ๋ธ๋ญ๋ค๊ณผ Three.js ๋ ๋๋ง์ ์ํ ๊ตฌ์ฑ ์์(scene, light, camera, audio)๋ค์ React์ Component๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํจ์ผ๋ก์จ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ ์ ํ์ต๋๋ค.
์ฒ์ ํ๋ก์ ํธ๋ฅผ ๊ธฐํํ ๋๋, 2D์์ ๋ฒ์ด๋ 3D๋ก ์๊ฐํ๋ ๊ฒ์ด ์ต์ํ์ง ์์์ต๋๋ค.
๊ทธ๋์ ๊ฒ์์ ํ๋ ์ดํ๋ ํ์ด์ง๋ง <canvas>๋ก ๊ตฌํํ๊ณ , ๊ทธ ์ธ ๊ฒ์ ์ผ์์ ์ง, ๋ญํน ํ์ธ ๋ฑ์ ๋๋จธ์ง ํ์ด์ง๋ค์ <button> ๋ฑ์ Element๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ์์ํ์ต๋๋ค.
ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ 3D๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ์ต์ํด์ง๋ ํ์ด์ง๋ก ๋๋ ์ผ ํ ์์๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ขํ์ ์์น์ํค๊ณ ์นด๋ฉ๋ผ๋ฅผ ์ปจํธ๋กคํด์ ์ฅ๋ฉด์ด ์ ํ๋๋ ๋ฏํ ํจ๊ณผ๋ก ๊ตฌํํ๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋์ต๋๋ค.
์ดํ ํด๋น ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ์์๋ฅผ <canvas> ๋ด์์ 3D ์์๋ก ๊ตฌํํ์๊ณ , ์ด ๊ฒฝํ์ ํตํด ์์ ์๊ฐ์ ์ ํ์ด ํ๋ก์ ํธ์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ฐ๊ฟ ์ ์๋ค๋ ์ฌ์ค์ ๋ฐฐ์ ์ต๋๋ค.
์ฒ์ Mockup์ผ๋ก ๊ตฌ์ํ ๋๋ ๊ฒ์ ์ฑ๊ณผ ๊ฐ์ ๋๋์ ์ฃผ๊ธฐ ์ํด Carousel ๋ฐฉ์์ ์๊ฐํ์ต๋๋ค.
๋ง์ Carousel ๋ฐฉ์์ผ๋ก ๊ตฌํํด ๋ณด๋ ์์ฑ๋ ๋ธ๋ญ์ด ํ ๋์ ๋ณด์ด์ง ์์ ์ฌ์ฉ์ ์
์ฅ์์ ๋ถํธํจ์ ๋๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ค์ด์ผ์ ๋๋ฆฌ๋ ๋ฐฉ์์์ ์์ด๋์ด๋ฅผ ์ป์ด, ํผ์ฆ ๋ธ๋ญ๋ค์ด ๋ค์ด์ผ์ ๋๋ฆฌ๋ ๊ฒ์ฒ๋ผ ํ์ ๋๊ฒ ํ์ฌ 2D ๊ฐ์ ๋๋๊ณผ ๋ธ๋ญ์ด ํ ๋์ ๋ณด์ด์ง ์์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
๊ฒ์ ํ๋ ์ด์ ์ฌ์ฉ๋๋ ๋ธ๋ญ๋ค์ ์คํ
์ด์ง๋ณ๋ก ๊ณ ์ ๋ ์ข
๋ฅ์ ๋ธ๋ญ์ ๋ฐฉํฅ๋ง ๋ฌด์์๋ก ๋ฐ๊ฟ์ฃผ๋ฉฐ ์์ฑํ์ต๋๋ค.
ํ์ง๋ง ๊ณ์ํด์ ๊ฐ์ ์ข
๋ฅ์ ๋ธ๋ญ์ด ์์ฑ๋๋ฉด ์ผ์ ํ ํจํด์ด ๋ฐ๋ณต๋์ด ์ฌ์ฉ์ ์
์ฅ์์ ์ง๋ฃจํจ์ ๋๋ ์๋ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ ์คํ
์ด์ง๊ฐ ์์๋ ๋๋ง๋ค ํผ์ฆ ๋ธ๋ญ ์์ฒด๋ฅผ ๋ฌด์์๋ก ์์ฑํ์ฌ ๋ถ๊ท์น์ฑ์ ์ถ๊ฐํ์ต๋๋ค.
๊ฒ์ ๋ณด๋์ ์ขํ(์
) ์ ๋ณด๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด์ DFS ๋ฐฉ์์ผ๋ก ์ํํ๋ฉด์ ํ์ฌ ์ ํ๋ ์
์ ์ค์ฌ์ผ๋ก ์ธ์ ํ ์
์ค ํ๋๋ฅผ ๋ฌด์์๋ก ์ ํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๋๋ค ๋ธ๋ญ์ ๋ง๋ค์ด๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ต๋๋ค.
์ธ์ ํ ์
์ ๋ฌด์์๋ก ์ ํํ๋ ๊ณผ์ ์์ ๊ณ ๋ฆฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ์
์ ์ฐ์ ์ผ๋ก ์ ํ๋๊ฒ ํ์ฌ 1๊ฐ์ ์
๋ก ์ด๋ฃจ์ด์ง ๋ธ๋ญ์ด ์๊ธฐ๋ ์์ธ ์ผ์ด์ค๋ฅผ ๋ฐฉ์งํ์ต๋๋ค.
๊ฒ์์ ๊ธฐ๋ณธ์ ์ธ ์์๋ค์ ๋ชจ๋ ๊ตฌํํ๊ณ ๋์ Netlify๋ก ๋ฐฐํฌํ์ ๋ ๋๋ง ์๋๊ฐ ๋๋ ค์ง๊ณ ๋ฒ๋ฒ
๊ฑฐ๋ฆฌ๋ ํ์์ด ํ์ธ๋์์ต๋๋ค.
๋ก์ปฌ ํ๊ฒฝ์์๋ 60FPS์ผ๋ก ์ ์ง๋๋ ๊ฐ์ด ๋ฐฐํฌ ์ดํ์ 25FPS๊น์ง ๋จ์ด์ง๋ Frame Drop์ด ๋ฐ์ํ์ต๋๋ค.
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ์ด์ฉํด์ ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ, ํน์ Hook(useFrame)์ด ์คํ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ก์ปฌ์์๋ 0.92ms, ๋ฐฐํฌ ํ์๋ 10.96ms๋ก ์ฝ 10๋ฐฐ ์ด์์ ์ฐจ์ด๊ฐ ์์์ต๋๋ค.
![]() |
![]() |
---|---|
๋ก์ปฌ ํ๊ฒฝ ํ๋กํ์ผ๋ง ๊ฒฐ๊ณผ | ๋ฐฐํฌ ํ ํ๋กํ์ผ๋ง ๊ฒฐ๊ณผ |
๋ฆฌ์์น ๊ฒฐ๊ณผ, ํธํ์ฑ ๋ชฉ์ ์ผ๋ก ์์ฅ ์ ์ ์จ์ด 0.2% ์ด์์ธ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ค์ ์ง์ํ๊ธฐ ์ํด ๋๋ฌด ๋ง์ ๋ฒ๋ค์ด ์์ฑ๋๊ณ ์์๊ณ , ์ด๊ฒ์ด ๋น๋๋ ์ดํ Frame Drop์ ๋ฐ์์ํค๋ ์์ธ์์ ํ์ธํ์ต๋๋ค.
์ดํ Chrome, Safari, Firefox์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ง ์ง์ํ๋๋ก ์์ ํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋ํ, ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ Hook์ด 3D ํ ์คํธ๋ฅผ ์ ๋ ฌ์ํค๋ ๋ฐ ๊ณผ๋ํ ๋ ๋๋ง์ ์ผ์ผํค๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ๊ณ , ํด๋น Hook ์์ด ์ ๋ ฌ๋๋๋ก ๋ฆฌํฉํ ๋งํ์ฌ ์ต์ ํํ์ต๋๋ค.
- ๊ฒ์์ด ์์๋๋ฉด ๊ฒ์ ๋ณด๋์ ํผ์ฆ ๋ธ๋ญ์ด ์์ฑ๋ฉ๋๋ค.
- ๊ฒ์ ๋ณด๋๋ฅผ ํ์ ์ํฌ ์ ์์ต๋๋ค.
- ํผ์ฆ ๋ธ๋ญ ์ปจํ ์ด๋๋ฅผ ํ์ ์ํฌ ์ ์์ต๋๋ค.
- Drag and Drop ๋ฐฉ์์ผ๋ก ๊ฒ์ ๋ณด๋์ ํผ์ฆ ๋ธ๋ญ์ ๋์ ์ ์์ต๋๋ค.
- ๊ฒ์ ๋ณด๋์ ๋์ ํผ์ฆ ๋ธ๋ญ์ ํด๋ฆญํ๋ฉด ๊ฒ์ ๋ณด๋์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
- ์ฃผ์ด์ง ํผ์ฆ ๋ธ๋ญ์ผ๋ก ๊ฒ์ ๋ณด๋๋ฅผ ์ฑ์ฐ๋ฉด ๋ค์ ์คํ ์ด์ง๋ก ๋์ด๊ฐ๋๋ค.
- ์ฃผ์ด์ง ์๊ฐ ์์ ๊ฒ์ ๋ณด๋๋ฅผ ์ฑ์ฐ์ง ๋ชป ํ๋ฉด ๊ฒ์์ด ์ข ๋ฃ๋ฉ๋๋ค.
- ๊ฒ์์ด ์ข ๋ฃ๋๋ฉด ์ ์๋ฅผ ํ์ธํ ์ ์๊ณ ๋ญํน ๋ฑ๋ก์ ํ ์ ์์ต๋๋ค.