{"id":14,"date":"2025-07-16T13:42:46","date_gmt":"2025-07-16T04:42:46","guid":{"rendered":"https:\/\/34.64.61.65\/?p=14"},"modified":"2025-07-16T14:43:09","modified_gmt":"2025-07-16T05:43:09","slug":"react-query%eb%a1%9c-%eb%8d%b0%ec%9d%b4%ed%84%b0-%ed%8c%a8%ec%b9%ad-%ec%b5%9c%ec%a0%81%ed%99%94%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/hed-g.me\/?p=14","title":{"rendered":"React-query\ub85c \ub370\uc774\ud130 \ud328\uce6d \ucd5c\uc801\ud654\ud558\uae30"},"content":{"rendered":"\n<p>React \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \uc791\uc5c5, \uc989 \ub370\uc774\ud130 \ud398\uce6d(Data Fetching)\uc740 \ud575\uc2ec\uc801\uc778 \ubd80\ubd84\uc785\ub2c8\ub2e4. \ub9ce\uc740 \uac1c\ubc1c\uc790\uac00 <code>useEffect<\/code>\uc640 <code>useState<\/code>, \uadf8\ub9ac\uace0 <code>Axios<\/code> \uac19\uc740 HTTP \ud074\ub77c\uc774\uc5b8\ud2b8\ub97c \uc870\ud569\ud558\uc5ec \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubc29\uc2dd\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubcf5\uc7a1\ud574\uc9c8\uc218\ub85d \uc5ec\ub7ec \ubb38\uc81c\uc810\uc744 \ub4dc\ub7ec\ub0c5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 \uc804\ud1b5\uc801\uc778 \ub370\uc774\ud130 \ud398\uce6d \ubc29\uc2dd\uc758 \ud55c\uacc4\ub97c \uc0b4\ud3b4\ubcf4\uace0, <code>React-query<\/code>\uac00 \uc5b4\ub5bb\uac8c \uc774 \ubb38\uc81c\ub4e4\uc744 \ud574\uacb0\ud558\uace0 \ub370\uc774\ud130 \ud398\uce6d\uc744 \ucd5c\uc801\ud654\ud558\ub294\uc9c0 \uc54c\uc544\ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ubaa9\ucc28<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\uc804\ud1b5\uc801\uc778 \ub370\uc774\ud130 \ud398\uce6d\uc758 \ubb38\uc81c\uc810<\/strong><\/li>\n\n\n\n<li><strong>\uc11c\ubc84 \uc0c1\ud0dc \uad00\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac, React-query<\/strong><\/li>\n\n\n\n<li><strong>\ud575\uc2ec API\ub85c \ucd5c\uc801\ud654 \uc2dc\uc791\ud558\uae30<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>useQuery<\/code>: \ub370\uc774\ud130 \uc870\ud68c\uc640 \uce90\uc2f1\uc758 \uc790\ub3d9\ud654<\/li>\n\n\n\n<li><code>useMutation<\/code>: \uac04\ud3b8\ud55c \ub370\uc774\ud130 \ubcc0\uacbd<\/li>\n\n\n\n<li><code>queryClient.invalidateQueries<\/code>: \ub370\uc774\ud130 \ub3d9\uae30\ud654\uc758 \ub9c8\ubc95<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uadf9\ub300\ud654\ud558\ub294 \uace0\uae09 \ud328\ud134<\/strong>\n<ul class=\"wp-block-list\">\n<li>Optimistic Updates (\ub099\uad00\uc801 \uc5c5\ub370\uc774\ud2b8)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uacb0\ub860: \uc65c React-query\ub97c \uc120\ud0dd\ud574\uc57c \ud558\ub294\uac00?<\/strong><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. \uc804\ud1b5\uc801\uc778 \ub370\uc774\ud130 \ud398\uce6d\uc758 \ubb38\uc81c\uc810<\/h2>\n\n\n\n<p><code>useEffect<\/code>\uc640 <code>useState<\/code>\ub97c \uc0ac\uc6a9\ud574 \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \ucf54\ub4dc\ub97c \uc0dd\uac01\ud574\ubd05\uc2dc\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React, { useState, useEffect } from 'react';\nimport axios from 'axios';\n\nfunction TodoList() {\n  const &#91;isLoading, setIsLoading] = useState(false);\n  const &#91;isError, setIsError] = useState(false);\n  const &#91;data, setData] = useState(null);\n\n  useEffect(() =&gt; {\n    setIsLoading(true);\n    axios.get('\/api\/todos')\n      .then(response =&gt; {\n        setData(response.data);\n      })\n      .catch(error =&gt; {\n        setIsError(true);\n      })\n      .finally(() =&gt; {\n        setIsLoading(false);\n      });\n  }, &#91;]);\n\n  if (isLoading) return &lt;div&gt;\ub85c\ub529 \uc911...&lt;\/div&gt;;\n  if (isError) return &lt;div&gt;\uc5d0\ub7ec \ubc1c\uc0dd!&lt;\/div&gt;;\n\n  \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p>\uc774 \ucf54\ub4dc\uc5d0\ub294 \uba87 \uac00\uc9c0 \ube44\ud6a8\uc728\uc801\uc778 \ubd80\ubd84\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8 \ucf54\ub4dc:<\/strong> <code>isLoading<\/code>, <code>isError<\/code>, <code>data<\/code> \uc0c1\ud0dc\ub97c \ubaa8\ub450 \uc9c1\uc811 \uc120\uc5b8\ud558\uace0 \uad00\ub9ac\ud574\uc57c \ud569\ub2c8\ub2e4. \ucef4\ud3ec\ub10c\ud2b8\ub9c8\ub2e4 \uc774 \ucf54\ub4dc\uac00 \ubc18\ubcf5\ub429\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uce90\uc2f1\uc758 \ubd80\uc7ac:<\/strong> \ub2e4\ub978 \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uc11c \ub3d9\uc77c\ud55c \ub370\uc774\ud130\ub97c \uc694\uccad\ud558\uba74, \ubd88\ud544\uc694\ud55c API \ud638\ucd9c\uc774 \ub2e4\uc2dc \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc0c1\ud0dc \ub3d9\uae30\ud654\uc758 \uc5b4\ub824\uc6c0:<\/strong> \uc0ac\uc6a9\uc790\uac00 \ud560 \uc77c\uc744 \ucd94\uac00(Create)\ud558\uac70\ub098 \uc0ad\uc81c(Delete)\ud588\uc744 \ub54c, \ubaa9\ub85d\uc744 \ucd5c\uc2e0 \uc0c1\ud0dc\ub85c \ub2e4\uc2dc \ubd88\ub7ec\uc624\ub294(refetch) \ub85c\uc9c1\uc744 \uc218\ub3d9\uc73c\ub85c \uad6c\ud604\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. \uc11c\ubc84 \uc0c1\ud0dc \uad00\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac, React-query<\/h2>\n\n\n\n<p><code>React-query<\/code>\ub294 \uc790\uc2e0\uc744 &#8220;\ub370\uc774\ud130 \ud398\uce6d \ub77c\uc774\ube0c\ub7ec\ub9ac&#8221;\uac00 \uc544\ub2cc <strong>&#8220;\uc11c\ubc84 \uc0c1\ud0dc(Server State) \uad00\ub9ac \ub77c\uc774\ube0c\ub7ec\ub9ac&#8221;<\/strong>\ub77c\uace0 \uc18c\uac1c\ud569\ub2c8\ub2e4. \uc11c\ubc84\uc5d0\uc11c \ubc1b\uc544\uc628 \ube44\ub3d9\uae30 \ub370\uc774\ud130\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 UI \uc0c1\ud0dc\uc640 \ubd84\ub9ac\ud558\uc5ec, \uce90\uc2f1, \ub3d9\uae30\ud654, \uc5c5\ub370\uc774\ud2b8\ub97c \ub9e4\uc6b0 \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud574\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. \ud575\uc2ec API\ub85c \ucd5c\uc801\ud654 \uc2dc\uc791\ud558\uae30<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. <code>useQuery<\/code>: \ub370\uc774\ud130 \uc870\ud68c\uc640 \uce90\uc2f1\uc758 \uc790\ub3d9\ud654<\/h3>\n\n\n\n<p><code>useQuery<\/code>\ub294 \ub370\uc774\ud130 \uc870\ud68c\ub97c \uc704\ud55c \uae30\ubcf8 Hook\uc785\ub2c8\ub2e4. \uc704\uc758 \uc7a5\ud669\ud55c \ucf54\ub4dc\ub97c \uc544\ub798\uc640 \uac19\uc774 \ub2e8 \uba87 \uc904\ub85c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useQuery } from 'react-query';\nimport axios from 'axios';\n\nconst fetchTodos = () =&gt; axios.get('\/api\/todos').then(res =&gt; res.data);\n\nfunction TodoList() {\n  const { data, isLoading, isError } = useQuery('todos', fetchTodos);\n\n  if (isLoading) return &lt;div&gt;\ub85c\ub529 \uc911...&lt;\/div&gt;;\n  if (isError) return &lt;div&gt;\uc5d0\ub7ec \ubc1c\uc0dd!&lt;\/div&gt;;\n\n  \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p><code>useQuery<\/code>\ub294 <code>isLoading<\/code>, <code>isError<\/code>, <code>data<\/code> \uc0c1\ud0dc\ub97c \uc54c\uc544\uc11c \uad00\ub9ac\ud574\uc904 \ubfd0\ub9cc \uc544\ub2c8\ub77c, <strong>\uac15\ub825\ud55c \uce90\uc2f1 \uae30\ub2a5<\/strong>\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>useQuery('todos', ...)<\/code>\uc758 \uccab \ubc88\uc9f8 \uc778\uc790\uc778 <code>'todos'<\/code>\ub294 \uc774 \ub370\uc774\ud130\uc758 \uace0\uc720\ud55c <strong>\ucffc\ub9ac \ud0a4(Query Key)<\/strong>\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li>React-query\ub294 \uc774 \ud0a4\ub97c \uae30\uc900\uc73c\ub85c \ub370\uc774\ud130\ub97c \uce90\uc2dc\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ub2e4\ub978 \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uc11c \ub3d9\uc77c\ud55c <code>'todos'<\/code> \ud0a4\ub85c <code>useQuery<\/code>\ub97c \ud638\ucd9c\ud558\uba74, API\ub97c \ub2e4\uc2dc \ud638\ucd9c\ud558\ub294 \ub300\uc2e0 \uce90\uc2dc\ub41c \ub370\uc774\ud130\ub97c \uc989\uc2dc \ubc18\ud658\ud558\uc5ec \ubd88\ud544\uc694\ud55c \ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc744 \ub9c9\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>stale-while-revalidate<\/code> \uc804\ub7b5\uc744 \uae30\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ud558\uc5ec, \uce90\uc2dc\ub41c \ub370\uc774\ud130\ub97c \uba3c\uc800 \ubcf4\uc5ec\uc900 \ud6c4 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ucd5c\uc2e0\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\uc5ec \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uacfc \ub370\uc774\ud130 \uc815\ud569\uc131\uc744 \ubaa8\ub450 \uc7a1\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.2. <code>useMutation<\/code>: \uac04\ud3b8\ud55c \ub370\uc774\ud130 \ubcc0\uacbd<\/h3>\n\n\n\n<p>\ub370\uc774\ud130\ub97c \uc0dd\uc131, \uc218\uc815, \uc0ad\uc81c\ud560 \ub54c\ub294 <code>useMutation<\/code>\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useMutation } from 'react-query';\n\nconst addTodo = (newTodo) =&gt; axios.post('\/api\/todos', newTodo);\n\nfunction AddTodoComponent() {\n  const mutation = useMutation(addTodo);\n\n  const handleAddTodo = () =&gt; {\n    mutation.mutate({ title: '\uc0c8\ub85c\uc6b4 \ud560 \uc77c', completed: false });\n  };\n\n  \/\/ ...\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.3. <code>queryClient.invalidateQueries<\/code>: \ub370\uc774\ud130 \ub3d9\uae30\ud654\uc758 \ub9c8\ubc95<\/h3>\n\n\n\n<p><code>useMutation<\/code>\uc758 \uac00\uc7a5 \uac15\ub825\ud55c \uae30\ub2a5\uc740 \ub2e4\ub978 \ucffc\ub9ac\uc640\uc758 \uc5f0\ub3d9\uc785\ub2c8\ub2e4. \ud560 \uc77c\uc774 \ucd94\uac00\ub41c \ud6c4, \ubaa9\ub85d\uc744 \uc5b4\ub5bb\uac8c \uc0c8\ub85c\uace0\uce68\ud560 \uc218 \uc788\uc744\uae4c\uc694? <code>invalidateQueries<\/code>\ub97c \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useMutation, useQueryClient } from 'react-query';\n\nfunction AddTodoComponent() {\n  const queryClient = useQueryClient();\n\n  const mutation = useMutation(addTodo, {\n    onSuccess: () =&gt; {\n      \/\/ 'todos' \ucffc\ub9ac\ub97c \ubb34\ud6a8\ud654\uc2dc\ucf1c \uc790\ub3d9\uc73c\ub85c \ub2e4\uc2dc \uac00\uc838\uc624\uac8c \ud569\ub2c8\ub2e4.\n      queryClient.invalidateQueries('todos');\n    },\n  });\n\n  \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p><code>mutation<\/code>\uc774 \uc131\uacf5\ud558\uba74 <code>onSuccess<\/code> \ucf5c\ubc31\uc774 \uc2e4\ud589\ub418\uace0, <code>queryClient.invalidateQueries('todos')<\/code>\ub294 <code>'todos'<\/code>\ub77c\ub294 \ud0a4\ub97c \uac00\uc9c4 <code>useQuery<\/code>\ub97c &#8220;\uc624\ub798\ub41c \ub370\uc774\ud130(stale)&#8221;\ub85c \ub9cc\ub4ed\ub2c8\ub2e4. \ud574\ub2f9 \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \ubaa8\ub4e0 \ucef4\ud3ec\ub10c\ud2b8\ub294 \uc790\ub3d9\uc73c\ub85c \ub370\uc774\ud130\ub97c \ub9ac\u0e40\u0e1fetch\ud558\uc5ec UI\ub97c \ucd5c\uc2e0 \uc0c1\ud0dc\ub85c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. \ub354 \uc774\uc0c1 \uc218\ub3d9\uc73c\ub85c \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uadf9\ub300\ud654\ud558\ub294 \uace0\uae09 \ud328\ud134<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Optimistic Updates (\ub099\uad00\uc801 \uc5c5\ub370\uc774\ud2b8)<\/h3>\n\n\n\n<p>\uc11c\ubc84\uc758 \uc751\ub2f5\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0, <code>mutation<\/code>\uc774 \uc131\uacf5\ud560 \uac83\uc774\ub77c\uace0 &#8220;\ub099\uad00&#8221;\ud558\uc5ec UI\ub97c \uba3c\uc800 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uae30\ubc95\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub294 \uc989\uac01\uc801\uc778 \ud53c\ub4dc\ubc31\uc744 \ubc1b\uac8c \ub418\uc5b4 \uc571\uc774 \ub9e4\uc6b0 \ube60\ub974\uac8c \ub290\uaef4\uc9d1\ub2c8\ub2e4. <code>useMutation<\/code>\uc758 <code>onMutate<\/code>\uc640 <code>onError<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud574 \uad6c\ud604\ud560 \uc218 \uc788\uc73c\uba70, \ub9cc\uc57d <code>mutation<\/code>\uc774 \uc2e4\ud328\ud558\uba74 \uc774\uc804 \uc0c1\ud0dc\ub85c \ub864\ubc31\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. \uacb0\ub860: \uc65c React-query\ub97c \uc120\ud0dd\ud574\uc57c \ud558\ub294\uac00?<\/h2>\n\n\n\n<p>React-query\ub294 \ub2e8\uc21c\ud788 \ucf54\ub4dc\ub97c \uc904\uc5ec\uc8fc\ub294 \uac83\uc744 \ub118\uc5b4, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub370\uc774\ud130 \ud398\uce6d \ub85c\uc9c1\uc744 \uadfc\ubcf8\uc801\uc73c\ub85c \ucd5c\uc801\ud654\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uc131\ub2a5 \ud5a5\uc0c1:<\/strong> \uc790\ub3d9 \uce90\uc2f1\uacfc \ubd88\ud544\uc694\ud55c API \ud638\ucd9c \ubc29\uc9c0\ub85c \ub6f0\uc5b4\ub09c \uc131\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uac1c\ubc1c \uacbd\ud5d8 \ud5a5\uc0c1:<\/strong> \ubc18\ubcf5\uc801\uc778 \ub85c\ub529\/\uc5d0\ub7ec \uc0c1\ud0dc \uad00\ub9ac\ub97c \uc81c\uac70\ud558\uace0, \uc120\uc5b8\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c \ub2e4\ub8f0 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc0ac\uc6a9\uc790 \uacbd\ud5d8 \ud5a5\uc0c1:<\/strong> <code>stale-while-revalidate<\/code>, <code>Optimistic Updates<\/code> \ub4f1\uc758 \ud328\ud134\uc73c\ub85c \uc0ac\uc6a9\uc790\uc5d0\uac8c \ube60\ub974\uace0 \ubd80\ub4dc\ub7ec\uc6b4 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p>React \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub370\uc774\ud130 \ud398\uce6d\uc744 \ud55c \ub2e8\uacc4 \ub04c\uc5b4\uc62c\ub9ac\uace0 \uc2f6\ub2e4\uba74, React-query\ub294 \ub2e8\uc5f0 \ucd5c\uace0\uc758 \uc120\ud0dd\uc785\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>React \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \uc791\uc5c5, \uc989 \ub370\uc774\ud130 \ud398\uce6d(Data Fetching)\uc740 \ud575\uc2ec\uc801\uc778 \ubd80\ubd84\uc785\ub2c8\ub2e4. \ub9ce\uc740 \uac1c\ubc1c\uc790\uac00 useEffect\uc640 useState, \uadf8\ub9ac\uace0 Axios \uac19\uc740 HTTP \ud074\ub77c\uc774\uc5b8\ud2b8\ub97c \uc870\ud569\ud558\uc5ec \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774 \ubc29\uc2dd\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubcf5\uc7a1\ud574\uc9c8\uc218\ub85d \uc5ec\ub7ec \ubb38\uc81c\uc810\uc744 \ub4dc\ub7ec\ub0c5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc804\ud1b5\uc801\uc778 \ub370\uc774\ud130 \ud398\uce6d \ubc29\uc2dd\uc758 \ud55c\uacc4\ub97c \uc0b4\ud3b4\ubcf4\uace0, React-query\uac00 \uc5b4\ub5bb\uac8c \uc774 \ubb38\uc81c\ub4e4\uc744 \ud574\uacb0\ud558\uace0 \ub370\uc774\ud130 \ud398\uce6d\uc744 \ucd5c\uc801\ud654\ud558\ub294\uc9c0 \uc54c\uc544\ubd05\ub2c8\ub2e4. \ubaa9\ucc28 1. \uc804\ud1b5\uc801\uc778 \ub370\uc774\ud130 \ud398\uce6d\uc758 \ubb38\uc81c\uc810 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[105,104,100,103,102,101],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-react","tag-data-fetching","tag-fetching","tag-react","tag-react-query","tag-react-js","tag-101"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14"}],"version-history":[{"count":2,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":80,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions\/80"}],"wp:attachment":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}