• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

next.js에서 swr 서버사이드 렌더링 질문드립니다.

21.07.08 22:54 작성 조회수 358

0

next.js에 swr, typescript를 이용해 노드버드 실습을 해보다가  서버사이드 렌더링에 대해 궁금한 게 생겼습니다.

사용자가 만약 로그인을 한 상태일 때, 서버사이드 렌더링을 해서 컴포넌트에 사용자 정보를 넣어준 상태로  페이지가 보여지도록 하고 싶은데요.

강의에서는 pages/index.js에서 리덕스를 이용하여 LOAD_MY_REQUEST 액션을 dispatch 한 뒤, components/AppLayout.js 에서 useSelector로 me 값을 가져 오면  사용자 정보가 담겨진 채로 AppLayout.js 컴포넌트가 랜더링 됩니다.

swr을 적용해서 동일하게 구현해보려고 하는데요.

swr에서는 page/index.js에서 서버사이드에서 로그인한 사용자 정보롤 가지고 오더라도, components/AppLayout.js에서 useSWR을 사용하면 처음 [로그아웃] 상태일 때의 화면이 잠깐 나오고, [로그인]상태일 때의 모습으로 변합니다.

혹시 swr을 이용해서 pages/index.js에서 서버사이드 렌더링으로 가지고 왔던 값을 components/AppLayout.js에도 페이지 렌더링 초기에 값을 함께 전달해주는 방법은 없을까요?

제가swr을 이용해 아래처럼 적용해봤는데, 다른 방법이 있을까요?

pages/index.tsx

export const getServerSideProps: GetServerSideProps = async function({ req }) {
const cookie: string = req ? req.headers.cookie : '';
if (cookie) {
const data = await fetcher.get('/user', { cookie });

if (data) {
return {
props: { userProps: data },
};
}
}
return {
props: { userProps: null },
};
};

function Index({ userProps }: InferGetServerSidePropsType<typeof getServerSideProps>) {
const { data: user } = useSWR<IUser>('/user', fetcher.get, { initialData: userProps });

return <AppLayout>{user ? user.nickname : '로그인해주세요'}</AppLayout>;
}

components/AppLayout.tsx

function AppLayout() {
const { data: user } = useSWR<IUser>('/user', fetcher.get);

return (
<div css={userNavStyle}>
{user ? (
<>
<Profile image={user.profile} size='40px' />
</>
) : (
<Link href='/login'>
<a href='' className='login'>
로그인
</a>
</Link>
)}
</div>
);
}

답변 1

답변을 작성해보세요.

0

AppLayout의 props로  userData를 전달한 후 똑같이 initialData로 넣어야 할 것 같습니다.

호머님의 프로필

호머

질문자

2021.07.08

빠른 답변 너무 감사합니다!

swr은 리덕스처럼 서버사이드 렌더링 시 컴포넌트에서 스토어의 값을 가져오는 게 안 되고, props로 전달해주는 방법밖엔 없을까요? ㅠ_ㅠ 

스토어를 쓰지 않으려고 SWR을 하는 것이라 방법이 딱히 있을 것 같진 않습니다. 아니면 간단히 context api 붙여도 될 것 같긴 하네요.

호머님의 프로필

호머

질문자

2021.07.08

네! 감사합니다! 구글링을 열심히 해봤는데도 답이 안 나와서 며칠동안 머리만 싸매고 있었는데...

눈이 번쩍 뜨이는 거 같네요.

너무너무 감사합니다!