ํ”„๋กœ์ ํŠธ

[ํ”„๋กœ์ ํŠธ] DANGO 4์ฃผ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

soon327 2021. 6. 12. 23:58

๐Ÿก ์ง€์—ญ๊ธฐ๋ฐ˜์˜ ์žฌ๋Šฅ ๊ณต์œ  ์„œ๋น„์Šค - 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๋ฅผ ์‚ฌ์šฉํ•œ ๋””๋ฒ„๊น…์— ์ต์ˆ™ํ•ด์ง€๊ธฐ...

๋„ˆ๋ฌด๋งŽ์ด ์‰ฌ๋ฉด ๋ฒˆ์•„์›ƒ์ด ์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋Š๋‚Œ์ด ๊ฐ•ํ•˜๊ฒŒ ๋“ค๊ธฐ์— ์กฐ๊ธˆ๋งŒ ์‰ฌ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ๊ฒ ๋‹ค.
์šฐ์„  ์ •์ƒ์ ์ธ ์ƒํ™œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ๋ถ€ํ„ฐ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.๐Ÿ˜…
๊ณ ์ƒํ–ˆ๊ณ  ๊ณ ์ƒํ•˜์ž~ (ํ† ๋‹ฅํ† ๋‹ฅ)
โ›ณ๏ธ

'ํ”„๋กœ์ ํŠธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ํ”„๋กœ์ ํŠธ] YourCat 2์ฃผํ”„๋กœ์ ํŠธ ํšŒ๊ณ   (0) 2021.05.10