๐Ÿ’ป DEV/React-Query

[ReactQuery] (1) ReactQuery ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Rising Oneโ˜… 2025. 3. 15. 21:53
728x90
๋ฐ˜์‘ํ˜•
SMALL

Tanstack (ReactQuery) ๋Œ€ํ‘œ์ด๋ฏธ์ง€

 

 

 

์ ‘๊ทผ (์š”์•ฝ)

reactQuery์˜ ๊ฐœ์š”๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

 

  1. Client State vs Server State

1. Client State 
- ์›น ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด ์˜๋ฏธ (๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ)
  (ex_ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋ฐ์€/์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•˜๋Š” ๋“ฑ์˜ ์„œ๋ฒ„์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ๊ณผ๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋Š” ๊ฒƒ)

2. Server State
- ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์— ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
  (ex_๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ)
- ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๊ธฐ์— ์„œ๋ฒ„์— ์ €์žฅ๋จ

 

  2. React Query ํŠน์ง•

1. React Query๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์บ์‹œ๋ฅผ ๊ด€๋ฆฌ

 

React CodeReact Query CacheServer

 

- React ์ฝ”๋“œ์— ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, Fetch๋‚˜ Axios๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  React Query ์บ์‹œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
- React Query์˜ ์—ญํ• ์€ React Query ํด๋ผ์ด์–ธํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ ํ•ด๋‹น ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ

2. ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ React Query์ด์ง€๋งŒ ์„œ๋ฒ„์˜ ์ƒˆ ๋ฐ์ดํ„ฐ๋กœ ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ๋ชซ
```
[React Query ์บ์‹œ ์˜ˆ์‹œ]

key: ['blog-posts']
data: [
    {
        title: 'React Query',
        tagLine: 'What is this thing?'
    },
    {
        title: 'React Query Mutation',
        tagLine: 'Not just For ninja tutles',
    }
]
```
- ์œ„ ์บ์‹œ์—๋Š” 'blog-posts'๋ผ๋Š” ํ‚ค(key)๋ฅผ ํ• ๋‹นํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Œ => ์ด๊ฒƒ์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์‹๋ณ„๋˜๋Š” ๋ฐฉ์‹
- ํด๋ผ์ด์–ธํŠธ ์บ์‹œ์— ์žˆ๋Š” ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ!

(1). ๋ช…๋ นํ˜•(imperatively) : invalidate data
- ์ฟผ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ณ 
- ์บ์‹œ์— ๊ต์ฒดํ•  ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ์ง€์‹œํ•˜๋Š” ๊ฒƒ
```
[React Query ์บ์‹œ ์˜ˆ์‹œ]

key: ['blog-posts']
data: [
    {
        title: 'React Query',
        tagLine: 'It is so great!!'
    },
    {
        title: 'React Query Mutation',
        tagLine: 'Not just For ninja tutles',
    }
]
```

(2). ์„ ์–ธํ˜•(declaratively) : configure how (ex_window focus) & when to trigger a re-fetch
- ๋ฆฌํŒจ์น˜(Refetch)๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ
- staleTime: 30 seconds ์ฒ˜๋Ÿผ ์–ธ์ œ ํŠธ๋ฆฌ๊ฑฐ ํ• ์ง€๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
```
[React Query ์บ์‹œ ์˜ˆ์‹œ]

key: ['blog-posts']
data: [
    {
        title: 'React Query',
        tagLine: 'What is this thing?'
    },
    {
        title: 'React Query Mutation',
        tagLine: 'Not just For ninja tutles',
    }
]
staleTime: 30 seconds
```

3. React Query์—๋Š” ์„œ๋ฒ„์ƒํƒœ ๊ด€๋ฆฌ ๋ฟ ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋„์›€์ด ๋˜๋Š” ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต
   (1). Loading & Error (states)
   - ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฟผ๋ฆฌ์˜ ๋กœ๋”ฉ ๋ฐ ์˜ค๋ฅ˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™ ํ•„์š” X


   (2). Pagination (ํŽ˜์ด์ง€ ๋งค๊น€) & infinite scroll (๋ฌดํ•œ ์Šคํฌ๋กค)
   - ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ํŽ˜์ด์ง•์ด๋‚˜ ๋ฌดํ•œ์Šคํฌ๋กค์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฐ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋„ ์ œ๊ณต


   (3). Prefetching (=> ์‹œ๊ฐ„ ๋‹จ์ถ•)
   - ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€์„œ ์บ์‹œ์— ๋„ฃ์œผ๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ data๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์•ฑ์ด ์บ์‹œ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”X


   (4). Mutations 
   - ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ด(Mutation)๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„


   (5). De-duplication of requests 
   - ์ฟผ๋ฆฌ๋Š” ํ‚ค๋กœ ์‹๋ณ„๋˜๊ธฐ ๋•Œ๋ฌธ์— React Query๋Š” ์š”์ฒญ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  
   - ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, 
   - React Query๋Š” ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ
   - ๊ธฐ์กด ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ€๋Š” ๋™์•ˆ, ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, React Query๋Š” ์ค‘๋ณต ์š”์ฒญ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ


   (6). Retry on error
   - ์„œ๋ฒ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์žฌ์‹œ๋„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ


   (7). CallBacks 
   - ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„ ๋•Œ๋ฅผ ๊ตฌ๋ณ„ํ•ด์„œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝœ๋ฐฑ ์ „๋‹ฌ๊ฐ€๋Šฅ
   

728x90
๋ฐ˜์‘ํ˜•
LIST