ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • next-redux-wrapper의 getServerSideProps
    공부 2022. 10. 11. 17:41

    서버사이드 렌더링을 공부하면서 getServerSideProps를 알게 되었다.

    쉽게 이야기하면 페이지가 처음 로드될 때 getServerSideProps의 함수를 사용하면 반환된 데이터를 사용하여 페이지를 미리 렌더링 할 수 있게 된다.

    이외에도 getStaticPaths, getStaticProps 함수가 존재해 모두 서버사이드 렌더링을 도와준다. 위 함수들은 Next.js에서 기본적으로 제공하기 때문에 추가적인 라이브러리 없이 사용이 가능하다.

    하지만 나는 next-redux-wrapper의 라이브러리를 사용하고 있기 때문에 Next.js에서 제공하는 getServeSidePropsnext-redux-wrapper를 섞어 쓰는 것은 추천하지 않는다고 한다.

    중요한 것은 나는 next-redux-wrapper을 7버전으로 공부하고 있어 6버전과의 문법적으로 변화가 있어 공부한 것을 적어보고자 한다.

    // 6버전
    getServerSideProps({store,req,res} => {...}) 
    ​
    // 7버전
    getServerSideProps((store)=>({req,res})=>{...})

    6버전에서는 우리가 자주 쓰던 함수 형식으로 이루어져 있지만 7버전으로 넘어오면서 고차함수 형식으로 바뀌게 되었다.

    그럼 바뀐점을 생각하면서 코드를 작성하였다.

    const getServerSideProps = wrapper.getServerSideProps(
      (store) =>
        async ({req,res}) => {
          const parmas = req.parmas.id // undefined
          const query = req.query.id // undefined
          store.dispatch({
            type:"...",
            data:"..."
          })
        }
    )

    먼저 나는 getServerSidePropsstore에 내장되있는 dispatch를 사용하였다. 그리고 주소의 params 혹은 query의 값을 data로 넘겨주고자 하였다.

    그래서 params 혹은 query에 접근하기 위해 당연히 req.params에 접근하여 갖고오려고 하였지만 존재하지 않았다. 그래서 next-redux-wrapper의 공식문서를 읽어보았지만 해당 내용을 찾지 못해 Next.js의 공식문서를 읽어보았다.

    // Next.js에서 제공하는 getServerSideProps
    function getServerSideProps(context){
      const query = context.query.id; // value
      const parmas = context.params.id; // value
      return {
        props:{},
      }
    }

    공식문서에는 context에는 req,res를 포함하여 query,params를 따로 제공해주고 있었다. 나는 router를 생성할 때 req 내부에 있었으니 당연히 내부만 찾고있었다.

    그래서 나는 아래처럼 코드를 수정해주고 출력을 해보니 정상적으로 값을 받아오기 시작했다.

    const getServerSideProps = wrapper.getServerSideProps(
      (store) =>
        async ({req,res,params,query}) => {
          const parmas = parmas.id //  value
          const query = query.id // value
          store.dispatch({
            type:"...",
            data:"..."
          })
        }
    )
Designed by Tistory.