๐Ÿ”ฅNext.js middleware, Tanstack-query staleTime, ๋””๋ฐ”์šด์Šค๋ฅผ ์ด์šฉํ•œ API ํ˜ธ์ถœ ์ตœ์ ํ™”

๋ฐ•๋ฏผ์šฐยท2023๋…„ 12์›” 12์ผ
1

๐Ÿ”ฅ์˜ฌํ•ด๋„ ์•„์ขŒ์ขŒ

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

์˜ฌํ•ด๋„ ์•„์ขŒ์ขŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์„œ๋น„์Šค ๋‚ด API ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ๊ทธ ๊ณผ์ •์„ ๋‹ด์€ ๊ธ€์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ API ํ˜ธ์ถœ ์ตœ์ ํ™”์˜ ํ•„์š”์„ฑ

์˜ฌํ•ด๋„ ์•„์ขŒ์ขŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋ถ€ํ„ฐ, ์ €ํฌ ํŒ€์˜ ๋ชฉํ‘œ๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊พธ์ค€ํ•œ ๋„๋ฉ”์ธ ๋ถ„์„๊ณผ ์‚ฌ์šฉ์ž๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „์‹œ์ผœ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๋ฅผ ์‹ค์ œ๋กœ ์˜จ๋ผ์ธ ์ƒ์— ๋ฐฐํฌํ•  ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งŽ์€ API ํ˜ธ์ถœ์€ ๊ณง ๋น„์šฉ์„ ์˜๋ฏธํ–ˆ๊ณ , ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•…์˜์ ์œผ๋กœ ๋งŽ์€ ์–‘์˜ API ํ˜ธ์ถœ์„ ํ•˜๊ฑฐ๋‚˜ ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š์€ API๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ƒํ™ฉ์€ ์ตœ๋Œ€ํ•œ ๋ฐฉ์ง€ํ•˜์ž๋Š” ๋งˆ์Œ ๊ฐ€์ง์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ API ํ˜ธ์ถœ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. Next.js middleware ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

  2. Tanstack-query์˜ staleTime ์„ค์ • ๋ฐ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”

  3. ํ† ๊ธ€ ๋ฒ„ํŠผ์— ๋””๋ฐ”์šด์Šค ์ฒ˜๋ฆฌ ์ ์šฉ


๐Ÿ“Œ Next.js middleware ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

์ €ํฌ ์„œ๋น„์Šค์—๋Š” ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ณ„ํš ํŽ˜์ด์ง€, ๊ณ„ํš ์ž‘์„ฑ ํŽ˜์ด์ง€, ๋งˆ์ด ํŽ˜์ด์ง€๊ฐ€ ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์œ ์ €๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ, ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜๊ธฐ ์ „ nextjs middleware์—์„œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•ด ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ์ผœ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

middleware๋ž€?

์œ ์ €๊ฐ€ ๋ณด๋‚ธ request์™€ ์ด์— ๋Œ€ํ•œ response ์‚ฌ์ด์— ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „ ๊ทธ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„ ์›ํ•˜๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„ ์ธก์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ rewriting, redirecting ๋“ฑ์„ ํ†ตํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ, ์œ ์ €์—๊ฒŒ ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜๊ธฐ ์ด์ „์— middleware์—์„œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•ด ๋ถˆํ•„์š”ํ•œ ํŽ˜์ด์ง€ ์‘๋‹ต ๋ฐ API ํ˜ธ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ์€ ์‹ค์ œ middleware ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

middleware.ts

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  const cookies = request.cookies; // 1๋ฒˆ 
  const hasAuthCookies = cookies.has('auth'); // 2๋ฒˆ

  if (request.nextUrl.pathname === '/') {
    if (hasAuthCookies) {
      return NextResponse.redirect(new URL('/home', request.url));
    }
    return NextResponse.redirect(new URL('/login', request.url));
  } else if (request.nextUrl.pathname === '/home')  // 3๋ฒˆ
    if (!hasAuthCookies) {
      return NextResponse.redirect(new URL('/login', request.url));
    }
  } else if (request.nextUrl.pathname === '/login') {
    if (hasAuthCookies) {
      return NextResponse.redirect(new URL('/home', request.url));
    }
  }
 
  ...
  1. ํŽ˜์ด์ง€ ์š”์ฒญ์— ๋‹ด๊ฒจ์žˆ๋Š” cookies์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  2. cookies์— auth๋ผ๋Š” key์— ๋Œ€ํ•œ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ hasAuthCookies๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ๋Š” ์œ ์ €์˜ ์š”์ฒญ์ด๋ผ๋ฉด auth๋ผ๋Š” key์— ๋Œ€ํ•ด ํ† ํฐ data๊ฐ€ ๊ฐ’์œผ๋กœ ๋“ค์–ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ๊ณ„ํš ํŽ˜์ด์ง€(/home)์— ์ ‘๊ทผํ–ˆ์„ ๊ฒฝ์šฐ, ๋งŒ์•ฝ ๋กœ๊ทธ์ธ๋˜์ง€ ์•Š์€ ์œ ์ €๋ผ๋ฉด๋กœ๊ทธ์ธ ํŽ˜์ด์ง€(/login)๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ต๋‹ˆ๋‹ค.

๐Ÿ“Œ Tanstack-Query staleTime ์„ค์ • ๋ฐ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”

data๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค data๋ฅผ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Tanstack-Query์˜ staleTime๊ณผ ์ฟผ๋ฆฌ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

  1. data๋ฅผ ๋ฐ›์•„์˜ค๋Š” get ์š”์ฒญ๋“ค์— ๋Œ€ํ•œ useQuery์˜ ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. data๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ์ด ์—†๋Š” get ์š”์ฒญ๋“ค์— ๋Œ€ํ•œ useQuery์˜ staleTime์„ infinity๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. data๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” useMutation ์š”์ฒญ์ด ์‹คํ–‰๋์„ ๋•Œ, ๊ฐ data์— ํ•ด๋‹นํ•˜๋Š” ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ฟผ๋ฆฌ ํ‚ค๊ฐ€ ๋ฌดํšจํ™”๋œ useQuery์— ํ•ด๋‹นํ•˜๋Š” data๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

data๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” useMutation ํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ ๋  ๋•Œ, ์–ด๋–ค get ์š”์ฒญ์„ ๋ฌดํšจํ™”์‹œ์ผœ์ค˜์•ผ ํ•˜๋Š”์ง€, get ์š”์ฒญ์— ํ•ด๋‹น๋˜๋Š” ์ฟผ๋ฆฌ ํ‚ค๋Š” ๋ฌด์—‡์ธ์ง€ ํŒ€ ๊ธฐ์ˆ  ๋ฌธ์„œ์— ํ‘œ๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด data๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์š”์ฒญ๊ณผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์š”์ฒญ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํ†ตํ•ด, ํŠน์ • data์— ์ ‘๊ทผ ์‹œ ๋ฌด์กฐ๊ฑด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ data๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, data๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜์—ˆ์„ ๋•Œ๋งŒ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด data๋ฅผ ๋ฐ›์•„์˜ด์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.


์˜ˆ์‹œ - ๋‚ด ๊ณ„ํš ํŽ˜์ด์ง€

์œ„์˜ ๊ณผ์ •์„ ์‹ค์ œ๋กœ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„ ํŽ˜์ด์ง€๋Š” ๋‚ด ๊ณ„ํš ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋ณธ์ธ์ด ์ƒ์„ฑํ•œ ๊ณ„ํš๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, ์ด data๋Š” ๋ณธ์ธ์ด ๊ณ„ํš์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, staleTime์„ ๊ธฐ๋ณธ์ ์œผ๋กœ infinity๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ , ๊ณ„ํš ์ƒ์„ฑ API์™€ ๊ณ„ํš ์‚ญ์ œ API๊ฐ€ ํ˜ธ์ถœ๋  ๊ฒฝ์šฐ์—๋งŒ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด ๊ณ„ํš์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” get ์š”์ฒญ์— ๋Œ€ํ•œ useQuery์˜ staleTime์„ infinity๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    export const useGetMyPlansQuery = () => {
      const { data } = useSuspenseQuery({
        queryKey: [QUERY_KEY.MY_PLANS],
        queryFn: getMyPlans,
        staleTime: Infinity,
      });
        
      return { myPlans: data! };
    };
  2. ๊ณ„ํš์„ ์ƒ์„ฑํ–ˆ์„ ๋•Œ, ์ฆ‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•˜๋Š” mutation ํ•จ์ˆ˜์˜ ์š”์ฒญ์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ, ๊ณ„ํš์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” query๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

    export const usePostNewPlanMutation = () => {
      const queryClient = useQueryClient
    
      return useMutation({
        mutationFn: postNewPlan,
        onSuccess: () => {
          queryClient.invalidateQueries({
            queryKey: [QUERY_KEY.MY_PLANS],
          });
        },
      });
    };
    queryClient.invalidateQueries({
      queryKey: [QUERY_KEY.MY_PLANS],
    });

    ์ด ๋ถ€๋ถ„์—์„œ ์ฟผ๋ฆฌํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ์ฟผ๋ฆฌ๋งŒ ๋ฌดํšจํ™”์‹œ์ผœ์ฃผ์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์ด๋ฅผ ํ†ตํ•ด ๋‚ด ๊ณ„ํš data๋ฅผ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚ด ๊ณ„ํš data๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ƒํ™ฉ์ธ ๊ณ„ํš ์ƒ์„ฑ๊ณผ ๊ณ„ํš ์‚ญ์ œ์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋งŒ ์ƒˆ๋กœ ์„œ๋ฒ„์—์„œ data๋ฅผ ๋ฐ›์•„์™”์Šต๋‹ˆ๋‹ค.

Tanstack-query์˜ staleTime ๋ฐ ์ฟผ๋ฆฌ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ๋ฐ ์›๋ฆฌ๋Š” ๋”ฐ๋กœ TanStack-query staleTime & invalidQueries๋ฅผ ์ด์šฉํ•œ data ์ƒํƒœ๊ด€๋ฆฌ์— ์ƒ์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ํ† ๊ธ€ ๋ฒ„ํŠผ์— ๋””๋ฐ”์šด์Šค ์ฒ˜๋ฆฌ ์ ์šฉ

์ €ํฌ ์„œ๋น„์Šค์—๋Š” ๊ณ„ํš ๊ณต๊ฐœ ์—ฌ๋ถ€, ์•Œ๋ฆผ ์—ฌ๋ถ€ ๋“ฑ์˜ ์ƒํƒœ๋ฅผ toggle ํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€ ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๊ฐ์‹ธ์ ธ์žˆ๋Š” ๋ฒ„ํŠผ๋“ค์ด ๋ชจ๋‘ ํ† ๊ธ€ ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ† ๊ธ€ ๋ฒ„ํŠผ์˜ ํŠน์„ฑ ์ƒ, ์œ ์ €๋Š” ๋ฒ„ํŠผ์„ ์—ฐ์†์œผ๋กœ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ ์ €๊ฐ€ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฒ„ํŠผ์„ ๊ต‰์žฅํžˆ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆ„๋ฅธ๋‹ค๋ฉด ์ด๋Š” ๊ทธ ํšŸ์ˆ˜ ๋งŒํผ์˜ API ํ˜ธ์ถœ์„ ์˜๋ฏธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” API ํ˜ธ์ถœ์— ๋Œ€ํ•ด ๋””๋ฐ”์šด์Šค๋ฅผ ์ ์šฉํ•ด ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฐ”์šด์Šค๋ž€ ?

์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํŠน์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

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


๐Ÿ“Œ ๊ฒฐ๋ก 

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

  1. Next.js middleware ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ํŽ˜์ด์ง€ ์š”์ฒญ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

  2. Tanstack-query์˜ staleTime ์„ค์ • ๋ฐ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”

  3. ํ† ๊ธ€ ๋ฒ„ํŠผ์— ๋””๋ฐ”์šด์Šค ์ฒ˜๋ฆฌ ์ ์šฉ

์•ž์œผ๋กœ๋„ API ํ˜ธ์ถœ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๊ณ , ํ˜„์žฌ ์ €ํฌ ์„œ๋น„์Šค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค๋ฉด ์ ์šฉํ•˜๊ณ  ๋˜ ๊ธ€๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

profile
๊พธ์ค€ํžˆ, ๊นŠ๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€