<aside> ๐Ÿ“Œ

</aside>

๐Ÿค” Tanstack Query๊ฐ€ ์™œ ํ•„์š”ํ•˜์ฃ ?

์‚ฌ์‹ค ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ์ฑ„ํŒ…์ด๊ธฐ ๋•Œ๋ฌธ์— tanstack query์˜ ๋„์ž…์ด ํ•„์ˆ˜์ ์ด์ง€๋Š” ์•Š๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๊ธฐ์กด์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํƒœ์–ด๋‚œ Tanstack Query๋Š” โ€œ์–ด๋–ค ๊ฒƒ์ผ๊นŒ?โ€, โ€œ์–ด๋–ค ์žฅ์ ์ด ์žˆ์„๊นŒ?โ€๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉฐ ์•Œ์•„๋ณด๋ ค๊ณ  ๋„์ž…ํ–ˆ๋‹ค.

๐ŸŽฏ ๊ธฐ๋Œ€ ํšจ๊ณผ

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ์บ์‹ฑ

์‹œ์ฒญ ์‹œ ๋ฐฉ์†ก์ž ์ •๋ณด, ํ”„๋กœํ•„ ๋“ฑ์—์„œ API ์š”์ฒญ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ์ž˜ ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์„ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

2๏ธโƒฃ useInfiniteQuery์™€ react-intersection-observer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ฌดํ•œ ์Šคํฌ๋กค ๋กœ์ง ๊ฐœ์„ 

ํ˜„์žฌ ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ๋Š” ๋ฐฉ์†ก ์ค‘์ธ ๋ชฉ๋ก์„ ๋ฌดํ•œ ์Šคํฌ๋กค๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์— useInfiniteQuery์™€ react-intersection-observer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€๋œ๋‹ค.

๐Ÿงฐ Tanstack Query ๋„์ž… ๊ณผ์ •

1๏ธโƒฃ Tanstack Query ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ

  1. Tanstack Query์™€ dev tools ์„ค์น˜

    pnpm add @tanstack/react-query @tanstack/react-query-devtools
    
  2. ESLint Plugin Query ์„ค์น˜

    pnpm add -D @tanstack/eslint-plugin-query
    

    .eslintrc์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€

    {
    	"plugins":["@tanstack/query"],
    	"extends": ["plugin:@tanstack/query/recommended"],
    	"rules": {
        "@tanstack/query/exhaustive-deps": "error",
        "@tanstack/query/stable-query-client": "error",	
    	}
    }
    
  3. react-intersection-observer ์„ค์น˜

    pnpm add react-intersection-observer
    

    ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•  ๋•Œ useIntersect๋ผ๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์„œ ๋ทฐํฌํŠธ ๋‚ด๋กœ ์ฐธ์กฐ๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด์™”๋Š”์ง€ ํ™•์ธํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ react-intersection-observer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ useInView ํ›…์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ์„ค์น˜ํ–ˆ๋‹ค.

2๏ธโƒฃ Tanstack Query ์ดˆ๊ธฐ ์„ค์ •ํ•˜๊ธฐ

๋‹ค ์„ค์น˜๋ฅผ ํ–ˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ์ ์šฉ๋  ๋ฒ”์œ„๋ฅผ <QueryClientProvider>๋กœ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค. ํ˜„์žฌ ๋ฃจํŠธ ์š”์†Œ์™€ ๋ผ์šฐํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

// main.tsx

import { createRoot } from 'react-dom/client';
import './index.css';
import { RouterProvider } from 'react-router-dom';
import { router } from '@/app/routes';

createRoot(document.getElementById('root')!).render(<RouterProvider router={router} />);
export const router = createBrowserRouter(
  [
    {
      path: '/',
      element: <Layout />,
      children: [
			  // ...
      ],
    },
    {
      path: 'broadcast',
      element: <ProtectedRoute />,
      children: [
        {
          path: '',
          element: (
            <Suspense fallback={<LoadingCharacter />}>
              <BroadcastPage />
            </Suspense>
          ),
        },
      ],
    },
  ],
  routerOptions,
);

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ๋ผ์šฐํ„ฐ์— ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณตํ†ต์œผ๋กœ ๊ฐ์‹ธ๋Š” ์š”์†Œ๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ app ๋ ˆ์ด์–ด์— App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

App.tsx