기술 블로그

[TIL] ssr 로딩지연과 Exhaustive-deps 본문

프론트엔드/TIL

[TIL] ssr 로딩지연과 Exhaustive-deps

jaegwan 2023. 9. 17. 20:06
반응형



 

문제

getServerSideProps를 이용하여 api를 요청했을 때 페이지 요청이 너무 오래 걸리는 문제(4~10s) 가 발생했다.

정확히는 api 요청이 아니라 페이지의 로드 자체가 오래 걸렸다.

 

일반적으로는 api 최적화, 로딩스피너 추가, 이미지 최적화 등을 고려해 볼 수 있으나

내 페이지에 이미지는 없었고 api 요청만 존재 했다.

 

그러나 비제한적인 호출을 위해 크롤링 api 를 활용했고 고질적인 시간 지연 문제가 발생했다.

 

api를 최적화 할 순 없나?

유투브 써드파티 라이브러리를 사용하기로 한 이상 속도는 타협해야 했다. 크롤링 후 재가공 결과를 반환하는 api임을 감안하면 현실적인 속도이다.

 

로딩 스피너를 달거나 UI만 미리 불러올 순 없나?

가장 큰 문제는 써드파티 유투브 api는 클라이언트 단에서 호출할 수 없다. 

크롤링 과정 때문에 브라우저api가 아닌 node.js를 사용하여 서버단에서 실행되어야하고

src디렉토리(next)를 사용할 때 getServerSideProps에서 사용되어야한다. 

 

즉 getServerSideProps는 브라우저에 무엇이든 보내기 전에 실행된다.

 

해결

1.nprogress

 브라우저 자체의 로딩과 같은 것을 시각화하여 보여준다.

 

2.to페이지

 로딩은 이동 바로 전 페이지에서 이루어지므로 중간 로딩페이지를 만든다.

 

나의 경우는 2번으로 해결하기로 했다.

 

import React, { use, useEffect } from 'react';
import { useRouter } from 'next/router';

function Main() {
    const router = useRouter();
    useEffect(() => {
        router.push('/mainRaw', '/main');
    }, []);

    return <div>Loading...</div>;
}

export default Main;

기존의 메인페이지를 /mainRaw로 바꾸고 

로딩페이지로 /main을 만들었다.

 

위 main 으로의 진입은 /main으로 마스킹 된 /mainRaw로 이동한다.

 

이같은 구조를 통해 /main에서의 새로고침 로딩도 대응할 수 있었다

 

결론

getServerSideProps는 브라우저에 무엇이든 보내기 전에 실행된다

이후 캐쉬처리를 할 생각이다.

 

문제2

useEffect 훅의 의존성 배열에 필요한 모든 변수를 포함시키도록 강제하는 정책은 "Exhaustive-deps" 규칙입니다.

 이 규칙은 ESLint의 React Hook 규칙에 포함되어 있으며, react-hooks/exhaustive-deps라는 규칙으로 구현되어 있습니다.

 

 이 규칙을 사용하면, useEffect, useMemo, useCallback과 같은 훅의 의존성 배열에 필요한 모든 변수를 명시적으로 포함시키도록 강제할 수 있습니다. 이렇게 하면 버그를 방지하고 코드의 안정성을 높일 수 있습니다. ESLint 설정 파일에 다음과 같이 규칙을 추가하여 이 규칙을 활성화할 수 있습니다:

{
  "extends": [
    "react-app",
    "react-app/jest"
  ],
  "rules": {
    "react-hooks/exhaustive-deps": "warn"
  }
}
반응형

'프론트엔드 > TIL' 카테고리의 다른 글

[TIL] 타입 단언과 타입 가드  (0) 2023.09.20
[TIL] map key  (0) 2023.09.18
[TIL] npm 의존성과 Sember 버전지정자  (0) 2023.09.16
[TIL] 구조분해와 Recoil,그리고 map(),Promise.all  (0) 2023.09.15
[TIL] getServerSideProps  (0) 2023.09.14
Comments