1. useFetch

데이터 통신과 관련한 거의 모든 내용은 "Nuxt-개요 > 데이터 가져오기" 에 담겨있다.

이번 장에서 간단하게 실습한 후 위 내용을 참고하면 이해에 더 도움이 될 것이다.

 

useFetch 컴포저블은 SSR 을 지원하는 컴포넌트이다. 서버 측, 클라어언트 측 모두에서 사용할 수 있으며, Nuxt 에서 제공하는 내장 컴포저블이다. 이를 통하면 개발자의 개입없이 네트워크 중복 호출을 피할 수 있다.

 

데이터 호출과 관련해서 Nuxt 에서 제공하는 컴포저블 및 함수에는, useFetch 이외에도 useLazyFetch, useAsyncData, useLazyAsyncData, $fetcch 가 있다. useFetch 컴포저블은 setup 함수에서 데이터를 가져올 때 사용할 수 있는 가장 간단한 방법이다.

 

간단한 사용 예를 살펴보자

 

/pages/todos.vue

<script setup lang="ts">
const { data, pending, error, refresh } = await useFetch('https://jsonplaceholder.typicode.com/todos', { method:'get'})
</script>

<template>
<div>
  <table class="min-w-full table-auto bg-blue-950">
    <thead>
    <tr>
      <th class="px-4 py-2">ID</th>
      <th class="px-4 py-2">Title</th>
      <th class="px-4 py-2">Completed</th>
    </tr>
    </thead>
    <tbody>
    <!-- Loop through todosData to populate the table rows -->
    <tr v-for="todo in data">
      <td class="border px-4 py-2">{{ todo.id }}</td>
      <td class="border px-4 py-2">{{ todo.title }}</td>
      <td class="border px-4 py-2">
        <!-- Use a checkmark if completed, otherwise a cross -->
        <span :class="{ 'text-green-500': todo.completed, 'text-red-500': !todo.completed }">
                            {{ todo.completed ? '✔' : '❌' }}
                        </span>
      </td>
    </tr>
    </tbody>
  </table>
</div>
</template>

<style scoped>

</style>

 

http://localhost:3000/todos 에 접속해보면 아래와 같이 나올 것이다.

브라우저에서 마우스 우클릭 후 소스보기를 해보자. 

위 그림과 같이 서버사이드에서 HTML 이 렌더링 된걸 확인할 수 있다.

 

SEO 가 중요하지 않은 경우이거나, 서버사이드 렌더링을 피해야 할 경우가 있다. 이럴때는 server 옵션을 false 로 주면 된다. 소스 보기를 하면 TABLE > TR > TD 엘리먼트가 사라진걸 확인 할 수 있다.

 

브라우저 개발자 도구를 통해 클라이언트에서 todos 를 호출하는 것을 확인 할 수 있다.

 

위에서 살펴본 것처럼 useFetch 를 사용하면 서버측 렌더링과 클라이언트 렌더링 모두 자유롭게 지원할 수 있다. 사용하기도 간편해서 웬만한 데이터 통신에선 이 것 하나면 충분하다. 그러나, 간혹 좀 더 섬세한 제어가 필요할 때가 있다. 이는 이어지는 장에서 계속 알아보자.

'Nuxt 개발 가이드 > 04. Data fetching' 카테고리의 다른 글

3. 풀스택을 위한 API 서버 구축  (0) 2024.01.14
2. useAsyncData  (1) 2024.01.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유