이번 프로젝트에서 가장 이슈가 많았던 부분이다. 왜 SSR(ServerSideRendering)을 적용해야 했고, 그 과정에서 어떤 어려움이 있었는지, 정리해 보려고 한다.
처음부터 SSR을 바로 적용하지 않았고, 프로젝트가 어느 정도 구현되고 나서, 필요하다 싶어 적용 하였다.
firebase를 이용하여 로그인을 하고, 로그인 유무에 따라 페이지 이동과, 로그인 정보에 따른 프로필 렌더를 하는데, 이 부분이 새로 고침을 할 경우, 너무 부자연스러웠다. 페이지 이동하는 시간의 간격과, 프로필 사진 보여주는 부분이 막 요동을 치는데 반드시 SSR 적용을 해야 겠다 싶었다.
firebase 가 SSR에 적합하지 않았다.
useEffect(() => {
onAuthStateChanged(auth, user => {
if (user) {
// dispatch(setUser(user));
dispatch(setLoggedIn(true));
const photourl = user.photoURL;
photourl && setPhotoUrl(photourl);
setCookie('uid', user.uid, 1);
}
});
}, [auth]);
➕ firebase말고 찾아본 로그인 방법
찾아 보니 이런 방법이 있었음.
로그인 했을 경우, uid나 토큰을 브라우저 저장소에 저장하고,( 로그 아웃 시 지움.) 페이지 들어갈 때마다 브라우저 저장소의 uid나 토큰을 확인하고 로그인 여부를 판단
위의 방법을 참고로 uid를 localstorage에 저장하려고 하였으나 localstorage는 serverside에서 접근이 안되었다.
쿠키는 serverside에서도 접근이 가능하기에 쿠키에 저장하기로 하였다.
로그인 여부를 쿠키를 통해 serverside에서 접근 할 수 있게 되었고, 이를 redux 상태값으로 저장하려는데 에러가 발생하였다.
next-redux-wrapper 붙이는 과정이 험난 했음 😭
/!\ You are using legacy implementaion. Please update your code: use createWrapper() and wrapper.useWrappedStore().
라는 경고창이 떴다.makeStore is not a function
이라는 에러가 났다 (🗻넘어 🗻)store = wrapper.useStore()
를 적용해 보았지만 이 또한 똑같은 에러 발생이었다➕ SSR적용에 대해 찾아보다가 언제 serverside, clientside 컴포넌트를 쓰면 좋을지 잘 정리 된 글을 발견해 첨부한다.
firebase authentication 말고 찾아 본 것 중에 next-auth라는 라이브러리가 있었다. 자세히 다 못 찾아봤지만 SSR 적용도 도와 주는 것 같다. (firebase는 아니고 다른 sns 로그인들) 추가로 더 공부해서 적용해 봐야 겠다. - 참고
또, RTK-query를 SSR에 사용하는 방법 찾아 보다가, react-query의 SSR적용방식도 찾아보았는데, 훨씬 간편해 보였다. (살짝 후회가….) 다음에 react-query 적용 해 봐야겠다. - 참고
뭔가 원하는 형태로 구현은 해냈지만 개운하게 하지 못한 것 같아 아쉬움이 좀 남는다. 위의 언급한 기술들 한 번 테스트 해보고 차후에 더 좋은 방향으로 수정을 해야 겠다.
server side에서 RTK-Query활용하여 데이터 패칭 성공하셨을까요 ?