WEB/REACT

react-query๋ฅผ ์งง๊ฒŒ ์‚ฌ์šฉํ•ด๋ณธ ํšŒ๊ณ ..๋ž„๊นŒ...?

mingzoo 2023. 4. 4. 15:28

์ง€๊ธˆ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ react-query์™€ recoil์„ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ ์žˆ๋‹ค.

๋ฌผ๋ก  ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜๋‹คใ…Žใ…Ž..

์‚ฌ์‹ค ์ž‘๋…„๊นŒ์ง€๋งŒ ํ•ด๋„ ์ฑ„์šฉ๊ณต๊ณ ๋‚˜ ๊ทธ๋Ÿฐ ๊ณณ๋“ค์— Redux๊ฐ€ ๊ฐ€๋“์ฐผ์—ˆ๋Š”๋ฐ ์–ด๋Š ์ˆœ๊ฐ„๋ถ€ํ„ด๊ฐ€ React-Query์˜ ์ ์œ ์œจ์ด ๋†’์•„์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๊ณต๋ถ€ํ•ด์•ผ์ง€..ํ•ด์•ผ์ง€..์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ์šฐ์—ฐํžˆ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด์„œ ํ•ด์•ผ๋งŒํ•˜๊ฒŒ ๋๋‹ค..

๋ฆฌ์ฝ”์ผ์€ ์ด์ „์— ํ•™์Šตํ•ด๋ดค๋Š”๋ฐ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” ์•ˆํ•ด๋ด์„œ ์‚ด์ง ๊ฒ์ด ๋‚ฌ์—ˆ๋‹ค

๊ทผ๋ฐ ์ง€๊ธˆ ํ•ด๋ณด๋‹ˆ ์ ์šฉํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ๋Š” ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์œผ๋‹ˆ ๋‚˜์ฒ˜๋Ÿผ ๊ฒ๋จน์€ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ์ผ๋‹จ ํ•ด๋ณด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ๋‹ค.

 

์ผ๋‹จ ๋„๋Œ€์ฒด ์š”์ฆ˜ ์™œ ๋‹ค ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด์ง€์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ๋“ค์—ˆ์—ˆ๋‹ค.

์ดํ•ดํ•ด๋ณด๋ ค๊ณ  ์ž๋ฃŒ๋ฅผ ๋งŽ์ด ์ฐพ์•„๋ดค๋Š”๋ฐ ์ž๋ฃŒ๋„ ์ž๋ฃŒ์ง€๋งŒ ์ง์ ‘ํ•ด๋ณด๊ณ  ๊นจ๋‹ซ๋Š”๊ฒŒ ์ œ์ผ ์ดํ•ด๊ฐ€ ์ž˜ ๋์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ž๋ฃŒ๋Š” ๋„์ž…์„ ํ•ด์„œ ๊ธฐ์กด์˜ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋กœ ๋ฐ”๊ฟ”๋ณธ ๊ทธ๋Ÿฐ ๊ธ€๋“ค์„ ๋งŽ์ด ๋ดค๋‹ค.

๊ทธ๋ž˜์„œ ์งง์ง€๋งŒ ๋‘ ๋‹ฌ๊ฐ€๋Ÿ‰ ์‚ฌ์šฉํ•ด๋ณธ ์ฐŒ๋žญ์ด์ธ ๋‚ด๊ฐ€ ์–ด๋–ค ์ ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ ์–ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.

์ง„์ง€ํ•œ ๊ธ€์€ ์•„๋‹ˆ๋‹ค...๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ํ•ด๋ณธ ์–•์€ ๊นŠ์ด์—์„œ ๋Š๋‚€ ๊ธ€์ผ๋ฟ..

 

์ ์šฉํ•œ ์ด์œ 

์œ„ ์‚ฌ์ง„์€ ๊ณต์‹๋ฌธ์„œ๋กœ ๊ฐ€๋ฉด ์ด๋Ÿฐ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.

๋‚ด ๋ˆˆ์— ์ œ์ผ ๋ณด์ธ ๊ฒƒ์€ ASYNCHRONOUS STATE MANAGEMENT์˜€๋‹ค. ๋ฐ”๋กœ '๋น„๋™๊ธฐ ์ƒํƒœ๊ด€๋ฆฌ'๋ผ๋Š” ๊ฑฐ๋‹ค.

wow ์˜ค๋Š˜๋„ ๋‚˜์˜ค๋Š” ๋น„๋™๊ธฐ

๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” React์—์„œ ์„œ๋ฒ„์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์บ์‹ฑ, ๋™๊ธฐํ™”, ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ชจ๋“ˆ์ด๋‹ค๋ผ๊ณ  ๋งํ•œ๋‹ค.

์‚ฌ์‹ค ๊ทธ๋ ‡๊ฒŒ ๊ทœ๋ชจ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด๋ณด๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•ด๋ณธ ๊ฒฝํ—˜์ด ์—†์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ๊ธฐ์กด์˜ ์œ„์˜ ๋ถ€๋ถ„์— ํฌ๊ฒŒ ๋ถˆํŽธํ•จ์„ ๋Š๋ผ์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค.

๊ทผ๋ฐ ์ฐธ ์‹ ๊ธฐํ•œ๊ฒŒ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ๋Š” ๋ถˆํŽธํ•œ ์ ์„ ๋Š๊ผˆ์—ˆ๋‹ค.

์‚ฌ์‹ค ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์•ผํ–ˆ๋Š”๋ฐ ์ต์ˆ™์น˜์•Š์•„์„œ ์ฒ˜์Œ์— ๋‚ด๊ฐ€ ํ•˜๋˜ ๋ฐฉ์‹๋Œ€๋กœ api ํ˜ธ์ถœ์„ ํ–ˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์˜๋„์น˜์•Š๊ฒŒ ๋ถˆํŽธํ•œ ์ ์„ ๋Š๋ผ๊ณ  ํ•ด๊ฒฐํ•œ ์…ˆ์ด ๋๋‹ค,,,ํ˜ธํ˜ธ,,

 

๋‚ด๊ฐ€ ๋Š๋‚€ ๋ถˆํŽธํ•จ์€ ํ™”๋ฉด์„ ์ดˆ๊ธฐ ๊ตฌ๋™ํ• ๋•Œ apiํ˜ธ์ถœ์„ ํ•˜๋ฉด ๋กœ๋”ฉ์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๊ฐ€ React Native๋กœ ์ด๋ฃจ์–ด์ง„ ์–ดํ”Œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค๋ณด๋‹ˆ๊นŒ ๋กœ๋”ฉํ™”๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜์— ๊ต‰์žฅํ•œ ๋ถˆํŽธํ•จ์ด ํฌ๊ฒŒ ๋Š๊ปด์กŒ์—ˆ๋‹ค.

๋‚˜๋Š” sns์„œ๋น„์Šค์˜ ํ”„๋กœํ•„ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ–ˆ์—ˆ๋Š”๋ฐ ํ”„๋กœํ•„ํŽ˜์ด์ง€๋Š” ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ ํ”„๋กœํ•„์‚ฌ์ง„, ๋‹‰๋„ค์ž„, ๊ณ„์ •์ด๋ฆ„, ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰, ํฌ์ŠคํŠธ ๋“ฑ ๋ถˆ๋Ÿฌ์˜ฌ ์ •๋ณด๋“ค์ด ๋งŽ๋‹ค.

์ด๊ฒŒ ํ•œ api๋กœ ์˜จ๋‹ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ๋˜ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด์„œ ์˜ค๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ํ•˜๋‚˜์˜ api๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค!? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ api๋ฅผ ๋ถ€๋ฅธ๋‹ค๋ฉด??
๊ทธ๋ ‡๋‹ค๋ฉด ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š”๊ฑฐ๋‹ค,,

์™œ์ธ์ง€ ๋ชจ๋ฅด๊ฒŒ ์•ฑ์—์„œ์˜ ๋กœ๋”ฉ์ด ์›น์—์„œ์˜ ๋กœ๋”ฉ๋ณด๋‹ค ์ฒด๊ฐ์ ์œผ๋กœ ๊ธธ๊ฒŒ ๋Š๊ปด์ง€๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ํ™”๋ฉด์ด ์ž‘์•„์„œ ๊ทธ๋Ÿฐ๊ฐ€..?

๋ญ”๊ฐ€ ์•ฑ์€ ์›น๋ณด๋‹ค ๋” ์ž‘์€ ํ™”๋ฉด์—์„œ ํŽ˜์ด์ง€๊ฐ„ ์ด๋™์ด ๋น ๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ธฐ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๋Š๋‚€๋‹ค๊ณ  ํ˜ผ์ž ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์—ฌ๊ฐ„ ์ด api๋ฅผ ํ˜ธ์ถœํ•˜๋Š๋ผ ๋นˆํ™”๋ฉด์ด ๋‚˜์˜ค๋Š” ์‹œ๊ฐ„์ด ๊ธธ๋‹ค๊ณ  ๋Š๊ปด์ง€๋Š” ๊ฑด ๋‚˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€์›๋“ค๋„ ๊ทธ๋ ‡๊ฒŒ ๋Š๊ผˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ฐœ์„ ํ•  ๋•Œ ๋‹ค๋ฅธ ์ถ”๊ฐ€์ ์ธ ๊ฐœ์„ ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ์ง€๋งŒ React-query๋„ ํ•œ ๋ชซํ–ˆ๋‹ค.

 

์ผ๋‹จ ๋‚ด๊ฐ€ ๋Š๋‚€ ์ œ์ผ ์ข‹์•˜๋˜ ๊ธฐ๋Šฅ ์ค‘์— ํ•˜๋‚˜๋Š” ๋ญ๋‹ˆ๋ญ๋‹ˆํ•ด๋„ '์บ์‹ฑ', '์—๋Ÿฌํ•ธ๋“ค๋ง'์ด์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” '์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง'์ด ๊ต‰์žฅํ•œ ์žฅ์ ์ด๋‹ค.

 

์ฝ”๋“œ์˜ ๋‹จ์ˆœํ™”

๋‚ด๊ฐ€ ์ฐธ๊ณ ํ–ˆ๋˜ ์•„ํ‹ฐํด์ค‘์— ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด BoilerPlate์˜ ๊ฐ์†Œ๋ฅผ ์†์— ๊ผฝ์•˜๋‹ค.

์‚ฌ์‹ค ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œ์ผ ๋จผ์ € ๊ฒช๋Š” ๋ฌธ์ œ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋Ÿฌ๋‹์ปค๋ธŒ์ด๋‹ค.

๋ฌผ๋ก  ํ•™์Šตํ•  ๋•Œ์—๋„ ๊ต‰์žฅํ•œ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์žˆ์ง€๋งŒ, ๋„์ž…์— ์žˆ์–ด์„œ๋„ ๊ต‰์žฅํžˆ ๋งŽ์€ ์ฝ”๋“œ์˜ ์–‘์ด ์ ํ˜€์ง€๊ณ , ๋กœ์ง์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋“€์„œ, ์•ก์…˜, ์ƒํƒœ ๋“ฑ๋“ฑ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์–ด ๊ต‰์žฅํžˆ ๋ถ„๊ธฐ์„ฑ์ด ์ข‹์ง€๋งŒ, ๊ทธ๋งŒํผ ์ ์–ด์•ผํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์ด ๋งŽ์•˜๋‹ค.

 

๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ˆˆ์œผ๋กœ ๋ด๋„ ํ™•์ค„์—ˆ๋‹ค.

const userInfo = useQuery<UserProfile>(['userProfile', userId], () =>
    getUserProfile(userId),
  );

์ด ํ–‰์œ„ ํ•˜๋‚˜๋กœ api ํ˜ธ์ถœ ํ•ธ๋“ค๋ง์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์ฝ”๋“œ์˜ ๋‹จ์ˆœํ™”๋ผ๊ณ  ํ•˜๋ฉด ๋”ฐ๋ผ๋ถ™๋Š” ๊ฒƒ๋“ค ๊ฐ€๋…์„ฑ,,์œ ์ง€๋ณด์ˆ˜์— ์ด์ ,,์ด๋‹ค.

๊ฐ€๋…์„ฑ์€ ๋‚ด๊ฐ€ ์ค‘๊ฐ„ ํˆฌ์ž…๋ผ์„œ ์ฝ”๋“œ๋ฅผ ๋ดค๋˜ ํ”„๋กœ์ ํŠธ๋ผ react query๋ฅผ ์ ์šฉํ•˜๋Š”๋ฐ ํฐ ์–ด๋ ค์›€์ด ์—†์—ˆ๋‹ค๋Š” ๊ฑธ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์œ ์ง€๋ณด์ˆ˜๋Š”.. ์ผ๋‹จ ํฌ๊ฒŒ ๋Š๋‚€ ๋ถ€๋ถ„์€ ์—†์ง€๋งŒ, ์—ฐ์‡„์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ ์šฉํ•˜๋Š”๋ฐ๋„ ์šฉ์ดํ• ํ…Œ๋‹ˆ๊นŒ ์œ ์ง€๋ณด์ˆ˜์— ์žˆ์–ด ์šฉ์ดํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์–ด๋ฆผ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

API ํ˜ธ์ถœ ํ•ธ๋“ค๋ง

๋ฆฌ๋•์Šค๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ถ€ํ„ฐ state ๊ตฌ์กฐ๊นŒ์ง€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์„ค๊ณ„ํ•ด์•ผํ–ˆ๋‹ค.

์œ„์—์„œ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” ์ž์‹ ์žˆ๊ฒŒ ๋น„๋™๊ธฐ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ๊ณต์‹๋ฌธ์„œ์— ์ž‘์„ฑ๋˜์–ด์žˆ๋Š”๋งŒํผ ๋‹ค๋ฐฉ๋ฉด์—์„œ ๋„์™€์คฌ๋‹ค.



๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์˜ต์…˜ (๋‚ด๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜๊ฑด isLoading,,)๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฒฝํ—˜๊นŒ์ง€ ์‰ฝ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์—๋Ÿฌํ•ธ๋“ค๋ง์„ ํ†ตํ•ด ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ๋„์šด๋‹ค๋˜์ง€์™€ ๊ฐ™์€ UX๋ฅผ ๊ณ ๋ คํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

const postIdList = useInfiniteQuery(
    ['FeedPostList', userId],
    ({pageParam}) => getPostIds(userId, {pageParam}),
    {
      getNextPageParam: (lastPage, pages) => {
        if (lastPage.data.last === false) {
          return pages.length;
        } else {
          return undefined;
        }
      },
    },
  );

์œ„๋ฅผ ๋ณด๋ฉด useInfiniteQuery๋ฅผ ํ†ตํ•ด ๋ฌดํ•œ์Šฌ๋ผ์ด๋“œ?์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

์ด๋Ÿฐ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์—์„œ์˜ ์šฉ์ดํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์ด ๋งŽ๋‹ค.

 

์บ์‹ฑ

๋ญ๋‹ˆ๋ญ๋‹ˆํ•ด๋„ ์บ์‹ฑ

๋‚ด๊ฐ€ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์˜ ์บ์‹ฑ์„ ๊ฐ„ํŽธํ•˜๋‹ค๋ผ๊ณ  ๋Š๋‚€ ๊ฒƒ์€ ๋ฐ”๋กœ key๋•Œ๋ฌธ์ธ๊ฒƒ๊ฐ™๋‹ค.

const likeMutation = useMutation({
    mutationFn: () => putPostLike(postId),
    // When mutate is called:
    onMutate: async () => {
      // Cancel any outgoing refetches
      // (so they don't overwrite our optimistic update)
      await queryClient.cancelQueries({queryKey: ['post', postId]});

      // Snapshot the previous value
      const previousPost = queryClient.getQueryData<FeedPost>(['post', postId]);
      if (!previousPost) {
        return null;
      }
      // Optimistically update to the new value
      if (previousPost?.isLike) {
        queryClient.setQueryData(['post', postId], {
          ...previousPost,
          isLike: false,
          likeCount: previousPost.likeCount - 1,
        });
      } else {
        queryClient.setQueryData(['post', postId], {
          ...previousPost,
          isLike: true,
          likeCount: previousPost.likeCount + 1,
        });
      }

      return {previousPost};
    },
    onError: (_err, _newTodo, context) => {
      queryClient.setQueryData(['post', postId], context?.previousPost);
    },
    onSettled: () => {
      queryClient.invalidateQueries({queryKey: ['post', postId]});
    },
  });

useMutate๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด ์•ˆ์—์„œ key์™€ setQueryData, invalidateQueries ๋“ฑ์„ ํ†ตํ•ด ๋ถ„๋ฆฌํ•ด์„œ ํ•ด๋‹น key์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์‚ญ์ œํ•˜๊ณ , ๊ฐฑ์‹ ํ•˜๋Š” ์ด๋Ÿฐ ๋™์ž‘๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฐ ์บ์‹ฑ์ด ๋‚˜ํ•œํ…Œ๋Š” ๋ญ”๊ฐ€ ํ˜๋ช…์ ์œผ๋กœ ๋‹ค๊ฐ€์™”๋‹ค. ๋น„์Šทํ•œ ์ •๋ณด๋ฅผ ์•„์ด๋””๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์šฉํ•˜๋ฉด์„œ ๋ญ”๊ฐ€ ๋งํ•  ์ˆ˜ ์—†๋Š” ํŽธ๋ฆฌํ•จ?์„ ๋Š๊ผˆ๋‹ค..

 

 

 

์ด๋Ÿฐ ํŽธ๋ฆฌํ•จ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์Œ“์—ฌ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•จ์— ์žˆ์–ด์„œ ๋‚ด๊ฐ€ ์“ด ์ฝ”๋“œ์— ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ ์—†์ด ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ •๋ง ๊ฐœ์ธ์ ์œผ๋กœ ๋Ÿฌํ”„ํ•˜๊ฒŒ ๋Š๋‚€ ์ ๋“ค์ด๋ผ์„œ ๋งž์ง€ ์•Š๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿฐ๊ฒƒ๋“ค์€ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ข‹์„๊ฒƒ๊ฐ™๋‹ค.

์•„์ง ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜์œผ๋‹ˆ ๊ณ„์† ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋‹ค์‹œ ๋˜ ๋‹ค๋ฅธ ๋Š๋‚Œ์œผ๋กœ ํšŒ๊ณ ?๊ธ€์„ ์ž‘์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์ด ๋˜ ๋ฐœ์ƒํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๐Ÿ™„


์ฐธ๊ณ 

https://tanstack.com/query/v3/

https://tech.kakao.com/2022/06/13/react-query/

https://www.youtube.com/watch?v=41tFNtwWE3o 

https://tech.kakaopay.com/post/react-query-1/#redux-%EC%9D%B4%EA%B1%B4-%EB%B6%88%ED%8E%B8%ED%96%88%EB%8B%A4

 

728x90