[ํ๋ก์ ํธ] DANGO 4์ฃผ ํ๋ก์ ํธ ํ๊ณ
๐ก ์ง์ญ๊ธฐ๋ฐ์ ์ฌ๋ฅ ๊ณต์ ์๋น์ค - DANGO
2์ฃผํ๋ก์ ํธ๊ฐ ๋๋๊ณ ์ฝ๋์คํ
์ด์ธ ํฌ๋ฃจ๋ถ ์ค ํ๋ถ์ด ์ด๋ ๊ฒ ๋ง์ํ์
จ๋ค.
'2์ฃผ ์ ๋ง ์งง์์ฃ ? 4์ฃผ๋ ๋์งง์ต๋๋ค.'
์ ๋ง์ด์๋ค.
4๊ฐ 2๋ณด๋ค ์์์ง๋ ์ ๋นํ ๋ง๋ฒ์ ๊ฑธ๋ฆฐ ๋ฏํ ๊ธฐ๋ถ์ด๋ค.
๋๋ ํ๋์ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฑ์ทจ๊ฐ๊ณผ ์์ ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋งํผ์ ๋ถ์กฑํจ์ ๋๋ผ๊ฒ ํด์ค 4์ฃผ ํ์ด๋ ํ๋ก์ ํธ์ ๋ํด ์ ์ด๋ณด๋ ค ํ๋ค.
์ด๋ฒํ๊ณ ์์๋ ์๋น์ค์ ๋ํ ์ค๋ช
๋ณด๋ค๋ (๊ถ๊ธํ์ ๋ถ์ ์์ ๋งํฌ๋ก ๋ค์ด๊ฐ์
์ ์ด์ฉํด์ฃผ์ธ์ ๐)
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ด๊ฐ ๋ง์ฃผํ ๋ฌธ์ ๋ค๊ณผ ์ด๋ฅผ ํด๊ฒฐํ ๊ณผ์ ๋ค, ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ์ค์ฌ์ผ๋ก ์ ์ด๋ณด๋ ค ํ๋ค.
4์ฃผ๊ฐ ๋ธ๋ก๊น
์ ํ์ง๋ ๋ชปํ์ง๋ง, ๋ฌธ์ ํด๊ฒฐ๊ณผ์ ๊ณผ ๋๋์ ๋ค์ ํํ์ด ๋
ธ์
์ ์ ์ด๋์๊ธฐ๋๋ฌธ์
ํด๋น ๊ธ๋ค์ ์ ๋ฆฌํ๊ณ ๋ค์ ํ๊ณ ํด๋ณด๋ ๊ฒ์ด ์ด ๊ธ์ ๋ชฉ์ ์ด ๋ ๊ฒ ๊ฐ๋ค.
๐ ์ฝ๋๋ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๊ฐ๋ฐ์๋ผ๋ ์ง์
์ ์ด์ผ๊ธฐํ๋ ๊ธ์ ์ฝ๊ฑฐ๋ ์์์ ๋ณด๋ฉด
๊ฐ๋ฐ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ง์
์ด๋ผ๋ ๋ง์ ์ฝ๊ฒ ๋ค์ ์ ์์๋ค.
๋๋ ํ๋ก์ ํธ ์ ๊น์ง ์ ๋ง์ด ๊ทธ๋ ๊ฒ ๊ณต๊ฐ๋์ง๋ ์์๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ง์ ?? ๊ธฐ๋ฅ์ ๊ตฌํํ๋๊ฒ ๊ฐ๋ฐ์ ์๋๊ฐ??
์ด์ ๋ ์ ๋ง์ด ๋ฌด์จ๋ง์ธ์ง ์กฐ๊ธ์ ์ ๊ฒ ๊ฐ๋ค.
๊ธฐ๋ฅ๊ตฌํ์ ๋ชฉ์ ์ผ๋ก ํ ์ฝ๋๋ค์ ๋์๋ณด๋ฉด ๋ฌธ์ ๊ฐ๋์๊ณ ๋ฐฅ๋จน๊ณ ๋๋ฉด ๋ ๋ฌธ์ ๊ฐ ๋์๋ค.
๊ทธ๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ๋ค์์ผ ๋น๋ก์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค๊ณ ๋งํ ์ ์์๊ณ ,
์ด ๊ณผ์ ์์ ๋จ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ์ ๋๋ณด๋ค ํจ์ฌ ๋ง์ ๊ฒ๋ค์ ๋ฐฐ์ธ ์ ์์๋ค.
์ง๊ธ๋ถํฐ 4์ฃผ๊ฐ ๋ด๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ๋ฐฐ์ด ์ ๋ค์ ๋ํด ํ๊ณ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
1. Redux Toolkit์์์ return
๋ฐฐ๊ฒฝ
2์ฃผํ๋ก์ ํธ ๋ Redux
๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋๋ ๋ถํธํจ์ด 2๊ฐ์ง ์์๋ค.
Redux ์ฌ์ฉ์ ์ํด ์ก์
ํ์
, ์ก์
์์ฑํจ์, ๋ฆฌ๋์ ์ด๋ ๊ฒ ์ธ ์ข
๋ฅ์ ์ฝ๋๋ฅผ ์ค๋นํด์ผํ๋ค๋ ์ ๊ณผ
๊ด๋ฆฌํ๋ ์ํ๊ฐ ๋ง์์ง์๋ก ๋ถ๋ณ์ฑ์ ์ ์งํด์ผํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์ปค์ก๋ค๋ ์ ์ด์๋ค.Redux-Toolkit
์ ์ด ๋๊ฐ์ง ๋ถํธํจ์ ํด์ํด์ฃผ๊ณ ์ข๋ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์ง๊ฒ ํด์ค ๊ฒ์ด๋ผ๋ ํ๋จ์ ์ฌ์ฉํด๋ณด์๋ ์๊ฒฌ์ ๋ด์๊ณ ํ์๋ค๋ ์ ๊ทน ๋์ํ์ฌ ์ฌ์ฉํ๊ฒ๋์๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
getChattingData: (state, action: PayloadAction<getChattingDataPayLoad>) => {
const newState = { ...state, render: [...action.payload.data, ...state.render] };
return newState;
},
setIsJoined: (state, action: PayloadAction<setIsJoinedPayLoad>) => {
state.otherId = action.payload.otherId;
state.roomId = action.payload.roomId;
state.isJoined = action.payload.isJoined;
},
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฆฌ๋์ ํจ์๋ฅผ ์ธ ๋, return
์ ์ธ ๋๊ฐ ์๊ณ ์์ธ ๋๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Redux Toolkit
์ ์ฌ์ฉํ๋ฉด ๋ถ๋ณ์ฑ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ mutateํ ๊ฐ๊ณต์ ํ ์๊ฐ ์์๋๋ฐ,
๋ถ๋ณ์ฑ์ ์ ์งํ๋์ง ํ์ง ์์๋์ง์ ๋ฐ๋ผ return
์ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ ํ๋ก์ ํธ ์์ํ ๋์๋ ์์ง๋ชปํด์ ์ฒ์ ๋ฆฌ๋์ํจ์๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ํค๋งธ๋ ๊ธฐ์ต์ด๋๋ค.
๋ถ๋ณ์ฑ์ ์ ์งํ๋ค๋ฉด ์๋ก์ด ์ํ๋ฅผ return
ํด์ค์ผ ํ๋ฉฐ, ์ ์งํ์ง ์์๋ค๋ฉด Redux Toolkit
์์ ๋ฆฌ๋์๋ฅผ ์์ฑํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ immer
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ถ๋ณ์ฑ์ ๋งก๊ธฐ๋ฉด ๋๋ค.
2. A non-serializable value was detected
๋ฐฐ๊ฒฝ
์๋์ ์๋ฌ๋ฉ์์ง๋ฅผ ํ๋ก์ ํธ๋์ 2๋ฒ ๋ณผ ์ ์์๋ค.A non-serializable value was detected in an action, in the path: register. ...
ํ๋ฒ์ Kakao Map API๋ก ์์ฑํ map ์ธ์คํด์ค๋ฅผ ๋ฆฌ๋์ค ์คํ ์ด์ ์ ์ฅํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ์ด๊ณ ,
๋ค๋ฅธ ํ๋ฒ์ ๋ชจ๋ฌ์ฐฝ์์ ์คํํ ํจ์๋ฅผ ์คํ ์ด์ ์ ์ฅํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ์ด๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
์๋ฌ๋ฉ์์ง๋ก ๊ตฌ๊ธ๋งํ์ฌ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ Redux์๋ ์ง๋ ฌํํ ์ ์๋ ์ผ๋ฐ๊ฐ์ฒด๋ง์ ์ ์ฅํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
์ง๋ ฌํ๋ ๋ฌด์์ผ๊น?
์ด๋ค ํ๊ฒฝ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฅธ ํ๊ฒฝ์ ์ ์ก ๋ฐ ์ ์ฅํ๊ธฐ ์ํด ๋์ค์ ์ฌ๊ตฌ์ฑํ ์ ์๋ ํฌ๋งท์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ณผ์ ์ ์ง๋ ฌํ๋ผ๊ณ ํ๋ค.
๊ฐ๋จํ ์๋ก๋ localstorage๊ฐ ์๋ค.
localstorage๋ ๊ฐ์ผ๋ก string์ ๊ฐ์ง์ ์์ง๋ง object๋ ๊ฐ์ง์ ์๋ค.
์ด๋ด๋ ์ฐ๋ฆฌ๋ json.stringify๋ฅผ ํตํด์ object๋ฅผ ์คํธ๋งํ ํ๋ค. ์ด๊ฒ์ด ์ง๋ ฌํ๋ค.
Promises, Symbols, Maps/Sets, ํจ์๋ค, ๋๋ ํด๋์ค ์ธ์คํด์ค์ ๊ฐ์ ์ง๋ ฌํ-๋ถ๊ฐ๋ฅํ ๊ฒ๋ค์ ๋ฆฌ๋์ค ์คํ ์ด์ ์ํ๋ ๋์คํจ์น๋๋ ์ก์ ์ ๋ฃ๋ ๊ฒ์ ํผํ๋ผ. ์ง๋ ฌํํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํผํจ์ผ๋ก์จ ๋ฆฌ๋์ค ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๋๋ฒ๊น ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์ ๋๋ก ๋์ํ๊ฒ ํ๋ฉฐ UI๋ ์์ํ๋๋ก ์ ๋ฐ์ดํธ๋๊ฒ ํ ์ ์๋ค. - ๋ฆฌ๋์ค ๊ณต์์ฌ์ดํธ
์ค์ ๋ก ์๋ฌ๋ฉ์์ง์ ์๊ด์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ์คํด์ค๋ ํจ์๋ฅผ ์ก์
์ ๋ฃ์ด ์คํ ์ด์ ์ ์ฅํด๋
๊ธฐ๋ฅ์ ์ ๊ตฌํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๊ทธ๋ฌ๋ ์ด๋ ๋ฆฌ๋์ค์ ์์ ์ฑ์ ์ํด์ ์ง์ํด์ผํ๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์๋ค.
๋ฐ๋ผ์ map ์ธ์คํด์ค๋ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์๋ ๋ถ๋ชจ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๋ฉฐ props๋ก ์ ๋ฌํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํ ๋งํ๋ค.
๋ฐ๋ฉด ๋ชจ๋ฌ์ฐฝ์ ๊ฒฝ์ฐ ์ด๋ป๊ฒํ ์ง ๊ณ ๋ฏผ์ ๋ง์ด ํ์๋ค.
๋ชจ๋ฌ์ฐฝ์ ์ํ๋ฅผ ๋ฆฌ๋์ค์ ์ ์ฅํจ์ผ๋ก์จ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ํ์ฌ, dispatch
ํ ๋ action์ ๋ชจ๋ฌ์ type๊ณผ text๋ฅผ ์
๋ ฅํ๋ฉด ๋ชจ๋ฌ์ ๋์ธ ์ ์๋๋ก ๊ตฌํํ ์ํ์๋ค.
์ดํ ์ถ๊ฐ์ ์ผ๋ก ์/์๋์ค ๋ฒํผ์ ๋๋ ์ ๋ ์ด๋ค ๋ฒํผ์ ๋๋ ๋์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ํจ์๋ฅผ ์คํํ๊ณ ์ถ์์ผ๋ ๋ฆฌ๋์ค์ ํจ์๋ฅผ ์ ์ฅํ ์ ์๋ค๋๊ฒ ๋ฌธ์ ์๋ค.
๊ณ ๋ฏผํ๋ค๊ฐ action์ callbackName๊ณผ callbackData๋ฅผ ์ถ๊ฐํ์ฌ ํ์ํ ํจ์์ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ๋ง์ ์ํ๋ก ์ ์ฅํ๊ณ
๋ชจ๋ฌ ์ปดํฌ๋ํธ ๋ด์์ callbackName์ ๋ฐ๋ผ ์ํ๋ ํจ์๊ฐ ์คํ๋๋๋ก ๋ก์ง์ ๊ตฌ์ฑํ๋ค.
๋ณด์ํ ์
๊ทธ๋ฌ๋ ์ดํ ์ฌ์ฉํ๋ฉด์ ์ธ๋ถ ์ปดํฌ๋ํธ์ setState์ ๊ฐ์ ์์
๋ค์ ๋ชจ๋ฌ ์ปดํฌ๋ํธ์์ ์คํํ๊ธฐ ํ๋ค๋ค๋ ์ ๊ณผ
์คํ์ ํ์ํ ํจ์๋ฅผ ๋ชจ๋ฌ์ปดํฌ๋ํธ์์ ์คํํ๋ค๋ณด๋ ํจ์๊ฐ ์์ ์ด ์ฐ์ด๋ ์ปดํฌ๋ํธ์ ์กด์ฌํ๋ ๊ฒ์ด ์๋ ๋ชจ๋ฌ ์ปดํฌ๋ํธ์ ๋ชจ์ด๊ฒ๋์๊ณ ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค๋ ์ ์ ๋ชจ๋ฌ์ปดํฌ๋ํธ์ ๋ถํผ๊ฐ ์ปค์ง์๋ก ํ์ฐํ ๋๋ ์ ์์๋ค.
์ต๊ทผ ๋ค์ ์ฐพ์๋ณด๋ ๋ฆฌ๋์ค์ ์ง๋ ฌํ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฐ๋ค์ ์ก์
์ ๋ฃ๊ธฐ์ํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๋ค.
๋ฐฉ๋ฒ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋์์ ๋๋ฌํ๊ธฐ ์ , ์ก์
์ ๋ฏธ๋ค์จ์ด๊ฐ ๊ฐ๋ก์ฑ์ ์ค์ง์ํจ ๋ค Plain Object๋ก ๊ฐ๊ณตํ์ฌ ๋ฆฌ๋์์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
๋ฐ๋ผ์ ๋ฆฌํฉํ ๋ง๊ณผ์ ์์ Redux-thunk
๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋์ ๋ฆฌํฉํ ๋งํ ์์ ์ด๋ค.
3. kakao Map์ ์ธ์คํด์ค์ talent Data ์ฐ๊ฒฐํ๊ธฐ
๋ฐฐ๊ฒฝ
kakao Map method๋ฅผ ์ฌ์ฉํด์ ์๋ฒ์ ์ ์ฅ๋ ์๋,๊ฒฝ๋์ marker์ infoWindow๋ฅผ ์์ฑํ ์ํฉ์์
์๋์ ๊ฐ์ด marker์ infoWindow์ talent์ ๋ณด๋ฅผ ๋ด๊ณ , ์ค๋ฅธ์ชฝํ๋จ์ ์ฌ๋ฅ๋ฆฌ์คํธ์์ ํ๋๋ฅผ ํด๋ฆญํ์ ๋ ํด๋นํ๋ marker์ infoWindow๋ฅผ ๋์ฐ๊ธฐ์ํด์๋ marker์ infoWindow ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ talent Data๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ง๋๊ฐ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ ๊ทผ ํ ์ ์๋๋ก ํด์ผํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
์ฒ์์๋ ์นด์นด์ค๋งต์ marker์ infoWindow ์ธ์คํด์ค์ ์ง์ data๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค๋ค. ๊ทธ๋ฌ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ด์ ๊ณ ๋ฏผ๋์ infoWindowGroup
์ด๋ผ๋ ์ด์ค๋ฐฐ์ด์ ์๋ก์ด ์ํ๋ก ๋ง๋ค๊ณ ๊ทธ๊ณณ์ [talentData, marker, infoWindow]
๋ฅผ ๋ด์๋ค. ์ด ๋ฐฐ์ด๋ก id๊ฐ ๋ด๊ธด marker์ infowindow์ ์ ๊ทผํ์ฌ ์ด๋ฒคํธ๋ฅผ ๊ฑธ ์ ์์๋ค.
if (infowindowRef.current.length < talentData.length) {
infowindowRef.current = [...infowindowRef.current, [talentData[i], infowindow, marker]];
}
๋ฐ๋ณต๋ฌธ์ ์ํํ๋ฉด์ useRef
๋ฅผ ์ฌ์ฉํ์ฌ talentData,marker,infoWindow๋ฅผ ํ์์ ๋ฐฐ์ด๋ก ๋ง๋ ๋ค์ ์ด ๊ฐ์ infoWindowGroup
์ด๋ผ๋ ์ํ์ ์ ์ฅํ์ฌ ์ธ๋ถ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
useRef
๋ฅผ ์ฌ์ฉํ ์ด์ ๋ useRef
์ ๋ํด์ ๊ณต๋ถํ์ ๋ ๊ธฐ๋กํ ์๋์ ํน์ง๋๋ฌธ์ด์๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์์ ์ํ๋ ์ํ๋ฅผ ๋ฐ๊พธ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ๋์ ๊ทธ ๋ค์ ๋ ๋๋ง ์ดํ๋ก ์ ๋ฐ์ดํธ ๋ ์ํ๋ฅผ ์กฐํ ํ ์ ์๋ ๋ฐ๋ฉด, useRef ๋ก ๊ด๋ฆฌํ๊ณ ์๋ ๋ณ์๋ ์ค์ ํ ๋ฐ๋ก ์กฐํ ํ ์ ์๋ค.
์์ ๊ฐ์ ํน์ง์ ์ด์ฉํ๋ฉด ๋๋๋ง์ ์๊ด์์ด ์์ ์ ์ผ๋ก ์ธ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์์๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. ๋ํ ๋ฒจ๋กํผํธ๋์ useRef ๊ธ์์ useRef๋ฅผ ์ฌ์ฉํ ๋ณ์๊ด๋ฆฌ์ ์์์ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ธ์คํด์ค๊ฐ ํฌํจ๋์ด์๋ ๊ฒ๋ ํ๋์ ์ฌ์ฉ์ด์ ์๋ค. ์ด์ ๋ฅผ ์๊ฐํด๋ณด๋ ์๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์ฑ๋ ์ธ์คํด์ค๊ฐ์ด ๋ฌด๊ฑฐ์ด ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋๋ ๊ฐ๋ณ๊ฐ์ ์ ์งํ ์ ์๋ useRef๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ ์ผ๋ก ์ ์ฅํ ์ ์๊ธฐ๋๋ฌธ์ด๋ผ๋ ์๊ฐ์ ํ๊ณ ์ด๋ฌํ ์ด์ ๋ก useRef
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํ์๋ค.
์ด์ ๊น์ง๋ useRef
๋ฅผ ์ค์ง ํน์ DOM ์ ์ ํํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํด์์๋๋ฐ, ์ด๋์ ๊ฒฝํ ์ดํ๋ก ์ปดํฌ๋ํธ ์์์ ๊ฐ๋ณ๊ฐ์ ์ ์งํ๊ธฐ ์ํ ๋ณ์๋ฅผ ์ ์ธํ ๋ useRef
๋ฅผ ์ ์ฉํ ์ฌ์ฉํ ์ ์์๋ค.
4. React-router-dom์ ์ธ๋ App์์ Props ์ ๋ฌํ๊ธฐ
๋ฐฐ๊ฒฝ
์ฑํ ๋ฐฉ์ ๋ง๋ค์์ ๋ ์๋๋ฐฉ์ ์ฑํ ๋ชฉ๋ก์ด ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋์ด์ผํ๋ ์ํฉ์ด์๋ค.
์ฆ ์ฑํ
๋ฐฉ์ ๋ง๋๋ ์ฌ๋ฅ์์ธํ์ด์ง์์ ์์ผ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ผ ์ ์์ด์ผ ํ๋๋ฐ ๋น์ ์์ผ์ ์์ฑํ๋ ์ฝ๋์ ์์ผ์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ ์ฝ๋๊ฐ ์ฑํ
ํ์ด์ง์ ๋ค์ด๊ฐ์์๋ค.
๋ฐ๋ผ์ ์์ผ์ ์ฝ๋๋ค์ ์ฌ๋ฅ์์ธํ์ด์ง์ ์ฑํ
ํ์ด์ง์ ๊ณตํต๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ App.tsx๋ก ์ฎ๊ฒจ์ผ ํ๋ ์ํฉ์ด์๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
์ฒ์์๋ ๋จ์ํ ์๋์ฒ๋ผ Props๋ก ๋ด๋ฆฌ๋ฉด ๋์ง ์์๊น? ํ์ง๋ง props๊ฐ ์ ๋ฌ๋์ง ์์๋ค.
<Route path="/detail/:talentId" component={TalentDetailPage} connectSocket={connectSocket} />
conponent
์ props๋ฅผ ์ ๋ฌ๋ฐ๋ TalentDetailPage๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ๋ ์์์ง๋ง, ํด๋น ๋ฐฉ๋ฒ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋๋ง๋ค ์ธ๋ง์ดํธ ํ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํ
ํ๋ ๋ฐฉ๋ฒ์ด๋ผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์ดํ ์ฐพ์๋ณด๋ ๋ผ์ฐํฐ๋ฅผ ํตํด ๋ ๋๋ ์ปดํฌ๋ํธ์ props๋ฅผ ์ ๋ฌํ ๋๋ component
prop ๋์ render
prop์ ์ฌ์ฉํ๋ฉด ๋๋ค๋ ๊ฒ์ ์ ์ ์์๋ค. render prop์ ์ฌ์ฉํ์ฌ functional component๋ฅผ ๋ผ์ฐํ
ํ ์ ์์๋ค.
<Route path="/detail/:talentId" render={(props) => <TalentDetailPage {...props} connectSocket={connectSocket} />
์ดํ TalentDetailPage
์์ props๋ฅผ ์ฝ์๋ก ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ react-router-dom์ 3๊ฐ์ง ๊ฐ์ฒด history
,location
,match
๊ฐ ํจ๊ป ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
5. useEffect์์์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
๋ฐฐ๊ฒฝ
ํ๋ก์ ํธ ์ค๋ฐ์ฏค์ ๊ฒช์๋ ๋ฌธ์ ์๋ค. ๋น์ useEffect์ ๋น๋๊ธฐ์ ๋ํด ๊ฐ์ ๋ชป์ก๊ณ ์์๋๋ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ๋ง์ ๊ฑธ ๊ณต๋ถํ ์ ์์๋ค.
useEffect(() => {
setRender([]);
getChats();
}, [curRoomId]);
const getChats = useCallback((page = 0) => {
...
server
.post(`/chats/${curRoomId}`, body)
.then((response) => {
setRender([...response.data.data, ...render]);
...
})
๋น์ ์๋ํ ๋ก์ง์
๋ค๋ฅธ์ฑํ
๋ฐฉ์ ๋๋ฌ์ curRoomId
๊ฐ ๋ฐ๋๋๋ง๋ค render
๋ฅผ ์ด๊ธฐํ์ํจ ๋ค, getChats
๋ฅผ ์คํ์์ผ์ ์๋ก์ด๋ฐฉ์ ์ฑํ
๋ด์ญ์ ๋ ๋๋งํ๋ ๊ฒ์ด์๋ค.
๋ฌธ์ ๋ curRoomId
๊ฐ ๋ฐ๋์ด๋ render
๊ฐ ์ด๊ธฐํ๋์ง์๊ณ ์ด์ ์ฑํ
๋ฐฉ์ render
์ ๊ณ์ ์์ด๋ ๊ฒ์ด์๋ค.render
์ ๋ฉ์์ง๋ฐ์ดํฐ๊ฐ ๊ณ์ ์์ด๋ฉด์ ๋ชจ๋ ์ฑํ
๋ฐฉ์ ๋ฉ์์ง๊ฐ ๋ ๋๋ง๋์๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
์๊ฐํด๋ณด๋ useEffect์์ ํจ์๋ค์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฏ๋กsetRender([])
๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง์๊ณ getChats
ํจ์๊ฐ ์คํ๋์ด setRender([...response.data.data, ...render])
์ด ์คํ๋์์๋
์ด๊ธฐํ๋์ง์์ render
๊ฐ ๋ค์ด๊ฐ๊ฒ๋๊ณ ์ด setRender
๊ฐ ๊ฒฐ๊ตญ render
๊ฐ์ ๊ฒฐ์ ํ๊ฒ๋ ๊ฒ ๊ฐ์๋ค.
useEffect์์์ ์คํ๋๋ getChats
ํจ์๋ ๋ด๋ถ์ ์ผ๋ก render
์ setRender
๋ฅผ ์ฌ์ฉํ๋ค.
์ฆ render
์ setRender
์ ๋ณํ์ ์์กด์ฑ์ ๊ฐ๋๋ก ์์
ํด์ค์ผํ๋ค. ์ด๋ฅผ ์ํด์ render
์ํ๋ฅผ ๋ฆฌ๋์ ์คํ ์ด์ ์ ์ฅํด์ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๊ณ
์ฑํ
๋ฐฉ๋ชฉ๋ก์ค ํ๋๋ฅผ ํด๋ฆญํ์๋ render
๋ฅผ ์ด๊ธฐํํด์ฃผ๊ณ ์๋ฒ์์ ์ฑํ
๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋๋ ๋ฆฌ๋์์ render
์ ์ ์ฅํ์ฌ ํ๋ฉด์ ๋๋๋งํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํ ๋งํ๋ค.
์ด๊ณผ์ ์์ useEffect์์์์ ๋น๋๊ธฐ์ฒ๋ฆฌ์ ๋ํด ์ข ๋ ์๊ฐํ๊ณ ๊ณต๋ถํ ์ ์์๋ค.
useEffect์ ์ด๋ค ํจ์๋ setState๋ฅผ ๋ฃ๋ ๊ฒ์, deps์์ ๊ฐ์ ์์กดํ์ฌ ๋ณํ๋ฅผ ์ฃผ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ useEffect์์์ deps์ ์์กด์ฑ์ ๊ฐ๋ ํจ์๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค๋ฉด ์ด๋ค์ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ธฐ๋๋ฌธ์ ๋ฐ๋์ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
๋ฐ๋ผ์ useEffet์์ ์ฌ๋ฌ ํจ์๋ setState๋ฅผ ์คํํ ๋์๋ ์ด๋ค๊ฐ์ ์ฐ๊ด์ฑ์ ๋ฐ๋์ ์ฒดํฌํด๋ณด๊ณ ์ฐ๊ด์ฑ์ ๊ฐ๋๋ค๋ฉด ์ด๋ค์ ๋ ๋ถ๋ฆฌํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์์กด์ฑ์ ๋ช ํํ ํด์ค์ผํ๋ค.
6. state๋ state๊ฐ ์ ์ธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ ๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค.
๋ฐฐ๊ฒฝ
์ฑํ
๋ฐฉ๊ฐ์ ๋ฉ์์ง๊ฐ ๊ตฌ๋ถ๋์ง ์์์ A์ฑํ
๋ฐฉ์์ B์ฑํ
๋ฐฉ ๋ด์ฉ์ด ๋ ๋๋๋ ๋ฒ๊ทธ๊ฐ ๋ฐ๊ฒฌ๋์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ socket.io์ ์ด๋ฒคํธ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์ ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ ์ฑํ
๋ฐฉ์ roomId๋ฅผ ์ถ๊ฐ๋ก ๋ฐ์๊ณ
๋ฉ์์ง๊ฐ ํ๋ ๋ค์ด์ฌ๋๋ง๋ค lastChat
์ํ์ ์ ์ฅํ ๋ค, lastChat.roomId
์ ํ์ฌ ๋ค์ด์์๋ ์ฑํ
๋ฐฉ์Id์ํ๋ฅผ ์ ์ฅํ curRoomId
๋ฅผ ๋น๊ตํ์ฌ ์ด ๋์ด ๊ฐ์๋๋ง ์ฑํ
๋ฐฉ์์์ ๋๋๋ง๋๊ฒ ๋ฆฌํฉํ ๋งํ์๋ค.
useEffect(() => {
if (lastChat && lastChat.roomId === curRoomId) {
createNewChats(lastChat); // ์ด ํจ์๊ฐ ์คํ๋๋ฉด ์ค์ ์ฑํ
๋ฐฉ์ ๋ ๋๋ง๋๋ค.
}
}, [lastChat]);
๋ฌธ์ ๋ ์ฑํ
๋ฐฉ์ ๋ง์ง๋ง๋ฉ์์ง๊ฐ ๋๋ฒ ๋ ๋๋ง๋๋ ๊ฒ์ด์๋ค.
๋ถ๋ช
์ปดํฌ๋ํธ๊ฐ unmount๋ ๋ useEffect์ cleanUpํจ์๋ก curRoomId
๋ฅผ ๋น๋ฌธ์์ด๋ก ์ด๊ธฐํ์์ผฐ๋๋ฐ
์lastChat.roomId
์ ์ผ์นํ์ฌ createNewChats
ํจ์๊ฐ ์คํ๋๋ ๊ฑด์ง๋ถํฐ ํ์ธํด์ผ ํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ฐฐ์ด์
๊ณ์ํด์ ๋๋ฒ๊น
ํด๋ณธ ๊ฒฐ๊ณผ, curRoomId๋ ์ด๊ธฐํ๋์ง๋ง lastchat์ด ์ด๊ธฐํ๋์ง ์๋ ๊ฒ์ด ๋ฌธ์ ์๋ค.
์ฑํ
ํ์ด์ง๋ฅผ ๋๊ฐ๋ ์์ผ์ ๊ณ์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก lastChat ์ํ์ ์์ผ์ ๋ง์ง๋ง ๋ฉ์์ง๊ฐ ์ค์๊ฐ์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ ๋ค, ์ฌ์ฉ์๊ฐ ์ฑํ
๋ฐฉ์ ๋ค์ด๊ฐ๋ ์๊ฐ curRoomId
์ lastChat.roomId
๊ฐ ์ผ์นํ๊ฒ ๋๊ณ createNewChats
ํจ์๊ฐ ์คํ๋์ด ๋ ๋๋ง๋์๋ ๊ฒ์ด๋ค. ์ด์ํจ๊ป ์๋ฒ์ ์ ์ฅ๋์๋ ๋ฉ์์ง๋ ๋ ๋๋ง๋๊ธฐ๋๋ฌธ์ ๋ง์ง๋ง๋ฉ์์ง๋ง ๋๋ฒ ๋ ๋๋ง ๋๋ค๋ ๊ฑธ ํ์ธํ ์ ์์๋ค.
๋ฌธ์ ์์ธ์ ํ์
ํ ๋ค์์๋ ์ฑํ
๋ฐฉ์ ํด๋ฆญํ ๋ lastChat
์ null
๋ก ์ด๊ธฐํ์ํด์ผ๋ก์จ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ์ปดํฌ๋ํธ์ ์ํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ก ๋ ๋๋ง๋ ๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค๋ ๊ฐ๋
์ ๋ค์ ์ก์ ์ ์์๋ค.[state ๋ณ์๋ช
, state๋ฅผ ๋ณํ์ํฌ ํจ์] = useState(์ด๊ธฐํ๊ฐ)
lastChat
์ํ๋ ์ต์๋จ์ธ App.tsx์์ ์ ์ธ๋ ์ํ์ด๊ธฐ๋๋ฌธ์ ์์๋ก ์ฒ๋ฆฌํด์ฃผ์ง ์์ผ๋ฉด ๋ฐ๋ก ์ด๊ธฐํ๋์ง ์์๋ ๊ฒ์ด๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค์๋ ์ํ๊ฐ ์ธ์ ์ด๊ธฐํ๋๋ ์ง๋ฅผ ์ ๊ฒฝ์ฐ๋ฉด์ ์ฝ๋๋ฅผ ์ง๊ธฐ ์์ํ๋ค. ์์๋ก ์ํ๋ฅผ ์ด๊ธฐํ์์ผ์ผ ํ ๋๋ ์ด๋ฒคํธํธ๋ค๋ฌ๋ useEffect์ cleanupํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์์ํ๋, ์ปดํฌ๋ํธ๋ค์ ํจ์ฌ ๋ ๋ด ์๋๋๋ก ์๋ํ๋ ๊ฒ์ ๋ณด๊ณ ๋ง์ ๊ณต๋ถ๊ฐ ๋์๋ค๊ณ ์๊ฐ์ด ๋ ๋ฌธ์ ์ค ํ๋์๋ค.
7. ๊ทธ ์ธ
์ํ๋ฅผ ์ง์ฝ์ ์ผ๋ก ๊ด๋ฆฌํ ์ง, Redux์ ์ ์ฅํ์ฌ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ ์ง๋ ์ปดํฌ๋ํธ๊ฐ์ deps๋ฟ๋ง ์๋๋ผ ์ผ๋ง๋ ์ํ๋ฅผ ๊ณต์ ํ๋ ์ง, ์ฌ์ฌ์ฉํ ์ปดํฌ๋ํธ์ธ ์ง ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ ๊ฒฐ์ ํด์ผํ๋ค.
useEffect
์์์ ์ฐ์ธ props๋ ์์กด์ฑ๋ฐฐ์ด(deps)์์ ๋ฃ์ด์ฃผ๋๊ฒ์ด ๊ท์น์ด๋ค.useCallback
์ deps ์์๋ ํด๋น ํจ์์์ ์ฌ์ฉํ state์ props๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋ props๋ก ๋ด๋ ค๋ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์๋ค๋ฉด ํด๋น ํจ์๋ ์์ง๋ง๊ณ ๋ฃ์ด์ค๋ค.react-redux์ ๋ด์ฅ๋์ด์๋
shallowEqual
๋ฅผ ์ฌ์ฉํ๋ฉด useSelector๋ฅผ ์ฌ์ฉํด์ ๊ตฌ์กฐ๋ถํดํ ๋น์ ํ๊ฑฐ๋ ๊ฐ์ฒด,๋ฐฐ์ด์ ๋ฐ์๋ ํด๋น ๊ฐ์ด ๋ณํ๊ฐ์๋์ง ์์ ๋น๊ต๋ฅผ ์์์ ํด์ฃผ๊ธฐ๋๋ฌธ์ ๋ถํ์ํ ๋๋๋ง์ ๋ณด์ํ ์ ์๋ค.๋์๋ณด๋ฉด ์ด๊ธฐ์ ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์ ์ ํ ๋ ? ๋ null, any๋ฑ์ ๋ง์ ์๊ฐ์์ด ์ถ๊ฐํ๋ ๊ฒ์ด ์ฝ๋๊ฐ ๋ฐฉ๋ํด์ง์๋ก ๋ง์ ์๋ฌ๋ฅผ ๋ณ๊ฒ ํ ๊ฒ ๊ฐ๋ค. ๋ฆฌ๋์์ payload ํ์ ์ ์ ํ ๋๋ ๋์ค์์์ผ ํจ์๋ง๋ค์ payload๋ฅผ ์ ํ๊ธฐ ์์ํด์ โ์ง์์ ์ด๋ ๊ฒํ์ผ๋ฉดโ ํ๋ ์๊ฐ์ด ์ ๋ก ๋ค์๋ค.
๐จ๐ปโ๐ป Review
์๊ทธ์ 20์ฃผ๊ฐ ๋ฌ๋ ค์๋ ์ฝ๋์คํ
์ด์ธ ์ํํธ์จ์ด ์์ง๋์ด๋ง ๊ณผ์ ์ด ๋๋ฌ๋ค.
์ผ์ฃผ์ผ๋ง๋ค ์ ๊ฒ๋ ํ ๋ช
, ๋ง๊ฒ๋ ์ธ ๋ช
์ ์๋ก์ด ํ์ด์ ํ์ดํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ๋๋ณด๋ค ํจ์ฌ ์ํ๋ ์๊ฐ์๋ค๋ ๋ง์ด ๋ง๋ฌ์๋ค.
๊ทธ๋ด๋๋ง๋ค ์ด๋์ ์ฃผ์๋ค์ '๊ทธ๋ค์ด ํฌ์ํ ์ ๋์ ์ธ ์๊ฐ์ ์กด์คํด์ผํ๋ค' ๋ผ๋ ๋ง์ ๋ ์ฌ๋ ธ๋ค.
๊ทธ ๋ง์ ๋์๊ธฐ๋ฉด์ ๊ทธ ์ ๋์ ์ธ ์๊ฐ์ ์ฐจ์ด๊ฐ ๋ฒ์ด์ง์ง๋ ์๋๋ก ๋ด๊ฐ ์์ ์ ์๋ ์๊ฐ์ ๋ชจ๋ ์์ ๊ณต๋ถํ๋ ๊ฒ ๊ฐ๋ค.
์น๊ตฌ๋ค๊ณผ์ ์ฝ์๋ ๋ชจ๋ ๋ฏธ๋ค์ 6์๋ฌ์ ์ฝ์์ด ์ฐธ ๋ง์ด๋ ์์๊ณ , ๊พธ์คํ ํ๋ ์ด๋๋ ํ์ง๋ชปํด์ ๋ชธ๋ฌด๊ฒ๋ 6kg์ด๋ ๋น ์ก๋ค.
ํ๋ก์ ํธ๋ฅผ ์์ํ๊ณ ๋์๋ ๋ณด๋ฆฌ์์ ์ฐ์ฑ
๋ ๊ฐ์กฑ๋ค์๊ฒ ๋ถํํ๋ค. ๋ณด๋ฆฌ์ผ๋ฏธ์ํด...๐ข
ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ , ๊ทธ๋์ ๋ด๊ฐ ๋ฐฐ์ด๊ฒ๋ค์ ์ ๋๋ก ํ์ฉํด์ ํ๋ก์ ํธ์ ๋ น์๋ผ ์ ์์๊น? ๋ผ๋ ๊ฑฑ์ ๋ ๋ง์์ง๋ง ํ๋ก์ ํธ ์ค๊ฐ์ค๊ฐ ๋ค์ํ ๋ฌธ์ ๋ค์ ๋ถ๋ชํ์ ๋ ๋๋ฌด๋ง์ ๋์์ด๋์๋ค. ํนํ ํ๋ก์ ํธ์ ๊น์ง ๋งค์ผ ์ผ๋ ๋ธ๋ก๊ทธ ๊ธ๋ค์ด ๋๋ฌด ๋์์ด ๋ง์ด ๋ผ์ ๊ทธ๋์ ๋๋ฅผ ๋งค์ฐ๋งค์ฐ ์นญ์ฐฌํด์ฃผ๊ณ ์ถ๋ค. ์ํ์ด์ํ์ด~
๋ํ ํ์๋คํํ
๋ ๋๋ฌด ๊ฐ์ฌํ๋ค. ๋ค์๋งํ์ง๋ง ๋น์ ๋ค์ ๋ง๋๊ฑธ๋ก ์ด๋ฒ๋
๋์ ํ์ด ์ ๋ถ..๋ ์ข ๊ทธ๋ ๊ตฌ ๋ฐ์ ๋๋ ์ด ๊ฒ ๊ฐ์...
ํ์๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ ๋์ ์ธ ์๊ฐ๋์ ๋๋ฆฌ๋ ๊ฒ๋ณด๋ค ์ค์ํ๊ฒ ์๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฐ๋๊ฑฐ๋ผ๋๊ฑธ ์ ์ ํ ๋๊ผ๋ค.
ํ์๋ค์ ์๊ฒฌ์ ๋ฐ๋ผ ์คํ๋ฆฐํธ๋ณ๋ก ์ผ์ ์ ์ธ์ฐ๊ณ ๋งค์ผ์์นจ ์ค๋์ ๋ชฉํ๋ฅผ ์์ฑํ๋ฉฐ ํ๋ฃจ๋ฅผ ์์ํ๋, ์ฐ์ ์์๊ฐ ํ์คํ ์ ๋ฆฌ๋๊ณ ์์
์๋๊ฐ ๋นจ๋ผ์ง๋ ๊ฒ์ ์ฒด๊ฐํ ์ ์์๋ค.
๋๋ ์ฐ์ ์์๋ฅผ ์๊ฐํ์ง ๋ชปํ๊ณ ๊ณ์ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ๋ก ์์
์ด ์ด์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋๋ฐ ์์ผ๋ก๋ ํญ์ ์ฐ์ ์์๋ฅผ ์๊ฐํ๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค๋ ๋ค์ง์ ํ๋ค.
์ด์ ๋ค์ ์คํ
์ ์ค๋นํด์ผ ํ๋ค. ๋๋ฐ๊ณ ์ฝ๋ฉํ๊ธฐ!!๐ธ
ํ ๊ฒ๋ค์ด ์ฐธ ๋ง๋ค. ํ๋ก์ ํธ์์ ๊ฐ๋
์ ์ผ๋ก ๋ถ์กฑํ๋ค๋ ๊ฑธ ๋ง์ด ๋๊ผ๊ธฐ๋๋ฌธ์ ๊ธฐ๋ณธ๋ถํฐ ๋ค์ ์ ๋๋ก ๊ณต๋ถํด๋ณผ ์๊ฐ์ด๊ณ ,
ํ๋ก์ ํธ์์ ๋ฏธ์ฒ ๊ตฌํํ์ง๋ชปํ๋ ๊ธฐ๋ฅ๋ค์ ๊ตฌํ, storybook
์ฌ์ฉ, redux-thunk
๋ฅผ ์ฌ์ฉํ์ฌ action์ ํจ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ฌ์ฐฝ ๋ฆฌํํ ๋ง, ์ฝ์์ด์๋ debugger
๋ฅผ ์ฌ์ฉํ ๋๋ฒ๊น
์ ์ต์ํด์ง๊ธฐ...
๋๋ฌด๋ง์ด ์ฌ๋ฉด ๋ฒ์์์ด ์ฌ ๊ฒ ๊ฐ๋ค๋ ๋๋์ด ๊ฐํ๊ฒ ๋ค๊ธฐ์ ์กฐ๊ธ๋ง ์ฌ๊ณ ๋ค์ ์์ํด์ผ๊ฒ ๋ค.
์ฐ์ ์ ์์ ์ธ ์ํ๋ก ๋์๊ฐ๊ธฐ๋ถํฐ ํด์ผํ ๊ฒ ๊ฐ๋ค.๐
๊ณ ์ํ๊ณ ๊ณ ์ํ์~ (ํ ๋ฅํ ๋ฅ)
โณ๏ธ