๐ ๋ชฉ์ฐจ
๋ฆฌ์กํธ JS๋ ํ์ด์ค๋ถ์์ ๊ฐ๋ฐํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ค๊ณ๋์์ด์. ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ ๊ตฌํํ ๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ์ด ๋๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์์.
๋ฆฌ์กํธ์ ๊ฐ์ฅ ํฐ ํน์ง์ 'Virtual DOM'์ ์ด์ฉํด ์ค์ DOM ์กฐ์์ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ์ ์ด์์. ์ํ(state)์ ์์ฑ(props)์ ์ฌ์ฉํด ๋์ ์ผ๋ก ํ๋ฉด์ ์ ๋ฐ์ดํธํ ์ ์์ฃ . ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋งค์ฐ ํฅ์๋๋ต๋๋ค.
๋ฆฌ์กํธ์ ๋ ๋ค๋ฅธ ์ฅ์ ์ ์ปค๋ฎค๋ํฐ๊ฐ ํ๋ฐํ์ฌ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด, ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ Redux, ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Recoil ๋ฑ์ด ๋ํ์ ์ด์ฃ .
์ด ๊ธ์์๋ ๋ฆฌ์กํธ JS์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ฃผ์ ํน์ง, ์ปดํฌ๋ํธ ๊ตฌ์กฐ, ์ํ ๊ด๋ฆฌ, ํ ํ์ฉ, ๋ผ์ฐํ , ์ฑ๋ฅ ์ต์ ํ๊น์ง ์ ๋ฐ์ ์ธ ๋ด์ฉ์ ๋ค๋ค๋ณผ๊ฒ์!
๋ฆฌ์กํธ JS์ ์๊ฐ์ ํน์ง ๐
๋ฆฌ์กํธ JS๋ 2013๋ ํ์ด์ค๋ถ์์ ์คํ์์ค๋ก ๊ณต๊ฐํ ์ดํ ๋น ๋ฅด๊ฒ ์ธ๊ธฐ๋ฅผ ๋์์ด์. ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์์ด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ฉด์ ๋ชจ๋ ์น ๊ฐ๋ฐ์ ํ์ ์์๋ก ์๋ฆฌ ์ก์์ฃ .
๋ฆฌ์กํธ์ ํต์ฌ์ '์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ'์ 'Virtual DOM'์ด์์. ์ปดํฌ๋ํธ๋ฅผ ์์ ๋จ์๋ก ๋๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ๋ณํ๊ฐ ์ผ์ด๋ ๋ถ๋ถ๋ง ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์์ผฐ์ด์.
๋ํ, JSX(JavaScript XML)๋ฅผ ์ฌ์ฉํ์ฌ HTML๊ณผ JavaScript๋ฅผ ๊ฒฐํฉํ ์ ์๋ค๋ ์ ์ด ํฐ ์ฅ์ ์ด์์. ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ๋ณต์กํ UI๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ต๋๋ค.
๋ฆฌ์กํธ๋ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์, ์ํ ๊ด๋ฆฌ์ ๋ผ์ฐํ ๊ฐ์ ๋ถ๋ถ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํด์. ๋ํ์ ์ผ๋ก Redux๋ React Router๊ฐ ๋ง์ด ํ์ฉ๋์ฃ .
๐ ๋ฆฌ์กํธ JS์ ์ฃผ์ ํน์ง ๋น๊ต ๐
ํน์ง | ์ค๋ช |
---|---|
์ปดํฌ๋ํธ ๊ธฐ๋ฐ | UI๋ฅผ ์์ ๋จ์๋ก ๋๋์ด ์ฌ์ฌ์ฉ์ฑ ๊ทน๋ํ |
Virtual DOM | ์ค์ DOM ๋ณ๊ฒฝ ์ต์ํ๋ก ์ฑ๋ฅ ํฅ์ |
JSX ์ฌ์ฉ | HTML๊ณผ JavaScript์ ๊ฒฐํฉ ํํ |
์ํ ๊ด๋ฆฌ | ์ปดํฌ๋ํธ ์ํ๋ฅผ ๊ฐ๋จํ ๊ด๋ฆฌ ๊ฐ๋ฅ |
๊ฐ๋ ฅํ ์ํ๊ณ | Redux, Recoil ๋ฑ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธํ |
์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ ์ดํด ๐งฉ
๋ฆฌ์กํธ์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ ๋ฐ๋ก ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์์. ์ปดํฌ๋ํธ๋ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋จ์๋ก, ํ๋์ UI ์์๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํด์. ์ด ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํ์ฌ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์.
์ปดํฌ๋ํธ๋ ํฌ๊ฒ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ก ๋๋ ์ ์์ด์. ์ต๊ทผ์๋ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ฌ๊ธฐ์ ๋ฆฌ์กํธ ํ ์ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๋ต๋๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ , ์ํ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด ๋ง์ด ์ฌ์ฉ๋ผ์. ๋ฐ๋ฉด, ํด๋์คํ ์ปดํฌ๋ํธ๋ ์ํ์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ค์ ๋ณต์กํ ์ ์์ด์. ๊ทธ๋์ ์ต์ ํ๋ก์ ํธ์์๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํ ์ ์ฃผ๋ก ์ฌ์ฉํ์ฃ .
์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ ๋๋ถ์ ์ฝ๋์ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๊ณ , ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ์ฌ ํ ์คํธ์ ๋๋ฒ๊น ๋ ํธ๋ฆฌํด์. ๋๋ถ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ฒด๊ณ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์๋ต๋๋ค.
๐ ์ปดํฌ๋ํธ ์ ํ ๋น๊ต ๐
๊ตฌ๋ถ | ํจ์ํ ์ปดํฌ๋ํธ | ํด๋์คํ ์ปดํฌ๋ํธ |
---|---|---|
๊ธฐ๋ณธ ๊ตฌ์กฐ | JavaScript ํจ์ | ES6 ํด๋์ค |
์ํ ๊ด๋ฆฌ | useState ํ ์ฌ์ฉ | this.state ์ฌ์ฉ |
์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ | useEffect ํ ์ฌ์ฉ | ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ์ฌ์ฉ |
์ฌ์ฉ ๋น๋ | ๋์ (์ต์ ํธ๋ ๋) | ๋ฎ์ (๋ ๊ฑฐ์ ์ฝ๋) |
์ฅ์ | ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ | ์ ํต์ ๋ฐฉ์์ผ๋ก ์์ ์ |
ํจ์ํ ์ปดํฌ๋ํธ๋ ํนํ React Hooks์ ๊ฒฐํฉํ์ฌ ๋์ฑ ๊ฐ๋ ฅํด์ก์ด์. ์ํ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ด ์ต์ ํ๋ก์ ํธ์์๋ ๊ฑฐ์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ด์.
์ํ ๊ด๋ฆฌ์ Props ํ์ฉ ๐๏ธ
๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ฐ๋ ์ด ๋ฐ๋ก ์ํ(State)์ ์์ฑ(Props)์ด์์. ์ด ๋ ๊ฐ์ง๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ํต์ฌ ์์์ฃ .
State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ ๋์ ์ธ ๋ฐ์ดํฐ๋ก, ์ฃผ๋ก ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด๋ UI ๋ณํ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํด์. ํจ์ํ ์ปดํฌ๋ํธ์์๋ useState ํ ์ ์ด์ฉํด ์ํ๋ฅผ ๊ด๋ฆฌํ์ฃ . ์ํ๊ฐ ๋ณํ๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ผ์.
๋ฐ๋ฉด, Props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐ์ดํฐ์์. Props๋ ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ์์ ์ง์ ์์ ํ ์ ์์ด์. ๋ฐ๋ผ์ ๋ฐ์ดํฐ ์ ๋ฌ๊ณผ ์ปดํฌ๋ํธ ๊ฐ ํต์ ์ญํ ์ ๋ด๋นํด์.
State์ Props์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋์ง ์ฌ๋ถ์์. State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ง์ ์์ ๊ฐ๋ฅํ์ง๋ง, Props๋ ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ์์ด์.
๐ State์ Props ๋น๊ต ํ ๐
๊ตฌ๋ถ | State | Props |
---|---|---|
๋ฐ์ดํฐ ์์ | ์ปดํฌ๋ํธ ๋ด๋ถ | ๋ถ๋ชจ ์ปดํฌ๋ํธ |
์์ ๊ฐ๋ฅ ์ฌ๋ถ | ์์ ๊ฐ๋ฅ (setState) | ์ฝ๊ธฐ ์ ์ฉ |
์ฌ์ฉ ๋ชฉ์ | ๋์ ๋ฐ์ดํฐ ๊ด๋ฆฌ | ๋ฐ์ดํฐ ์ ๋ฌ |
์์ ๋ฐฉ์ | setState ๋๋ useState ์ฌ์ฉ | ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌ |
์ฃผ์ ์ฌ์ฉ ์์น | ์ํ ๋ณํ๊ฐ ํ์ํ ์ปดํฌ๋ํธ | ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ ์ ๋ฌ |
State์ Props๋ฅผ ์ ํ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉด์๋ ์ปดํฌ๋ํธ์ ๋ ๋ฆฝ์ฑ์ ์ ์งํ ์ ์์ด์. ํนํ ์ํ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํ๋ฉด ๋ถํ์ํ ๋ ๋๋ง์ ์ค์ผ ์ ์์ด ์ฑ๋ฅ ์ต์ ํ์๋ ๋์์ด ๋ผ์.
๋ฆฌ์กํธ ํ ์ ์ข ๋ฅ์ ์ฌ์ฉ๋ฒ ๐ช
๋ฆฌ์กํธ ํ (Hooks)์ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ํจ์์์. 2018๋ ๋ฆฌ์กํธ 16.8 ๋ฒ์ ๋ถํฐ ๋์ ๋์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ํจ์ํ ์ปดํฌ๋ํธ๋ง์ผ๋ก๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ๋์์ด์.
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํ ์ผ๋ก๋ useState, useEffect, useContext๊ฐ ์์ด์. ์ด ์ธ์๋ ๊ณ ๊ธ ํ ์ผ๋ก useReducer, useMemo, useCallback ๋ฑ์ด ์์ผ๋ฉฐ, ๊ฐ ํ ์ ํน์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ฌ์ฉ๋ผ์.
useState๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๊ณ , useEffect๋ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ จ๋ ์์ ์ ์ํํด์. useContext๋ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ ์ฉํ์ฃ . ์ด์ธ์๋ useMemo์ useCallback์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ณ์ฐ์ ์บ์ฑํ๊ฑฐ๋ ํจ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉํด์.
ํ ์ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ํจ์ํ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ํธ์ถํด์ผ ํ๋ฉฐ, ์กฐ๊ฑด๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ ์์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์์น์ด์์. ์ด๋ฅผ ์ด๊ธฐ๋ฉด ํ ์ด ์ ์์ ์ผ๋ก ๋์ํ์ง ์์ ์๊ธฐ์น ๋ชปํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ด์.
๐ ์ฃผ์ ๋ฆฌ์กํธ ํ ์์ฝ ๐
ํ ์ด๋ฆ | ์ฌ์ฉ ๋ชฉ์ | ์์ |
---|---|---|
useState | ์ํ ๊ด๋ฆฌ | const [count, setCount] = useState(0); |
useEffect | ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ | useEffect(() => {}, []); |
useContext | ์ ์ญ ์ํ ๊ด๋ฆฌ | const value = useContext(MyContext); |
useMemo | ์ฑ๋ฅ ์ต์ ํ (๊ฐ ์บ์ฑ) | const memoValue = useMemo(() => calc(), [dep]); |
useCallback | ํจ์ ๋ฉ๋ชจ์ด์ ์ด์ | const memoFunc = useCallback(() => {}, [dep]); |
๋ฆฌ์กํธ ํ ์ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ์ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค์. ํนํ ์ํ ๊ด๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ค์ํ ํ ์ ์ ์ ํ ํ์ฉํ๋ฉด ๋์ฑ ๊น๋ํ๊ณ ์ฑ๋ฅ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด์.
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ก SPA ๊ตฌํ ๐ฆ
๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)๋ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์์ ํ์ด์ง ์ ํ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์. URL ๊ฒฝ๋ก์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ฌ ๋ง์น ์ฌ๋ฌ ํ์ด์ง๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํด์.
๋ฆฌ์กํธ ์์ฒด๋ ํ์ด์ง ์ ํ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ฒฝ๋ก๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ค๋น๊ฒ์ด์ ์ ๊ตฌํํ ์ ์์ด์. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ๊ตฌ์กฐํํ๊ณ ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ฃ .
๋ฆฌ์กํธ ๋ผ์ฐํฐ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก๋ BrowserRouter, Route, Link, Switch๊ฐ ์์ด์. BrowserRouter๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๋ฅผ ๊ฐ์ธ์ ๋ผ์ฐํ ์ ํ์ฑํํ๊ณ , Route๋ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด์. Link๋ ํ์ด์ง ์ด๋์ ์ํ ๋งํฌ๋ฅผ ์ ๊ณตํ๊ณ , Switch๋ ์ฒซ ๋ฒ์งธ๋ก ์ผ์นํ๋ ๊ฒฝ๋ก๋ฅผ ๋ ๋๋งํ์ฌ ์ค๋ณต์ ๋ฐฉ์งํด์.
SPA์์ ์ค์ํ ์ ์ ํ์ด์ง๋ฅผ ์ ํํ ๋ ์ ์ฒด๋ฅผ ์๋ก ๊ณ ์นจํ์ง ์๊ณ ํ์ํ ๋ถ๋ถ๋ง ๋ฐ๊พธ๋ ๊ฑฐ์์. ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ ์ด๋ฌํ ๋ถ๋ถ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์์ผ์.
๐บ๏ธ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ฃผ์ ๊ตฌ์ฑ ์์ ๐
๊ตฌ์ฑ ์์ | ์ค๋ช | ์์ |
---|---|---|
BrowserRouter | ๋ผ์ฐํฐ์ ๋ฃจํธ ๊ตฌ์ฑ ์์ | <BrowserRouter> ... </BrowserRouter> |
Route | ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐ | <Route path="/about" component={About} /> |
Link | ํ์ด์ง ๊ฐ ์ด๋ ๋งํฌ | <Link to="/home">Home</Link> |
Switch | ์ฒซ ๋ฒ์งธ ์ผ์น ๊ฒฝ๋ก๋ง ๋ ๋๋ง | <Switch> ... </Switch> |
useParams | ๋์ ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ ์ ๊ทผ | const { id } = useParams(); |
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ฉด URL ๊ฒฝ๋ก๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด์๋ SPA ํน์ฑ์ ์ ์งํ ์ ์์ด์. ํนํ ๋ค๋น๊ฒ์ด์ ์ด๋ ํ์ด์ง ์ ํ ์ ๊น๋นก์์ด ์์ด์ ์ฌ์ฉ์ ๊ฒฝํ์ด ์พ์ ํ๋ต๋๋ค.
๋ฆฌ์กํธ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ ๐
๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด์. ํนํ, ๋ถํ์ํ ๋ ๋๋ง๊ณผ ์ํ ๊ด๋ฆฌ ์ด์๋ก ์ธํด ์๋๊ฐ ๋๋ ค์ง ์ ์์ฃ . ๊ทธ๋์ ์ฑ๋ฅ ์ต์ ํ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํ ๊ณผ์ ์์.
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๊ฑฐ์์. ์ด๋ฅผ ์ํด React.memo์ useCallback, useMemo ๊ฐ์ ํ ์ ์ ์ ํ ํ์ฉํด์ผ ํด์. ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด, ๋์ผํ props๋ก ๋ค์ ๋ ๋๋ง๋์ง ์๋๋ก ๋ง์์ค๋๋ค.
๋ํ, ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํด์. ์ ์ญ ์ํ ๊ด๋ฆฌ๋ Context API ๋๋ Redux์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ต์ ํํ ์ ์๋ต๋๋ค. ํนํ ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ, ์ํ๋ฅผ ์ต๋ํ ์ง์ญํํ๋ ๊ฒ์ด ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋ผ์.
๋ธ๋ผ์ฐ์ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ์ง์ฐ ๋ก๋ฉ์ ํตํด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์๋ ์์ด์. ์ด๋ฅผ ์ํด React.lazy์ Suspense๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋น๋๊ธฐ๋ก ๋ถ๋ฌ์ค๋ฉด ํ๋ฉด ์ ํ์ด ํ์ธต ๋ถ๋๋ฌ์์ง๋ต๋๋ค.
๐ ๋ฆฌ์กํธ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ ๐
๊ธฐ๋ฒ | ์ค๋ช | ์ฌ์ฉ ์์ |
---|---|---|
React.memo | ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง | export default React.memo(MyComponent); |
useCallback | ํจ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก ์ฌ์์ฑ ๋ฐฉ์ง | const memoFunc = useCallback(() => {}, [dep]); |
useMemo | ์ฐ์ฐ ๋น์ฉ์ด ํฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑ | const memoValue = useMemo(() => calc(), [dep]); |
์ฝ๋ ์คํ๋ฆฌํ | ํ์ด์ง๋ณ๋ก ๋ฒ๋ค ๋ถ๋ฆฌํ์ฌ ๋ก๋ฉ ์๋ ๊ฐ์ | React.lazy(() => import('./Component')) |
์ง์ฐ ๋ก๋ฉ | ํ์ํ ์์ ์๋ง ์ปดํฌ๋ํธ ๋ก๋ | <Suspense fallback={...}> |
์ด ์ธ์๋ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ธ React Profiler๋ฅผ ํ์ฉํ๋ฉด ๋ ๋๋ง ์ฑ๋ฅ์ ์๊ฐ์ ์ผ๋ก ๋ถ์ํ ์ ์์ด์. ์ด๋ฅผ ํตํด ๋ณ๋ชฉ์ด ๋ฐ์ํ๋ ๋ถ๋ถ์ ๊ตฌ์ฒด์ ์ผ๋ก ํ์ ํ๊ณ ๊ฐ์ ํ ์ ์๋ต๋๋ค.
FAQ ๐ก
Q1. ๋ฆฌ์กํธ์ ์ต๊ทค๋ฌ์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
A1. ๋ฆฌ์กํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก UI ๊ตฌ์ถ์ ์ค์ ์ ๋๋ฉฐ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ด์์. ๋ฐ๋ฉด, ์ต๊ทค๋ฌ๋ ํ๋ ์์ํฌ๋ก ๊ตฌ์กฐํ์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ฐํํ ์ ๋ฐ์ ์ธ ์๋ฃจ์ ์ ์ ๊ณตํด์.
Q2. ๋ฆฌ์กํธ์์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์ ์ฌ์ฉํ๋์?
A2. ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Redux์ Recoil์ด์์. Redux๋ ์ ์ญ ์ํ ๊ด๋ฆฌ์ ์ ํฉํ๊ณ , Recoil์ React์ ์์ฐ์ค๋ฝ๊ฒ ํตํฉ๋ผ์ ์ํ๋ฅผ ๊ฐํธํ๊ฒ ๋ค๋ฃฐ ์ ์์ด์.
Q3. useEffect ํ ์ ์์กด์ฑ ๋ฐฐ์ด์ด ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์?
A3. ์์กด์ฑ ๋ฐฐ์ด์ด ์์ผ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ๋งค๋ฒ ์คํ๋ผ์. ํน์ ์ํ ๋ณํ์๋ง ์คํ๋๋๋ก ํ๋ ค๋ฉด ๋ฐฐ์ด ์์ ์ํ ๋ณ์๋ฅผ ์ง์ ํด์ผ ํด์.
Q4. React.memo๋ฅผ ์ฌ์ฉํ๋๋ฐ๋ ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ์ด์ ๋?
A4. ์ ๋ฌ๋๋ props๊ฐ ์ฐธ์กฐํ ๋ฐ์ดํฐ(๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ)์ผ ๊ฒฝ์ฐ, ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ก ์ธ์ํด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํด์. useMemo๋ useCallback์ผ๋ก ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํด ๋ณด์ธ์.
Q5. SPA์์ ํ์ด์ง ์ด๋ ์ ๊น๋นก์์ด ๋ฐ์ํ๋ ์ด์ ๋?
A5. ์ฝ๋ ์คํ๋ฆฌํ ์ผ๋ก ์ธํด ์ง์ฐ ๋ก๋ฉ์ด ๋ฐ์ํ๋ฉด ํ์ด์ง ์ ํ ์ ๊น๋นก์ผ ์ ์์ด์. Suspense์ fallback์ ํ์ฉํ์ฌ ๋ก๋ฉ ์ค ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณด์ธ์.
Q6. ๋ฆฌ์กํธ์์ ๋น๋๊ธฐ ์์ ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ค๋ฉด?
A6. useEffect ์์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ , ๋ด๋ถ์ async ํจ์๋ฅผ ์ ์ธํด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์์ ํด์. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ด์.
Q7. ์ปดํฌ๋ํธ ์ฑ๋ฅ์ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์?
A7. React Profiler๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ ๋๋ง ์๊ฐ์ ์ธก์ ํ ์ ์์ด์. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ์ ์ฝ๊ฒ ํ์ ํ ์ ์๋ต๋๋ค.
Q8. ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๋์ด๋ ค๋ฉด?
A8. ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ ์ ์ฉํ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ํฌ๊ฒ ํฅ์ํ ์ ์์ด์. ํนํ Next.js์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ๋ฉด SSR ๊ตฌํ์ด ์ฉ์ดํด์.