์๋
ํ์ธ์. CEOS 15๊ธฐ ํ๋ก ํธ ์ต์ด์ง์
๋๋ค.
ํ๋ก ํธ ์คํฐ๋ 2์ฃผ์ฐจ ๊ณผ์ ๋
<1์ฃผ์ฐจ์ ๋ง๋ To-do List๋ฅผ React๋ก ๋ฆฌํฉํ ๋งํ๊ธฐ> ์์ต๋๋ค.
HTML + CSS + Vanilla JS๋ก๋ง ๊ตฌํํ To-do List์ ๊ธฐ๋ฅ๋ค์
React๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ณผ์ ์์ React๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฐ ๋ฐฉ์์ ์ฐจ์ด์ ๊ณผ ํธ๋ฆฌ์ฑ์
ํผ๋ถ๋ก ์ฒด๊ฐํ ์ ์์ด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฟ๋ง ์๋๋ผ, 1์ฃผ์ฐจ ๊ณผ์ ์์๋ ๊ตฌ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๋ถ ๊ตฌํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์
To-do List์ ๋ํ ์์ฌ์์ ํธ ์ ์๋ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๊ณ ์ฐธ์ฌํ์ต๋๋ค.
์ ๋ฒ ์ฃผ์ ์ด์ด์ ์ผ์ ์ํ์์ ์์ฃผ ์ฌ์ฉํ๋ To-do List ์ ํ๋ฆฌ์ผ์ด์
๋ฅผ
๋ฉ์ธ ๋์์ธ ์ฝ์
ํธ๋ก ์ ํ์ต๋๋ค.
๊ทผ๋ฐ ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋ ์ ์ผ์์์ IOS์ ๋ฉ๋ชจ ์ฑ๋ณด๋ค๋
๋ง์ด ์ฌ์ฉํ๋ To-do List๊ฐ ์๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์๋๋ฐ์,
๋ฐ๋ก ์นด์นด์คํก์ <๋์์ ๋ํ> ๊ธฐ๋ฅ์
๋๋ค.
์ผ์ ์์์ ์ ์ง ์์ ์ฌ๋๋ค์ด ๋น์ฅ ๋ญ๊ฐ๋ฅผ ์ ์ด๋์ ๊ณต๊ฐ์ด ํ์ํ๊ฑฐ๋
ํน์ ํ์ผ์ ๊ธํ๊ฒ ์ฌ๊ธฐ์ ์ ๊ธฐ์ ์ฎ๊ฒจ์ผ ํ ๋ ํด๋ฆฝ๋ณด๋์ฒ๋ผ ํ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ ์ค์ ์นด์นด์คํก <๋์์ ๋ํ> ์ฑํ ๋ฐฉ์ UX๋ฅผ ์ ์ฒด์ ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด์ ์์ง ์คํ ์์ ์ธ ์ผ์ ๋ค์ ๋ด๊ฐ ๋ณด๋ธ ๋งํ์ , ์คํ ์๋ฃํ ์ผ์ ๋ค์ ์๋๋ฐฉ์ด ๋ณด๋ธ ๋งํ์ ์ผ๋ก ํํํ๋ฉด ์ฌ๋ฐ๊ฒ ๋ค ์ถ์ด์ ์ด๋ฒ ์ฃผ์ ๊ตฌํํ ๋์์ธ ์ฝ์ ํธ๋ก ์ฐจ์ฉํ์ต๋๋ค.
์ฝ์ ํธ ๊ตฌ์์ด ๋๋ ๋ค ๊ฐ๋จํ ์์ด์ดํ๋ ์์ ์ ์ํ๊ณ , ์ด์ด์ ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ ๋์์ธ๊น์ง ๋ง์น ๋ค ๊ฐ๋ฐ์ ์์ํ์ต๋๋ค.
์ด๋ฌํ ์์๋ก ๊ฐ๋ฐ ์์๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค.
- JSX๋ฅผ ์ด์ฉํ To-do List ๊ธฐ๋ณธ ๋ ์ด์์ ๊ตฌ์ฑ
- To-do List ๊ธฐ๋ณธ ๊ณ ๋ ค์ฌํญ ๊ตฌํ
- To-do List ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ ๊ตฌํ
- Vercel์ ์ด์ฉํ ๋ฐฐํฌ
๊ธฐ๋ณธ ๊ณ ๋ ค์ฌํญ
- 1์ฃผ์ฐจ ๋ฏธ์ ์ ๊ฒฐ๊ณผ๋ฌผ์ ๊ทธ๋๋ก React๋ก ๊ตฌํํฉ๋๋ค.
- React Hooks์ ๋ํ ๊ธฐ์ด์ React๋ฅผ ํตํ ์ดํ๋ฆฌ์ผ์ด์ ์ํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ดํดํฉ๋๋ค.
- Functional Components๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Styled-Components๋ฅผ ํตํ CSS-in-JS ๋ฐ CSS Preprocessor์ ์ฌ์ฉ๋ฒ์ ์ตํ๋๋ค.
- VSCode, Prettier๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฐํ๊ฒฝ์ ๊ด๋ฆฌํฉ๋๋ค.
- Gitmoji ๋ฐ Commit Convention์ ์ฌ์ฉํ Commit Message๋ฅผ ์์ฑํฉ๋๋ค.
์ถ๊ฐ ๊ณ ๋ ค์ฌํญ (ํธ์ง ์ค)
- 1์ฃผ์ฐจ ๋ฏธ์ ๋ ๊ตฌํํ์ง ๋ชปํ localStorage๋ฅผ ์ด์ฉํ ์ ์ฅ ๋ฐ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๋ผ์ดํธ ๋ชจ๋/๋คํฌ ๋ชจ๋๋ฅผ ์ ํํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
(1) React์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ค๊ณ
React๋ก ๊ฐ๋ฐํ๋ฉด์ ๊ฐ์ฅ ๋ง์ด ์๊ฐํ๋ ์ ์ ์ฑ์ ์ ์ฒด ๊ตฌ์กฐ๊ฐ
์์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ก ์กฐ๋ฆฝ๋์ด ์๋ ๊ฒ ๊ฐ๋ค๋ ๋๋์ด์์ต๋๋ค.
To-do List์ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋งจ ์ฒ์ ์ค๊ณํ์ ๋๋
input
์ด ๋ค์ด ์๋ form
์์ฒด๋ฅผ ์์ ๋ถ๋ฆฌํด์ ์๊ฐํ๊ณ
ํ์ผ์ ๋๋ ์ ์์
ํ๋๋ฐ ๊ฐ ์ปดํฌ๋ํธ ๊ฐ์ props
์ ๋ฌ์ด ์ด๋ป๊ฒ
์ด๋ฃจ์ด์ง๋์ง ์ ์ดํด๋ฅผ ํ์ง ๋ชปํ๊ณ ๊ฒฐ๊ตญ์ form
๋ถ๋ถ๋ง
ํฉ์น ์ฑ๋ก ๋ง๋ฌด๋ฆฌํ๊ฒ ๋๋ค์.. ์ฌ์ค ๊ทธ๋์ ์ง๊ธ๊น์ง์ ๊ณผ์ ์์๋
๋ ์ด์์์ ๋จผ์ ๋ค ๊ตฌ์ฑํด ๋๊ณ ๊ทธ ๋ค์ ๊ตฌํํ ๊ธฐ๋ฅ์ ์ฐจ๋ก๋๋ก
์กฐ๋ฆฝํด ๊ฐ๋ ๋ฐฉ์์ผ๋ก ์์
ํ๋๋ฐ, ์ ๊ฐ ์์
ํ ๋ฐฉ๋ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ธ์ง
์ด๋ฒ์ ์๋ฌธ์ด ๋ค์์ต๋๋ค.
(2) Styled-Components๋ฅผ ํตํ Css-in-JS Styling
์ด๋ฒ ์ฃผ ๋ฏธ์
์ ์ฒ์ ์์ํ์ ๋์๋ Styled-Components๋ฅผ
๋ณด๊ณ ๊ต์ฅํ ๋ฏ์ค๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ด๋ ์๊ฐ ๋น ๋ฅธ ์๊ฐ ๋ด์
์ต์ํด์ ธ์ ๊ฐ๋ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฌด๋๋ Style Sheet๋ฅผ
๋ฐ๋ก ํ์ผ๋ก ๋ถ๋ฆฌํ์ง ์๊ณ Javascript ํ์ผ ๋ด์์
์คํ์ผ - ๊ธฐ๋ฅ ๊ตฌํ์ด ํ๋์ ์ปดํฌ๋ํธ ๋จ์๋ง๋ค ์ ๋ฆฌํ ์ ์์ด์
ํธํ๊ฒ ๋๋ผ์ง ์์๋ ์ถ์ต๋๋ค.
Styled-Components์์ props๋ฅผ ํตํ Conditional Styling ๋ฐฉ์ ๋ํ
์ฒ์ ๋ณด๊ณ ๋ฐ๋ก ์ดํด๋์ง๋ ์์์ง๋ง, ๋คํฌ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์
์ด ๋ถ๋ถ์ ์กฐ๊ธ์ด๋๋ง ๋ ์ดํดํ๊ณ ๋ฏธ์
์ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ ๊ฐ์ ๊ฐ์ธ์ ์ผ๋ก
์ถ๊ฐ ์ ํ์ฌํญ ๊ตฌํ์ ๊ฒฐ์ฌํ๊ธฐ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Virtual-DOM์ ๋ฌด์์ด๊ณ , ์ด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์ ์ป๋ ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
์ ๋ฒ ์ฃผ์๋ ์ง๊ณ ๋์ด๊ฐ๋ ๋ด์ฉ์ผ๋ก๋ DOM(Document Object Model)์ Javascript๊ฐ HTML ๋ฌธ์์ ์ ๊ทผํ๊ธฐ ์ํ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ค๊ณ ์ดํดํ์ต๋๋ค. ๋ค๋ง, ์ค์ DOM์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ ๋ง์ ๊ฒ๋ค์ด ๋ค์ด ์์ด์ ์กฐ์ํ๊ธฐ์ ๊ต์ฅํ ๋ฌด๊ฒ๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด React์์ ์ค์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ๋น ๋ฅด๊ฒ ์ถ์ ํ๊ณ ๋ฐ์ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ด Virtual-DOM์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฏธ์ ์ ์งํํ๋ฉด์ ๋๋, React๋ฅผ ์ฌ์ฉํจ์ผ๋ก์ ์ป์์ ์๋ ์ฅ์ ์ ๋ฌด์์ด์๋์?
์คํ์ผ์ ์ ํ๋ ์์ ๊ณผ ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋์ ํ์ผ์์ ์์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐ์ ์งํํ๋ค ๋ณด๋ ์ ์ฒด์ ์ธ ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ก๊ธฐ์๋ ๋ ์์ํ๋ค๋ ์ ์ด ์๋ฟ์์ต๋๋ค.
React์์ ์ํ๋ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ ์์๊น์?
Plain Javascript Object hold information influences the output of render
(์ ๊ฐ ์ ์ ๋ง์ ์๋๊ณ React Documentation์ ์๋ ๋ง์ด๋ผ๊ณ ํฉ๋๋ค.)
React๋ฅผ ํตํ ๊ฐ๋ฐ์ ์งํํ๋ค๊ณ ์๊ฐํ๋ฉด ์ด๋ ๋จ์ํ ์น ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ๋ณด๋ค๋
์ฌ์ฉ์์ ์ง์์ ์ธ ์ํธ์์ฉ์ ๊ฐ์ ธ๊ฐ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
ํํ์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ ๊ฒ์ด๋ผ๊ณ
์๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ณผ์ ์์์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ ๋๋งํ๋ ๋ฐ ์ํฅ์
๋ฏธ์น ์ ์๋ ๊ฐ๋ค์ ์ํ(State) ๋ผ๊ณ ๋ถ๋ฅธ๋ค๊ณ ํฉ๋๋ค.
์ด๋ฒ ์ฃผ ๋ฏธ์
์์ ๊ต์ฅํ ๋ง์ด ์ฌ์ฉํ๋ useState
๊ฐ ๋ํ์ ์ธ ์์์ธ๋ฐ,
useState๋ฅผ ํตํด ๊ด๋ฆฌํ๋ ๊ฐ๋ค์ ๋ ๋๋ง์ ์ง์ ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํ๋
๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ ์ด๋ ๊ฒ ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ์ด์ฉํด
์ ํ๋ฆฌ์ผ์ด์
์ด ๊ฐ์ง๋ ์ฌ๋ฌ ์ํ ๊ฐ๋ค์ ํ๋ฆ์ ์์ธก ๊ฐ๋ฅํ ์์ค์ผ๋ก
์กฐ์ ํ๋ ๊ฒ ์ํ ๊ด๋ฆฌ์ ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Styled-Components ์ฌ์ฉ ํ๊ธฐ (CSS์ ๋น๊ต)
์ ๋ฒ ์ฃผ์๋ CSS ํ์ผ์ ๋ํ ์์ฑ๋ค์ ๋ํ Naming Convention์ ์ฐพ์๋ณด๊ณ
์ฐจ๋ก๋๋ก ๋๋ฆ ์ ๋ฆฌํด๊ฐ๋ฉด์ ์์ฑํ๋ค๊ณ ์๊ฐํ๋๋ฐ,
์ค์ ๋ก๋ CSS ํ์ผ์ด ๊ต์ฅํ ๊ธธ์ด์ ธ์ ์ด๋ค ์คํ์ผ ์์ฑ๋ค์ ์์ ํ๊ธฐ ์ํด
์ฐพ์ ๋ค๋
๋ ๋ฐ์ ์ ์ง ์์ Overhead๊ฐ ์์๋์๋ค๊ณ ๋๊ผ์ต๋๋ค.
๊ทธ์ ๋ฐํด์ Styled-Components๋ ์ ์ด๋ ํ๋์ ์ปดํฌ๋ํธ์ ๋ํ ์์ฑ์
๋น์ฐํ ์ด ํ์ผ์ ์๊ฒ ๊ตฌ๋ ์ถ์ด์ ๊ทธ๋ฐ ๋ถ๋ถ์ ๋ํด์๋ ๊ต์ฅํ
ํธํ ๊ฐ๋ฐ ํ๊ฒฝ์ด์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์ค ์ด์์ง๊ณผ ๋ฉํ ๋ถ๋ค๊ป์ ๋ด ์ฃผ์ ์ด๋ฒ ์ฃผ์ฐจ ๋ฏธ์
์ ์์๋
์ ๋ฒ ์ฃผ์ฐจ์ Vanilla Javascript๋ฅผ ํตํ ๊ตฌํ์์ ๊ทธ๋๋ก UI/UX๋ฅผ ๊ฐ์ ธ์ค๋ฉด์
๊ธฐ๋ฅ๋ง React ๋ฐ React Hooks๋ฅผ ํตํด ์ดํดํด ๋ณด๋ผ๋ ์๋์
จ๋ค๊ณ ์๊ฐํ๋๋ฐ,
๊ฐ์ธ์ ์ผ๋ก ์ง๋์น๊ฒ UI๋ฅผ ๋ฐ๊พธ๋ ค๋ค๊ฐ ๋ค์ ๊ณผ์ ์๋์์ ๋ฒ์ด๋ ๊ฒฐ๊ณผ๋ฌผ
(+ ๋ค์ ์ ์ถ ์๊ฐ์์ ๋ฒ์ด๋ ํ๋ฆฌํ)๋ฅผ ์ ์ถํ ๊ฒ ๊ฐ์์ ๋ง์์ด ์ฝ๊ฐ์ ๋ฌด๊ฒ์ต๋๋ค.
์ต๊ทผ ์๊ฐ์ ๋ญ๋นํ๋ค ์ถ์ ์๊ฐ์ ๋ฑํ ์์๋ ๊ฒ ๊ฐ์ง๋ง์๋ ์์ผ๋ก ๋ค๊ฐ์ฌ ๋ฏธ์
์ด๋ผ๋์ง
ํ๋น๋ฉ ์ดํ์ ์ด์ด์ง ํ๋ก์ ํธ๋ฅผ ์ํด์๋ ๋ค๋ฅธ ๋ญ๊ฐ๋ฅผ ๋ ํฌ๊ธฐํ๊ณ
์ ๋ง ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ ์ผ์ ์ง์คํ ํ์๊ฐ ์๋ค๋ ์ฌ์ค์ ๋๋ ์ด๋ฒ ์ฃผ ๋ฏธ์
์ด์์ต๋๋ค.