해결된 질문
작성
·
51
·
수정됨
0
강의를 듣다가 궁금한 점이 생겨서 질문드립니다.
브라우저에서 실행되는 코드에서는 브라우저 클라이언트를 사용하고, 서버에서 실행되는 코드에서는 서버 클라이언트를 사용합니다. - [Creating a Supabase client for SSR](https://supabase.com/docs/guides/auth/server-side/creating-a-client?queryGroups=framework&framework=nextjs&queryGroups=environment&environment=client#create-a-client)
@supabase/ssr
라이브러리를 사용해서 2가지 유형의 클라이언트를 생성합니다.
클라이언트 컴포넌트 클라이언트(createBrowerClient) - 브라우저에서 실행되는 클라이언트 컴포넌트에서 Supabase에 접근
서버 컴포넌트 클라이언트(createServerClient) - 서버에서만 실행되는 서버 컴포넌트, 서버 액션 및 라우트 핸들러에서 Supabase에 접근
서버 컴포넌트로 동작하는 page 컴포넌트에서 각 클라이언트를 사용해 번갈아 API 호출을 해봤는데 동일하게 작동하는 것 같았습니다. 서버 컴포넌트에서 Supabase의 클라이언트/서버 클라이언트가 동작하는 방식의 차이가 있는지, 렌더링 방식에 차이가 있는지 궁금합니다. 서버와 클라이언트 개념과 렌더링 방식(SSR, CSR)이 자꾸 혼동되어 헷갈리네요..
import { getTodos as getTodosClient } from '@/apis/todos';
import { getTodos as getTodosServer } from '@/actions/todos';
export default async function page() {
const todos = await getTodos...();
}
// todos.ts
import { createBrowserSideClient } from "@/lib/client/supabase";
export const getTodos = async() => {
const supabase = await createBrowserSideClient();
const result = await supabase.from("todos").select("*");
return result.data;
}
// todos.action.ts
import { createServerSideClient } from "@/lib/server/supabase";
export const getTodos = async() => {
const supabase = await createServerSideClient();
const result = await supabase.from("todos").select("*");
return result.data;
}
답변 2
0
React Server Component ( RSC )는 기본적으로 서버에서 동작합니다. 하지만 브라우저에서도 동작하도록 "use client" 디렉티브를 줄수 있죠.
React Server Component ( RSC ) = SSR
React Server Component ( RSC ) + "use client" = SSR +CSR
Next.js AppRouter에서 RSC 으로 SSR, CSR 를 모두 커버 했다라고 보면됩니다.
0
결론먼저 말씀드리면 서버에서 실행되는 코드라면 createServerSideClient, 브라우저에서 실행되는 코드라면 createBrowserSideClient 을 사용하면 됩니다.
*supabase 응답을 콘솔로그를 찍었을때 vscode 라면 서버사이드, 브라우저라면 클라이언트 사이드 입니다.
1.서버 컴포넌트는 서버와 브라우저에서 모두 동작할 수 있습니다.
( React Server Component != SSR )
2 서버 컴포넌트의 서버 실행 구간
2.1 Supabase createServerSideClient : 모든 기능이 잘 동작합니다.
2.2 Supabase createBrowserSideClient : 사실 이렇게 써도 잘 동작 합니다. 브라우저에서 돌리는 코드는 서버에서도 동작하죠. ( 대신 createServerSideClient과 다르게 req 객체의 쿠키 조작과 같은 작업은 못하겠죠. )
3. 서버 컴포넌트의 브라우저 실행 구간
( RSC 가 브라우저로 넘어와서 하이드레이션 과정을 거쳐서 리액트 App으로 돌아간다고 했었죠.! )
3.1 Supabase createServerSideClient : 사용이 불가능합니다.
3.2 Supabase createBrowserSideClient : 그래서 반드시 요것을 써야하죠.