๋ฌธ์ ์ํฉNext.js๋ฅผ ์ฌ์ฉํด ์บ๋ฆฐ๋ ํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋ ์ค,Supabase ํต์ ์ค ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ํ์ด์ง ๋ผ์ฐํฐ ์ธ๊ทธ๋จผํธ ๋ด์ error.tsx๋ก ํตํฉํด์ ์ฒ๋ฆฌํ๋ ค ํ๋ค.ํ์ง๋ง ์๋ฌ๋ฅผ ๋์ง ๋ ๋ด๊ฐ ์ง์ ํ ๋ฉ์์ง์ ๋ฐํ์ ์ค ๋ฐ์ํ๋ ์์คํ ๋ฉ์์ง๊ฐ ์์ฌ ๋์ค๋ ๋ฌธ์ ๊ฐ ์์๋ค.๋ํ, app/api/**/route.ts (๋ผ์ฐํธ ํธ๋ค๋ฌ)supabase ํธ์ถ ํจ์(fetch)ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ (page.tsx)ํ ์คํ ์ฟผ๋ฆฌ(useQuery)์ด๋ ๊ฒ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ๊ฑฐ์น๋ฉด์ ์๋ฌ ํ๋ฆ์ ๊น๋ํ๊ฒ ์ก๋ ๊ฒ๋ ๊ณ ๋ฏผ์ด ํ์ํ๋ค. ์ต์ข ์ ์ธ ์๋ฌ ํ๋ฆ์ ์๋์ ๊ฐ๋ค.๋ผ์ฐํธ ํธ๋ค๋ฌ์ฑ๊ณตor์๋ฌ๋ฅผ ๊ฐ์ฒด ํํ๋ก ๋ฐ์์ return ๐๐ป ํ์ด์ง์์ ์๋ฌ ๊ฐ์ฒด๋ฅผ ์ก์์ throw ๐๐ป error.tsx ์ก์ ๋๋ณด๊ธฐimpo..
์ง๋ ๊ฐ์ธ ๊ณผ์ ๋ถํฐ ๋๋ฌด ํท๊ฐ๋ฆฌ๋ ๋ผ์ฐํธ ํธ๋ค๋ฌ, ์๋ฒ ์ก์ ๋๋ณด๊ธฐ[๊ธฐ์กด ์ง์]๋ผ์ฐํธ ํธ๋ค๋ฌ๋ ์ฃผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ฉฐ GET, POST ๋ฑ์ ์ด์ฉํด์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ,๋์ ๋ก์ปฌํธ์คํธ ์๋ฒ๋ก ์๋ต์ ์ค๋ค. ์๋ฒ ์ก์ ์ ์ฃผ๋ก ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ฉฐ ๋น๋๊ธฐ ํจ์๋ฅผ ํตํด ์์ฒญํ๊ณ ์๋ต์ ๋ฐ๋๋ค.์ ๋๋ก ์๊ณ ์์๋ค. ๋์ ์ฐจ์ด์ ์ ์๋ต์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ์๋ค๊ณ ์๊ฐํ๋ค.๋ผ์ฐํธ ํธ๋ค๋ฌ : ํธ๋ค๋ฌ -> ๋ด ์๋ฒ ํจ์ -> ์ค์ ์ฌ์ฉ์๋ฒ ์ก์ : ํจ์ -> ์ค์ ์ฌ์ฉ๋์ ํน์ง์ ํ์คํ ๋น๊ตํด๋ณด๊ณ ์ ํ๋ค.Route Handler// app/api/hello/route.tsimport { NextResponse } from "next/server";// 1. GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌexport ..
Tanstack Query + Context API + Zustand๋ก ์ ์ญ ์ํ ๊ด๋ฆฌํ๊ธฐ *Context API : ์ํ๋ฅผ ์ ์ญ์ผ๋ก ๊ณต์ 4์ฃผ์ฐจ ์์ ๐ค Tanstack Query + Zustand ์ ๊ฐ์ด ์ธ๊น?ํ ์คํ์ ์๋ฒ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์บ์ฑํ๋ค.์ฃผ์คํ ์ค๋ ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐํธํ๊ฒ ํ ์ ์๋ค.๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด, ์๋ฒ ์ํ๋ฅผ ํด๋ผ์ด์ธํธ ์ํ๋ก ๋๊ธฐํํ๋ ํจํด์ ๋ง๋ค ์ ์๋ค. ์์ ์ํ ๋จ๊ณ 1. RQProvider.tsx ์์ ์๋ฒ/๋ธ๋ผ์ฐ์ ๊ฐ๊ฐ ์๋ก์ด ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํธ ์์ฑ๋๋ณด๊ธฐ"use client";import { isServer, QueryClient, QueryClientProvider,} from "@tanstack/react-query";function makeQue..
Next.js๋ ์น์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์น ์๋ฒ๋ฅผ ์คํํ ์ ์๋ ํ๋ ์์ํฌ์ด๋ค.๊ทธ๋ ๋ค๋ฉด Next์์์ '์น ์๋ฒ'๋ ๋ฌด์์ผ๊น? React์ ์น ์๋ฒ์ ์ญํ ์ ๋น๋ ์์ ์ ๋น html(id๊ฐ root์ธ ๋น divํ๊ทธ)๊ณผ JS ๋ฒ๋ค ํ์ผ์ ์ ๊ณตํ๋ค.๊ทธ๊ฒ์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์์ JS๋ฅผ ํด์ํ์ฌ ๋น ํ๊ทธ์ JS ํ์ผ๋ค์ ๋ฐ๊ฟ ๋ผ์ฐ๋ ํ์์ผ๋ก ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ค.๋ธ๋ผ์ฐ์ ๋ ๋น html์ ๋ฐ์๊ธฐ ๋๋ฌธ์ JS๋ฅผ ์ธ์ํ ๋๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆด ์ ๋ฐ์ ์๋ค. ์ฆ, TTV๊ฐ ๊ธธ๋ค.ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR)์ด ๋ฐ๋ก ์ด๋ฌํ ๋ฐฉ์์ด๋ค. Next.js์ ์น ์๋ฒ์ ์ญํ ์ ๋น๋ ์์ (SSG)๊ณผ ์์ฒญ ์์ (SSR)์ HTML์ ์์ฑํ๊ณ API ๋ผ์ฐํธ๋ฅผ ํตํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.๋๋์๋ฉด html์ ํ๋ก ํธ์๋, API๋ฅผ ์ ๊ณตํ๋ ๊ฑด ..
Next.js๋ฅผ ํ์ฉํ ๊ฐ์ธ ๊ณผ์ ๋ฅผ Vercel์์ ๋ฐฐํฌํด๋ณด์๋ค.๋ถ๋ช ๊ฐ๋ฐ ๋ชจ๋์์๋ ์๋ฌด ๋ฌธ์ ์์ด ์๋ํ๋ ํ๋ก์ ํธ๊ฐ ๋น๋ ๊ณผ์ ์์ ๋ง์ ์ค๋ฅ๋ฅผ ๋ฑ์ด๋๋ค. ์ฌ๋ฌ ์์ธ์ด ์์๊ณ ํ์ผ ๋ช ์ด ๋์์์ง๋ง, ์๋ฌ์ ์ต์ข ํ์ด์ง(?)๋ง ๋ํ๋์์๊ธฐ ๋๋ฌธ์์ ํํ ์ด๋ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฑด์ง ํ์ ํ๊ธฐ ์ด๋ ค์ ๋ค. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฌ ์ฒ๋ฆฌ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ useQuery๋ฅผ ํตํด ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์์๋ค.๋ํ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ผ์ฐํฐ ํธ๋ค๋ฌ์์๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์์๋ค.๋๋ณด๊ธฐ// rotation > page.tsx...export default function Rotationpage() { const { data: imgUrl, isPending, isError, error } = getIm..
Tanstack Query ๐Tanstack : ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌํ ์คํ์ useQuery ๊ฐ์ ํ ์ ์ฌ์ฉํด์ผ ํ๋ค.๋๋ฌธ์ Provider ์ปดํฌ๋ํธ๋ ๋ฐ๋์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ด๋ค.QueryClientProvider๋ React Context๋ฅผ ์ฌ์ฉํด์ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌReact์ Context API๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ต์๋จ(root layout)์ ์ ์ฉ๐คํด๋ผ์ด์ธํธ ์ฌ์ด๋์์๋ง ์ ์ฉ์ํค๋๋ฐ ์ ์ ์ญ์ ์ ์ฉํด์ผ ํ ๊น?ํ์ด์ง ์ด๋ ์ ํด๋ผ์ด์ธํธ ์ํ๊ฐ ์ด๊ธฐํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ์์ ์บ์ฑ๋ชจ๋ ํ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ๋์ผํ QueryClient ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๐์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด..
๋ก๋ฉ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ํ์ด์ง๋ก ์ด๋์ ํ๋ค๊ณ ํด๋ณด์. ์์์์ ๋ณผ ์ ์๋ฏ์ด ํ์ด์ง๊ฐ ๋ชจ๋ ๊ทธ๋ ค์ง ๋๊น์ง ๋์ด๊ฐ์ง ์๊ณ ์คํผ๋๊ฐ ๋๊ฒ ๋๋ค.์ด๋ฅผ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ [ํด๋ผ์ด์ธํธ ์ฌ์ด๋] ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์์ ๋น๋๊ธฐ๋ฅผ ๋งํ๋ ๊ฒ์ด ์๋ํ์ด์ง๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์์ด์ ๋น๋๊ธฐ ํ์์ ๋งํ๋ค. isLoading ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋์ 'Loading...' ์ ํ์ํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด UI๋ฅผ ์ ๋ฐ์ดํธํ๋ค.๋๋ณด๊ธฐ๋๋ณด๊ธฐ'use client';import React, { useState, useEffect } from 'react';import { Product } from '@/types';const HomePage = () => { ..
์ฐ๋ฆฌ๊ฐ ํ์์ ์ฐ๋ ๊ฐ๋ฐ ๋ชจ๋๋ yarn dev๋ฅผ ํ์ ๋, ๋ธ๋ผ์ฐ์ ์ ‘๊ฐ๋ฐ์๋๊ตฌ’์์ ์ฝ์์ ํ์ธํ ์ ์์๋ค.yarn build๋ฅผ ํ๊ฒ ๋๋ฉด ์ค์ ๋ฐฐํฌ์์ ์ฌ์ฉ๋๋ ํ๋ก๋์ ๋ชจ๋๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค๋ฐ๋ผ์ (ํนํ react)๋ ๊ฐ๋ฐ์๋๊ตฌ์์ ๋ณด๋ ํ๊ทธ๋ ๋ค๋ฅธ ํํ๊ฐ ์๋ ์ผ๊ทธ๋ฌ์ง ํํ๊ฐ ๋๋ ๊ฒ์ด๋ค.react๋ html์์๊ฐ ๊ฑฐ์ ์์ผ๋ฉฐ JS๋ฅผ ํตํด ํ๋ฉด์ ๊ทธ๋ ค๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. build๋ฅผ ํ๊ฒ ๋๋ฉด ๋น๋ ์์ ์์์ ๋ก์ง์ด ํ๋ก๋์ ๋ชจ๋๋ก ์์ฑ๋๋ค. SSG (Static Site Generation)SSG๋ ์ต์ด ๋น๋ ์์ ์ํ๋ฅผ ์บ์ฑํด๋์๋ค๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ๊ณ ์ ๋ HTML์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ ํ๋ฉด์ ๋ฟ๋ ค์ค๋ค.์ด๋ฏธ ์๋ฒ ์ธก์์ HTML์ ๋น๋ํด๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ์ ๋ง ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ค..
ํ์ ์คํฌ๋ฆฝํธ์์ ํ์ ์ ์ ์ธํ๋ ๋ฐฉ์์ธ interface์ type. interface๋ ์ฌ๋ฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.ํ์ง๋ง ์ํ์์๊ฐ ์์ผ๋ฉฐ ์์ฃผ ์ฐ์ด์ง๋ ์๋ ๋ฏ ํ๋ค.interface Todo { id: string; title: string; completed: boolean;};interface Todo { timestamp: number;}; ์์ ๊ฐ์ด interface๋ ์ฌ๋ฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.์ด๋ฐ ์์ผ๋ก ํ ๋นํ๊ฒ ๋๋ฉด ๊ฒฐ๊ตญ Todo์๋ 4๊ฐ์ ํ์ ์ด ๊ฐ๋ฅํ๋ค. ํ์ธ์ ์๋ ์ฌ์ง์์ ๋ณผ ์ ์๋ฏ์ด todo. ์ ์ฐ์ผ๋ฉด ๋ด๋ถ ํ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ฉฐ timestamp ํ์ ์ ํฌํจํ๊ณ ์๋ค. ๋ค๋ง, ์ด๋ ๊ฒ ์ฐ์ธ๋ค๋ฉด Todo ์์ฒด์ ํ์ ์ด ๋ณํ๊ฒ ๋๋ค.์ฆ, ์ฒ์ ํ ๋นํ {id, title, comp..
TodoList์ ๋ํ ์ผ ํ์ด์ง์ ํํ์ด์ง๋ฅผ ์ค๊ฐ๋ฉด์ ํ ์คํธํ staleTime ๊ณผ gcTimeHomeDetail invalidateQuerise - ์ฟผ๋ฆฌ ๋ฌดํจํ// Detail.jsx const { id } = useParams(); const fetchDetail = async () => { const response = await todoApi(`/todos/${id}`); return response.data; }; const { data, isLoading, error } = useQuery({ queryKey: ["todos", id], queryFn: fetchDetail, }); ํ -> ๋ํ ์ผ ํ์ด์ง๋ก ๋ค์ด๊ฐ๋ฉด params๋ก id๋ฅผ ์์ฒญํ์ฌ ํด๋น tod..