custom-hook + SWR

yonghee·2022년 6월 15일
0

baechu-market

목록 보기
27/32

앞에서 기록한 useUser() hook에 SWR 도입하였다.

import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import useSWR from "swr"; //추가 

const fetcher = (url: string) => 
fetch(url).then((response) => response.json()); //추가 

export default function useUser() {
  //const [user, setUser] = useState();
   const { data, error } = useSWR("/api/users/me", fetcher); //추가   
  const router = useRouter();
  //useEffect(() => {
    //fetch("/api/users/me") 
    //앞서 만든 profile 데이터 경로
      //.then((response) => response.json())
      //.then((data) => {
        //if (!data.ok) {
          //return router.replace("/Login");
        }
      //데이터가 없을 경우 Login 페이지로 가게 된다.
      //!data.ok === false 가 성립 되는 이유는 
      //res: NextApiResponse<ResponseType> 타입을 
      
      //export interface ResponseType {
  	  //ok: boolean;
  	  //[key: string]: any
	  //}
	  //으로 지정 해줬기 때문에 가능하다. session을 통해 받은 유저 정보가 없을 경우 ok:false 한 상태이다.      
        setUser(data.profile);
      //데이터가 있다면 데이터를 useState로 상태변경이 되도록 해줬다.
      });
  }, [router]);
  return user;
}

useSWR()을 사용할 때는 2개의 인자가 필요하다. 첫번째는 요청을 보낼 url이고 두번째 인자는 fetcher 함수이다. fetcher 함수는 첫번째 인자인 key에 입력한 url을 받는다. url이 아닌 key라고 부르는 이유는 이 url이 api를 요청할 url이기도 하면서 캐시를 저장할 때 사용할 key이기도 하기 때문이다. 다시 요점을 말하면 fetcher 함수는 첫번째 인자에 입력한 url로 요청을 보내는 함수이다. useEffect가 필요없는 이유는 useSWR()은 useEffect처럼 함수가 처음 실행될 때 렌더링을 해주기 때문이다. 이제 profile 데이터를 캐싱 할 수 있게 됐다.

profile
필요할 때 남기는 날것의 기록 공간

0개의 댓글