์ ์ ๊ด๋ฆฌ ์๋น์ค
: ์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ ์ฝ์ค์์ ํ์ผ๋ก ์งํํ๋ ๊ธฐ์ ๊ณผ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฐ์ธ ํ๋ก์ ํธ
- ๋ฐฐํฌ ๋งํฌ
- ํ๋ก์ ํธ ์คํ
- ๊ตฌํ ์๊ตฌ ์ฌํญ
- ๊ธฐ์ ์คํ ๋ฐ ์ฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํด๋ ๊ตฌ์กฐ
- ํธ๋ฌ๋ธ ์ํ
- ๊ณผ์ ์งํ ์ ์ฃผ์์
- ํ๊ณ์ ๋ฐ ๊ฐ์ ์ฌํญ
- ๋ฆฌํฉํ ๋ง
๋ก๊ทธ์ธ
์์ด๋(email): [email protected]
๋น๋ฐ๋ฒํธ(password): test
ํ๋ก์ ํธ ํด๋ก
$ git clone https://github.com/seriparkdev/vest.git
์๋ฒ ์คํ
$ npm install
$ npm run gen
$ npm start
ํด๋ผ์ด์ธํธ ์คํ
$ npm install
$ npm start
์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ์ต๋๋ค. ์ฐธ๊ณ ์ฉ์ ๋๋ค.
โ๏ธ ์ฌ์ฉ์ ๋ชฉ๋ก
- ํ๊ธฐ๋์ด์ผ ํ๋ ์ ๋ณด
- ๊ณ ๊ฐ๋ช
(name) : ๊ฐ์ด๋ฐ ๊ธ์ ๋ง์คํน ํ์, ๋๊ธ์์ผ ๊ฒฝ์ฐ ์ฑ์ ์ ์ธํ ์ด๋ฆ ๋ง์คํน ์ฒ๋ฆฌ, 4๊ธ์ ์ด์์ผ ๊ฒฝ์ฐ ๋ง์คํน ์ฒ๋ฆฌ ํ ์๋ค ํ๊ธ์๋ง ํ๊ธฐ
- ๊ณ ๊ฐ๋ช ์ ๋๋ฅผ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์์ธํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋ณด์ ์ค์ธ ๊ณ์ข์(account_count) : (ํด๋น API ํธ์ถ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ์ฌ ํ๊ธฐ)
- ์ด๋ฉ์ผ ์ฃผ์ (email)
- ์ฃผ๋ฏผ๋ฑ๋ก์ ์ฑ๋ณ์ฝ๋ (gender_origin)
- ์๋ ์์ผ (yyyy-mm-dd) (birth_date)
- ํด๋ํฐ ๋ฒํธ (๊ฐ์ด๋ฐ 4์๋ฆฌ
***
๋ก ๋ง์คํน ํ์) (phone_number) - ์ต๊ทผ๋ก๊ทธ์ธ (last_login)
- ํํ ์์ ๋์ ์ฌ๋ถ (ํด๋น API ํธ์ถ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ์ฌ ํ๊ธฐ) (allow_marketing_push)
- ํ์ฑํ ์ฌ๋ถ (ํด๋น API ํธ์ถ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ์ฌ ํ๊ธฐ) (is_active)
- ๊ฐ์ ์ผ (created_at)
- ๊ณ ๊ฐ๋ช
(name) : ๊ฐ์ด๋ฐ ๊ธ์ ๋ง์คํน ํ์, ๋๊ธ์์ผ ๊ฒฝ์ฐ ์ฑ์ ์ ์ธํ ์ด๋ฆ ๋ง์คํน ์ฒ๋ฆฌ, 4๊ธ์ ์ด์์ผ ๊ฒฝ์ฐ ๋ง์คํน ์ฒ๋ฆฌ ํ ์๋ค ํ๊ธ์๋ง ํ๊ธฐ
- ๊ตฌํ๋์ด์ผ ํ๋ ๊ธฐ๋ฅ
- ํ์ด์ง๋ค์ด์ ์ด ๋์ด์ผ ํฉ๋๋ค.
- ์์๋ก ์ ๊ท ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์๋ชป ์์ฑํ ์ฌ์ฉ์๋ฅผ ์ญ์ ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๊ฐ๋ช ์ ํ ์ฌ์ฉ์๋ฅผ ์ํด ์ฌ์ฉ์๋ช ์ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํฉ๋๋ค.
โ๏ธ ๊ณ์ข ๋ชฉ๋ก
- ํ๊ธฐ๋์ด์ผ ํ๋ ์ ๋ณด
- ๊ณ ๊ฐ๋ช
(user_name) : ๊ณ ๊ฐID ๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์ด๋ฆ์ผ๋ก ๋ณด์ฌ์ ธ์ผ ํฉ๋๋ค.
- ๊ณ ๊ฐ๋ช ์ ๋๋ฅผ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์์ธํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋ธ๋ก์ปค๋ช
(broker_name) : ์์) OO์ฆ๊ถ,
brokers.json
๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์ด๋ฆ์ผ๋ก ๋ณด์ฌ์ ธ์ผ ํฉ๋๋ค. - ๊ณ์ข๋ฒํธ(number) : ์ ๋ค ๊ฐ๊ฐ ๋๊ธ์๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง๋ ๊ธ์์์ ๋ง๊ฒ
*
๊ธ์๋ก ๋ง์คํน ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. - ๊ณ์ข์ํ(status) : ์์) ์ด์ฉ์ค,
accountStatus.json
๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์ด๋ฆ์ผ๋ก ๋ณด์ฌ์ ธ์ผ ํฉ๋๋ค. - ๊ณ์ข๋ช (name) : ๊ณ์ข๋ช ์ ๋๋ค.
- ํ๊ฐ๊ธ์ก(assets) : ์์) 123,123,123
- ์ ๊ธ๊ธ์ก(payments) : ์์) 123,123,123
- ๊ณ์ขํ์ฑํ์ฌ๋ถ(is_active) : ๊ณ์ข ํ์ฑํ ์ฌ๋ถ
- ๊ณ์ข๊ฐ์ค์ผ(created_at) :
- ๊ณ ๊ฐ๋ช
(user_name) : ๊ณ ๊ฐID ๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ ์ด๋ฆ์ผ๋ก ๋ณด์ฌ์ ธ์ผ ํฉ๋๋ค.
- ๊ตฌํ๋์ด์ผ ํ๋ ๊ธฐ๋ฅ
- ๋ฆฌ์คํธ ํ์ด์ง์์๋ ๊ฒ์์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
- ํ์ด์ง๋ค์ด์ ์ด ๋์ด์ผ ํฉ๋๋ค.
โ๏ธ ์กฐ๊ฑด
- Sider ๋ฉ๋ด์์๋ ํ์ฌ ๋ณด๊ณ ์๋ ํ๋ฉด์ ํด๋นํ๋ ๋ฉ๋ด๊ฐ ํ์ด๋ผ์ดํธ ๋์ด์ผ ํฉ๋๋ค.
- ์๋ก๊ณ ์นจ์ ํด๋ ๋ก๊ทธ์ธ ์ํ๊ฐ ์ ์ง๋์ด์ผ ํ๋ฉฐ, ์ํ์ ๋ฐ๋ผ ๊ธฐ์กด์ ๋จธ๋ฌด๋ฅด๋ ํ๋ฉด์ด ๊ทธ๋๋ก ๋ณด์ฌ์ผ ํฉ๋๋ค.
- ๊ณ์ข ๋ฆฌ์คํธ์์ ๊ณ์ข๋ฒํธ๋ฅผ ๋๋ฅด๋ฉด ๊ณ์ข์์ธ ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๊ณ์ข ๋ฆฌ์คํธ์์ ์ฌ์ฉ์ ์ด๋ฆ์ ๋๋ฅด๋ฉด ์ฌ์ฉ์ ์์ธ๋ก ์ด๋ํฉ๋๋ค.
- ์ฌ์ฉ์ ์์ธ์์ ์ฌ์ฉ์์ ๊ณ์ข๋ชฉ๋ก์ด ๋ณด์ฌ์ผ ํฉ๋๋ค.
- ์์ต๋ฅ ์ด ํ๋ฌ์ค์ธ ๊ณ์ข์ ์ด์์ฐ ๊ธ์ก์ ๋นจ๊ฐ์, ์๊ธ๊ณผ ๋์ผํ ๊ฒฝ์ฐ ๊ฒ์ ์, ๋ง์ด๋์ค์ผ ๊ฒฝ์ฐ ํ๋์์ผ๋ก ๋ณด์ฌ์ค์ผ ํฉ๋๋ค.
- ๊ณ์ข ๋ชฉ๋ก์์ broker_id ์ ํด๋นํ๋ ์ค์ ๋ธ๋ก์ปค๋ช (OOํฌ์์ฆ๊ถ) ์ด ๋ณด์ฌ์ผ ํฉ๋๋ค.
๐ก Redux Toolkit ์ฌ์ฉ ์ด์
Redux๋ฅผ ์ด ํ๋ก์ ํธ๋ฅผ ํตํด์ ๋ ๊ณต๋ถํ๊ณ ์ถ์๊ณ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํด์ ์ฌ์ฉํ์ต๋๋ค. Context API๊ฐ ๋ ํ๋์ ๋์์ด ๋ ์ ์์ผ๋, Redux๋ ๊ฐ์ ๋ณํ์ ๋ํ ์ต์ ํ๊ฐ ๋์ด์์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ผ์ผํค์ง ์๋ ์ ์ ๊ณ ๋ คํ์ฌ Redux๋ฅผ ์ฑํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Redux๋ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฏธ๋ค์จ์ด๋, useSelector
, useDispatch
๊ฐ์ด ํธ๋ฆฌํ๊ณ ์ต์ ํ๊ฐ ์ ๋์ด์๋ hook ํจ์ ๋ฑ์ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ด ๊ธฐ๋ฅ๋ค์ ์ด์ฉํด์ ์ข ๋ ์์ํ๊ฒ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ต์ ํ ์ํค๊ธฐ ์ข์ ๊ฒ ๊ฐ๋ค ์๊ฐํ์ต๋๋ค.
Redux-toolkit์ ๊ธฐ์กด์ thunk, saga์ ๊ธฐ๋ฅ๋ค์ด ํ์ฌ๋์ด ์๊ณ , ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ํจ์ฌ ์งง์ต๋๋ค. ๊ธฐ์กด์ Redux๋ ์ด ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ธฐ์ ๋ฌด๊ฑฐ์ด ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
๐ก styled-components ์ฌ์ฉ ์ด์
tailwind๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋ง์ด ํด์น๊ธฐ๋ ํ๊ณ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ต๋๋ค. npm ํจํค์ง ๋ค์ด๋ก๋ ์๋ฅผ ๋น๊ตํด๋ดค์ ๋ emotion๋ณด๋ค๋ styled-components๊ฐ ํจ์ฌ ๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ด ์ด๋ฅผ ์ฑํํ์ต๋๋ค.
ํด๋ | ์ฉ๋ |
---|---|
api | axios ์ธ์คํด์ค, api ๊ด๋ฆฌ ํด๋ |
assets | image, data ๋ฑ ํ๋ก์ ํธ์ ํ์ํ ํ์ผ ๊ด๋ฆฌ ํด๋ |
components | ๋ ์ด์์, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ๊ด๋ฆฌ |
constants | ์์ ๊ด๋ฆฌ ํด๋ |
pages | ๋๋ฉ์ธ ๋ณ๋ก ๋๋ page ํด๋ |
routes | router์ ๊ด๋ จ๋ ํด๋ |
store | client ์ํ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ํด๋ |
styles | ํ๋ก์ ํธ์ ํ์ํ global, theme CSS |
types | ๋ฐ๋ณต๋์ด ์ฌ์ฉ๋๋ ํ์ ๋ค์ ๊ด๋ฆฌ |
utils | ํ๋ก์ ํธ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ utility ๊ด๋ฆฌ |
utils
ํ์ผ | ์ฉ๋ |
---|---|
account | account์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ฃผ๋ util |
auth | ์ธ์ฆ/์ธ๊ฐ์ ๊ด๋ จ๋ util |
extraReducer | Redux extraReducers์ builder callback์ ์ํ boilerplate๋ฅผ ์๋ํํ util |
user | user์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ฃผ๋ util |
ํ์ผ ๊ตฌ์กฐ tree
โโapi
โโassets
โ โโdata
โ โโimage
โโcomponents
โ โโlayout
โ โโshared
โ โโerror
โ โโtable
โโconstants
โโhooks
โโpages
โ โโAccount
โ โ โโcomponents
โ โ โโhooks
โ โโAccountDetail
โ โ โโcomponents
โ โ โโhooks
โ โโLogin
โ โ โโcomponents
โ โ โโhooks
โ โโMain
โ โโSearch
โ โ โโcomponent
โ โ โโhooks
โ โโUser
โ โ โโcomponents
โ โ โโhooks
โ โโUserDetail
โ โโcomponents
โ โโhooks
โโroutes
โโstore
โ โโreducers
โโstyles
โโtypes
โโutils
๋ฌธ์
axios interceptor์์ ์๋ฌ ์ฒ๋ฆฌ ์ค ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฐ์
ํด๊ฒฐ
๋ฌธ์ ๊ฐ ๋์๋ ์ฝ๋
if (errorStatus === 401) {
UserToken.remove();
navigate(ROUTE.LOGIN); // useNavigate()
}
ํด๋น ์ฝ๋๋ฅผ axios interceptor์ ์๋ฌ ์ฒ๋ฆฌ ๋ถ๋ถ์ ์์ฑํ๋๋ฐ ์ด๋ ๋ค์๊ณผ ๊ฐ์ hook ํธ์ถ ๊ท์น์ ์ด๊ธด ๊ฒ์ด๋ค.
Call them at the top level in the body of a function component.
Call them at the top level in the body of a custom Hook.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ useNavigate๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ํ์ง ์๊ณ , ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์จ์ผ ํ๋ค. replace๋ ์์ ์ธ๊ธํ๋ ์ ์ฝ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
if (errorStatus === 401) {
UserToken.remove();
window.location.replace(ROUTE.LOGIN);
}
๋ฌธ์
ํ ํฐ์ ๋ฐ๋๋ก axios๋ฅผ ์ค์ ํ์์๋ ๊ณ์ํด์ client์์๋ ํ ํฐ์ ๋ฐ์ง ๋ชปํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํด๊ฒฐ
์๋๋ ์ค๋ฅ์ ๊ด๋ จ๋ ์ฝ๋๋ค.
const token = UserToken.get();
const instance = axios.create({
baseURL: process.env.REACT_APP_BASE_URL,
headers: {
Authorization: `Bearer ${token}`,
},
});
๋ก์ปฌ์คํ ๋ฆฌ์ง์ ํ ํฐ์ด ์ ์ฅ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์๊ธฐ ๋๋ฌธ์, axios์์ token์ ์ ๋๋ก ๋ฐ์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ์ถ์ ๋๋ค. ์ด ์ค๋ฅ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก interceptor๋ฅผ ๊ณต๋ถํ๊ณ ์ ์ฉํ๋ค. interceptor๋ then์ด๋, catch๋ก ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์์ฒญ์ ๊ฐ๋ก์ฑ ์ ์๊ธฐ ๋๋ฌธ์ ํ์คํ๊ฒ ํค๋์ ํ ํฐ์ ๋ด์ ์์ฒญ์ ํ ์ ์๋ค.
์๋์ ๊ฐ์ด interceptor๋ฅผ ์ ์ฉํ ์ฝ๋๋ก ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ค.
instance.interceptors.request.use((config) => {
const token = UserToken.get();
config.headers = {
Authorization: `Bearer ${token}`,
};
});
๋ฌธ์
์ ์ ์ญ์ ๊ฐ ์ ๋๋ก ๋์ง ์๋ ํ์. ์ญ์ ๊ฐ ๋์์์๋ view์ ๋ฐ์์ด ๋์ง ์์.
ํด๊ฒฐ
redux-logger๋ฅผ ์ดํด๋ณด๋ ์ด์ ๊ฐ์ ์ํฉ์ผ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
deleteUser
๋ณด๋ค getUsers
๊ฐ ๋จผ์ ์ฒ๋ฆฌ๊ฐ ๋์ด ์ญ์ ๋๊ธฐ ์ ์ ๊ณ ๊ฐ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์์จ ๊ฒ์ด๋ค.
๊ทธ๋์ ์๋์ ๊ฐ์ด deleteUser
dispatch ์์ await๋ฅผ ๋ถ์ฌ ์ฝ๋๋ฅผ ์์ ํ๊ณ , ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
const deleteUserHandler = async () => {
if (!confirm("์ ๋ง๋ก ํด๋น ๊ณ ๊ฐ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?")) return;
await dispatch(deleteUserThunk(id));
dispatch(getUsersThunk());
};
๋ฌธ์
๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ ๋ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ ์ฃผ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์์๋, ๋ฐ์ดํฐ๊ฐ ์์ ๋์ ๋ก์ง์ ์คํํ๋ค.
data === Array
data ? ๋ฐ์ดํฐ ์์ ๋ ๋ก์ง : ์์ ๋ ๋ก์ง
ํด๊ฒฐ
if([])
๋ก ๋น ๋ฐฐ์ด์ผ ๋ ์ด๋ค ๊ฐ์ ๋ฐํํ๋์ง ๊ฒ์ฌํด๋ณด์๋๋, true๋ฅผ ๋ฐํํ๋ค. ๋ฌธ์ ์ ์ฝ๋๋ true๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ ์์ ์ผ๋ก ์๋์ ํ์ง ์์๋ ๊ฒ์ด๋ค. ๋น ๋ฐฐ์ด์ length๋ก ๊ฒ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํตํด์ ํด๊ฒฐํ๋ค.
๋ฌธ์
๋ค์ ์ฝ๋์์ axios request config๋ก ๋ค์ด๊ฐ๋ params์ ํ์ ์ง์ ๋ฌธ์
export const getAccountThunk = createAsyncThunk(
ACCOUNT.GET,
async (params?: โ ) => {
try {
const response = await api.get(`/accounts`, { params });
paramas์๋ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์, object๋ก ํ์ ์ ์ง์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ interceptor์ config์ params์๋ object ํ์ ์ ๋ฃ์ด์ฃผ์๋ค.
config.paramsSerializer = {
serialize: (params: object) => {
return new URLSearchParams(params).toString();
},
};
๊ทธ๋ฌ๋ ์ด์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
'object' ํ์์ ์ธ์๋ 'string | string[][] | Record<string, string> | URLSearchParams | undefined' ํ์์ ๋งค๊ฐ ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.ts(2345)
ํด๊ฒฐ
์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ๋ณด๊ณ Record
ํ์
์ ๋ํด ๊ณต๋ถํ๊ณ , Record<string, string>
์ด๋ผ๋ ํ์
์ ๋ฃ์ด ํด๊ฒฐํ๋ค. ์ด๋ ํ๋กํผํฐ ํค๊ฐ string, ํ๋กํผํฐ ๊ฐ์ด string์ธ ๊ฐ์ฒด์ ํ์
์ ๋ปํ๋ค.
๊ฐ๋ ์ฑ ๋์ด๊ธฐ / ์ค๋ณต์ฑ ์ค์ด๊ธฐ
์ฝ๋๊ฐ ๋ณต์กํด๋ณด์ด๊ณ , ์ฝํ์ง ์์ผ๋ฉด ์ ์ ๋ ์ ์ง ๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ์ด ์ข์์ง ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค. ์ธ๋ถ๊ตฌํ์ ์ต๋ํ ์จ๊ธฐ๊ธฐ ์ํด ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌํ ์ ์๋ ํจ์๋ค์ hook์ผ๋ก ๋บ๊ณ , ๋ณ์๋ช ์ด๋ ํจ์๋ช ์ ์ง์ ๋ ์ข ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ๋ก ์์๋ณผ ์ ์๋ ์ด๋ฆ์ผ๋ก ์ง์ผ๋ ค๊ณ ํ๋ค.
์ค๋ณต์ด ๋๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๋ค๋ ๋๋์ด ๋ค ๋๋ ์ต๋ํ ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ๊ณ , ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจ์๋ค์ utils์ hooks ํด๋์ ๋ด์๋ค.
์ ์ง ๋ณด์ / ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
์ ์ธํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ ์ง ๋ณด์ํ๊ธฐ ์ฝ๊ฒ ํ๊ณ ์ถ์๋ค. ๊ทธ๋ฌ๋, ์ธ๋ถ ๊ตฌํ์ ์จ๊ธฐ๋ ์์ ์ ํ ๋ ํ ์ผ๋ก ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ํ ์ง ๊ฐ์ด ์ ์กํ ๋๋ ์์๊ณ , ์ถ์ํ๋ฅผ ์ด๋ป๊ฒ ํด์ผ ์ข์์ง ์ด๋ ค์ ๋ค. ๋ ์ ์ธํ์ผ๋ก ๋ฐ๊พธ๋ ค๋ค๋ณด๋ ๋๋ฌด ๋ง์ด ์ปดํฌ๋ํธ๋ฅผ ๋๋ ์ ์ฌ์ฌ์ฉ์ฑ์ด ์๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฐํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ค์ด ์ ๊ทน์ ์ผ๋ก ์๋ํ์ง ๋ชปํ๋ค. ๊ตฌํ ์ด๊ธฐ์ ์ํ ๋ฏน ๋์์ธ ํจํด์ ๊ณ ๋ คํด ์์ ๋จ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ค๋ฉด, ์ ์ธํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ ์ฌ์ ์ ๊ฒ ๊ฐ๋ค. ์ด๋ ์ข์ ์ฌ๋ก์ ์ฝ๋๋ฅผ ๋ง์ด ๋ณด๋ฉด์ ์ฐ์ต์ ํ ๋ค ๊ฐ์ ์ก์์ผ ํ ๊ฒ ๊ฐ๋ค.
๊ณต๋ถํ๋ฉด์ ์ ์ฉํด๋ณด๊ณ ์ถ์ ๊ฒ๋ค์ด ์๊ธฐ๋ฉด ๋ฆฌํฉํ ๋ง ํ์ต๋๋ค.
๊ธฐ์กด ํ๋ก์ ํธ์ ๋ฌธ์ ์
- ํจ์ ๋จ์์ ์ค๋ณต์ฑ์ ์ ๊ฑฐํ์ผ๋, ์ปดํฌ๋ํธ ๋จ์์์ ์ค๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์
- ๋ทฐ์ ๋ก์ง์ด ์ปดํฌ๋ํธ ์์์ ์ฝํ์์. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ ๋๋ก ์ด๋ค์ง์ง ์์ ์
- ๊ทธ ์ธ ๊ธฐ๋ฅ ๊ด๋ จ ๋ฒ๊ทธ๋ค
๋ฆฌํฉํ ๋ง์ ํ๋ฉฐ ๊ฐ์ ํ ์
- modal, input, button, card ๋ฑ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ, hook์ ๋ง๋ค์์ต๋๋ค
- ์ ์ง/๋ณด์์ ๊ต์ฅํ ์ด์ ์ ๋๊ผ์ต๋๋ค. ์ฝ๋์ ์ค๋ณต์ฑ์ด ์ ๊ฑฐ ๋์๊ณ , ํ๋ก์ ํธ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ํ์ ํ ์ ์๊ฒ ๋์ต๋๋ค.
- ํ์ด์ง๋ค์ด์
-> ๋ฌดํ ์คํฌ๋กค๋ง
- ๊ตฌํํด๋ณด๊ณ ์ถ์ด์ ๋ณ๊ฒฝํ์ต๋๋ค. interactiveํด์ง ๊ฒ ๊ฐ์ผ๋, ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ผ ํ ๋ ํ์ด์ง๋ค์ด์ ์ด ์ ํฉํ๋ค ์๊ฐํ์ต๋๋ค.
- UI ๊ฐ์
- interactiveํ ํ์ด์ง๋ฅผ ๊ตฌํํด๋ณด๊ณ ์ถ์ด์ ๋ฆฌํฉํ ๋งํ์ต๋๋ค. (Table -> Card)
- ๊ทธ ์ธ ์ ์ ์ก์ ์ ๋ฐ๋ฅธ ๋์์ธ์ ์ ์ฉํ์ต๋๋ค.
- Redux-persist ๋์
- ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์ญ์์ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์ ํ์ต๋๋ค.
์ด ์ธ ํ๋ก์ ํธ์ ์ ์ง/๋ณด์์ ๊ด๋ จํ์ฌ ์กฐ๊ธ์ฉ ๋ฆฌํฉํ ๋ง ํ์ต๋๋ค.