: 음악과 관련된 서비스를 제공하며 자신만의 플레이리스트를 만들어 커뮤니티페이지에서 유저들과 공유할 수 있는 페이지
: 10/10~10/16
내가 이번 프로젝트에서 맡은 페이지는 플레이리스트 페이지이다.
현재 개발하려고 하는 기능에는 아래기능들이 있다.
src > app > provider.jsx생성
"use client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactNode } from "react";
function makeQueryClient() {
return new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000
}
}
});
}
let browserQueryClient: QueryClient | undefined = undefined;
function getQueryClient() {
if (typeof window === "undefined") {
// Server: 항상 새로운 queryClient 생성
return makeQueryClient();
} else {
// Browser: 다시 만들지 않고 기존에 이미 client 존재시 해당 client 제공
if (!browserQueryClient) browserQueryClient = makeQueryClient();
return browserQueryClient;
}
}
interface ProviderProps {
children: ReactNode;
}
export default function Providers({ children }: ProviderProps) {
// NOTE: suspense boundary 로 로딩 이 잡히지 않는경우, useState 를 사용하여 초기화한다면, clinet 는 유실된다.
const queryClient = getQueryClient();
return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
}
// app > layout.tsx
import type { Metadata } from "next";
import "./globals.css";
import "@/styles/reset.css";
import Providers from "./provider";
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app"
};
export default function RootLayout({
children
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body>
<Providers>{children}</Providers>
</body>
</html>
);
}
tanstackQuery의 기본 설정이 다 끝난 후
api들을 불러와서 재생목록을 더하고, 삭제하고, 불러올 수 있는 로직을 작성하였다.
access Token값을 가져와 headers에 넣어줘야 해서 다음과 같은 로직을 작성했었다.
// 공통 헤더 작성 (동적 토큰 사용)
const getHeaders = (accessToken: string | null | undefined) => ({
Authorization: `Bearer ${accessToken}`
});
// 데이터 불러오기
export const fetchPlaylist = async (playlistId: string) => {
const { data } = await supabase.auth.getSession();
const accessToken = data.session?.provider_token;
const res = await fetch(`${BASEURL}/${playlistId}`, {
method: "GET",
headers: getHeaders(accessToken)
});
if (!res.ok) {
throw new Error("fetch 실패");
}
const playlistData = await res.json();
console.log(playlistData);
return playlistData;
};
supabase의 토큰을 가져오는 로직을 작성했음에도 불구하고
계속해서 401 에러가 떴다.
superbase의 provider_token을 사용하는 것이 아닌 spotify에서 제공해주는 accessToken가져오는 법을 참고하였다.
spotify access Token
1.spotify 대시보드 설정에서 앱을 만들고 발급 받은 spotify client Id 와 spotify client secret을 .env.local 에 넣어주고
.env.local
const SPOTIFY_CLIENT_ID = process.env.NEXT_PUBLIC_SPOTIFY_CLIENT_ID as string;
const SPOTIFY_CLIENT_SECRET = process.env.NEXT_PUBLIC_SPOTIFY_CLIENT_SECRET as string;
const getAccessToken = async () => {
const params = new URLSearchParams({
grant_type: "client_credentials",
client_id: SPOTIFY_CLIENT_ID,
client_secret: SPOTIFY_CLIENT_SECRET
});
const res = await fetch("https://accounts.spotify.com/api/token", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: params.toString()
});
const { access_token } = await res.json();
return access_token;