๐Ÿ“ƒ Front-End

๐Ÿ“ƒ Front-End/React.js

React Query - ๋ณ€์ด(Mutation)

๋ณ€์ด๋Š” ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ์‹ค์‹œ ํ•ฉ๋‹ˆ๋‹ค. ex) ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์‚ญ์ œ ๋˜๋Š” ๋ณ€๊ฒฝ ๋“ฑ โœ” useMutation ํŠน์ง• ์ผ๋ถ€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  useQuery ์™€ ์ƒ๋‹นํžˆ ์œ ์‚ฌ ํ•ฉ๋‹ˆ๋‹ค. mutate ํ•จ์ˆ˜ ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด ํ•จ์ˆ˜๋Š”, ์‚ฌ์šฉ์ž์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ† ๋Œ€๋กœ ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฟผ๋ฆฌ ํ‚ค๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. isLoading ์€ ์กด์žฌ ํ•˜์ง€๋งŒ, isFetching ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€์ด์— ๊ด€๋ จ๋œ ์บ์‹œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ์žฌ์‹œ๋„ ๋˜ํ•œ ๊ธฐ๋ณธ๊ฐ’ ์ž…๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ : Mutations ์ ์šฉ ๋”๋ฏธ API ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋ณ€์ด๋ฅผ ์ ์šฉ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋ณ€์ด๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋Œ€ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ด..

๐Ÿ“ƒ Front-End/React.js

React Query - isFetching VS. isLoading

isFetching ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ํ•ด๋‹น ํ•ฉ๋‹ˆ๋‹ค. ( ์•„์ง ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘ ) isLoading isFetching์ด ์ง„ํ–‰ ์ค‘์ด๊ณ , ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, isLoading ์ƒํƒœ์ด๋ฉด isFetching ๋˜ํ•œ ์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. ( ๋™์‹œ์— true ) isLoading ์€ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ƒํ™ฉ์— ํ•ด๋‹นํ•˜๋Š” isFetching ์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ const {data, isLoading, isError, error} = useQuery(['posts', currentPage], () => fetchPosts(currentPage), {staleTime : 2000, keepPreviousData : true}..

๐Ÿ“ƒ Front-End/React.js

React Query - ๋ฐ์ดํ„ฐ ํ”„๋ฆฌํŒจ์นญ(Pre-fetching)

ํŽ˜์ด์ง€ ๋งค๊น€(Pagination)์„ ๊ตฌํ˜„ํ•œ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์บ์‹œ์— ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Next Page ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋˜๊ธธ ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€ ์บ์‹œ์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Prefetching โ“ ํ”„๋ฆฌํŒจ์นญ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ถ”๊ฐ€ํ•˜๋ฉฐ , ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งŒ๋ฃŒ(stale) ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ๋งŒ๋ฃŒ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘์—๋Š” ์บ์‹œ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์บ์‹œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ผ ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ถ”ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋ฒ•ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ํ”„๋ฆฌํŒจ์นญ์„ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋งค๊น€, ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ..

๐Ÿ“ƒ Front-End/React.js

React Query - ํŽ˜์ด์ง€ ๋งค๊น€(Pagination)

ํ˜„์žฌ ํŽ˜์ด์ง€(current Page) ์ƒํƒœ๋ฅผ ํ†ตํ•ด, ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํŽ˜์ด์ง€ ๋งค๊น€ ๋ฐฉ๋ฒ• ๋Œ“๊ธ€์—์„œ ์ž‘์—…ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ํ‚ค ๊ฐ€ ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๋ฐฐ์—ด ๋กœ ์—…๋ฐ์ดํŠธํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ, ๋˜๋Š” ์ด์ „ ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด currentPage ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ React Query ๊ฐ€ ๋ฐ”๋€ ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ƒˆ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. โœ” Posts.js import React, { useState } from "react"; import { useQuery } from "react-query"; import { PostDetail } from "./PostDetail"; const ma..

๐Ÿ“ƒ Front-End/React.js

React Query - ์ฟผ๋ฆฌ ํ‚ค

โœ” Posts.js import React, { useState } from "react"; import { useQuery } from "react-query"; import { PostDetail } from "./PostDetail"; const maxPostPage = 10; async function fetchPosts() { const response = await fetch( "https://jsonplaceholder.typicode.com/posts?_limit=10&_page=0" ); return response.json(); } export function Posts() { const [currentPage, setCurrentPage] = useState(0); const [sel..

๐Ÿ“ƒ Front-End/React.js

React Query - staleTime vs cacheTime

Stale Data ( ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ ) โ“ ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ž˜๋œ ์‹๋นต๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React Query ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์Šจ ๋œป์ธ๊ฐ€ โ“ ๋ฐ์ดํ„ฐ ๋ฆฌํŒจ์นญ(Refetching) ์€ ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ ์—์„œ๋งŒ ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋งˆ์šดํŠธ๋˜๊ฑฐ๋‚˜ ์œˆ๋„์šฐ๊ฐ€ ๋‹ค์‹œ ํฌ์ปค์Šค ๋˜์—ˆ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. staleTime ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” '์ตœ๋Œ€ ๋‚˜์ด' ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋ฃŒ๋๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ์ „๊นŒ์ง€ ํ—ˆ์šฉ๋˜๋Š” ์‹œ๊ฐ„ ์ด staleTime ์ž…๋‹ˆ๋‹ค. '์›น์‚ฌ์ดํŠธ์— ํ‘œ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ 10์ดˆ ๊นŒ์ง€๋Š” ๊ทธ๋Œ€๋กœ์—ฌ๋„ ๊ดœ์ฐฎ๋‹ค' ๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด staleTime ์„ 10์ดˆ๋กœ ์„ค์ • ํ•ฉ๋‹ˆ๋‹ค. stale ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ ์œ ์˜๋ฏธํ•˜์ง€ ์•Š๋‹ค๊ณ  React Query๋Š” ํŒ..

๐Ÿ“ƒ Front-End/React.js

React Query - Dev Tools

React Query ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋Š” ์•ฑ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ชจ๋“  ์ฟผ๋ฆฌ์˜ ์ƒํƒœ๋ฅผ ํ‘œ์‹œ ํ•ด์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ํ‚ค๋กœ ์ฟผ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•ด ์ฃผ๊ณ  ํ™œ์„ฑ(active), ๋น„ํ™œ์„ฑ(inactive), ๋งŒ๋ฃŒ(stale) ๋“ฑ ๋ชจ๋“  ์ฟผ๋ฆฌ์˜ ์ƒํƒœ๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ํƒ€์ž„ ์Šคํƒฌํ”„๋„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ์ƒ‰๊ธฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ ํƒ์ƒ‰๊ธฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ โœ” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๋ฌธ์„œ์—์„œ ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์€ ํ•œ ๊ฐ€์ง€ ํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค. NODE_ENV ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๊ฒฐ์ • ๋ฉ๋‹ˆ๋‹ค. CRA ๋Š” npm run build ๋ฅผ..

๐Ÿ“ƒ Front-End/React.js

React Query - ๋กœ๋”ฉ ๋ฐ ์˜ค๋ฅ˜ ์ƒํƒœ

useQuery ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜ โœ” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ํ•˜์ง€ ์•Š๊ณ , ์ ์ ˆํ•œ ์กฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์‚ดํŽด๋ณผ ๊ฒƒ์€ isLoading ๊ณผ isError ์ž…๋‹ˆ๋‹ค. ์ด ๋‘๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” boolean ์ž…๋‹ˆ๋‹ค. ์ €๋ฒˆ์— ๋งŒ๋“  ์ฝ”๋“œ const {data, isLoading, isError} = useQuery('posts', fetchPosts); ๋™์ผํ•˜๊ฒŒ ๋ฐ˜ํ™˜ ๊ฐ์ฒด์—์„œ isLoading ๊ณผ isError ๋ฅผ ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค. โœ” isLoadding // replace with useQuery const {data, isLoading, isError} = useQuery('post..

HoHo.dev
'๐Ÿ“ƒ Front-End' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (6 Page)