Nextjs에서 외부 스크립트 로드 상태 확인하는 법

힘센캥거루
2025년 1월 24일(수정됨)
2
103
Nextjs에서 외부 스크립트 로드 상태 확인하는 법-1

1. 문제인식

Nextjs에서 Script의 로드 여부를 onLaod와 useState를 이용해 확인했더니 문제가 생겼다.

예를들면 아래와 같은 예제이다.

"use client";

import Script from "next/script";
import { useState } from "react";

export default function Page() {
  // useState로 스크립트 로드 확인
  // 스크립트가 로드되면 onLoad에서 scriptLoad 상태변경
  const [scriptLoad, setScriptLoad] = useState(false);
  return (
    <div>
      <Script
        src="https://example.com/sample.js"
        onLoad={() => setScriptLoad(true)}
      />
      {scriptLoad ? <div>로딩 완료!</div> : <div>로딩중!</div>}
    </div>
  );
}

이렇게 하면 최초에 컴포넌트가 마운트되고 스크립트가 로드 되면 scriptLoad의 상태가 false에서 true로 잘 변환된다.

문제는 한번 스크립트가 한번 로드되고 다시 컴포넌트가 마운트 될 때이다.

Nextjs에서 외부 스크립트 로드 상태 확인하는 법-2

기본적으로 Script 컴포넌트는 한번 마운트 되고나면 사용자가 Nextjs 내의 여러 경로로 이동하더라도 단 한번의 스크립트 로드를 보장한다.

따라서 해당 페이지를 한번 방문 후, 재방문할 때 스크립트가 이미 로드되어 있으므로 useState의 상태가 변경되지 않는다.

2. onLoad 대신 onReady 사용하기

아무리 검색해도 해결방법을 찾을 수 없어서 Script 컴포넌트에 대한 Nextjs의 공식문서를 확인해 보았다.

Script 컴포넌트는 총 5개의 프롭을 받을 수 있다.

Nextjs에서 외부 스크립트 로드 상태 확인하는 법-3
  • src : 스크립트 경로

  • strategy : 로딩 동장 미세 조정. 서버에서만 사용 가능.

  • onLoad : 스크립트 로드가 완료된 후 실행

  • onReady : 스크립트 로드가 완료되고 컴포넌트가 마운트 될 때마다 실행

  • onError : 스크립트 로드가 실패하면 실행

이 중에서 나는 onLoad를 썼기 때문에 최초에 스크립트가 로드될 때만 상태변화가 일어났던 것.

그냥 간단하게 onLoad를 onReady로 바꾸면 해결된다.

...
export default function Page() {
...
      <Script
        src="https://example.com/sample.js"
        onReady={() => setScriptLoad(true)}
      />
...

3. 후기

이것 하나 때문에 몇 시간을 고민했는지 모르겠다.

AI를 통해 의문을 해결하려고 했으나, 클로드도 챗지피티도 모두 explore 시절의 코드를 말하며 헛소리만 해대니 답답했다.

옆에서 누군가 끌어주는 사람이 있었으면 좋겠다는 생각이 절실하게 드는 하루였다.

Nextjs에서 외부 스크립트 로드 상태 확인하는 법-4

관련 글

Next.js 풀스택 블로그 개발기
Next.js 풀스택 블로그 개발기
웹개발을 처음 접한지 1년정도 되었을 때, 나만의 블로그를 갖고싶다는 생각을 하게 되었다.그래서 6개월 정도 여기에만 매달려서 만들어보게 되었다.프론트 앤드에서의 기능은 아래 김도형님의 블로그를 참고하는 것으로 충분할 듯하다.나도 mdx를 이용해 블로그를 만드는데는 채...
Caddy를 이용한 Nextjs 무중단 배포(로컬서버)
Caddy를 이용한 Nextjs 무중단 배포(로컬서버)
홈페이지에 뭔가 자꾸 얹고 싶은 욕심이 들 때 마다 빌드를 했더니, 그 사이에 가끔 접속하는 사람이 종종 있긴 한것 같다.그러다 보니 서치콘솔에서 점수가 점점 하락하는 현상이 발생했다.이대로는 안될 것 같아 무중단 배포를 하는 방법을 생각해 보게 되었다.1. 대표적인 ...
구글 검색 색인 자동화 - Web Search Indexing API
구글 검색 색인 자동화 - Web Search Indexing API
지난번 IndexNow에 이어, 구글도 자동화를 해보기로 했다.찾아보니 구글은 API로 Web Search Indexing이라는 걸 지원하고 있었다.1. 허용범위공식적으로 해당 API가 지원하는 범위는 채용공고와 스트리밍 영상 서비스이다.실시간이 중요한 내용에 대해 색...
검색 색인 생성 자동화 - IndexNow
검색 색인 생성 자동화 - IndexNow
Bing에 검색등록을 하다가 알게 되었는데, Bing에서는 IndexNow라는 기능을 제공한다.핵심은 API 키를 이용해서 글을 쓰자마자 바로 색인 요청을 날릴 수 있다는 것.아래와 같은 요청을 fetch로 만들고, 글쓰기에 연동해 놓으면 글을 DB에 저장함과 동시에 ...
Nextjs, React 서버 해킹당한 경험 - React2Shell
Nextjs, React 서버 해킹당한 경험 - React2Shell
맨 처음 보안 이슈를 접했던건 12월 5일 새벽이었다.리액트에서 인증 없이 원격 코드 실행이 가능하다는 것.해당 뉴스를 접하고 다른 사람에게 알렸지만, 나는 괜찮으려니 싶어 아무 생각없이 넘겼다.1. 해킹 흔적 발견그런데 블로그 코드를 업데이트 하려고 접속했더니 터미널...
블로그에 다국어 기능 추가하기(NextJS, next-intl, Vercel AI SDK)
블로그에 다국어 기능 추가하기(NextJS, next-intl, Vercel AI SDK)
최근 블로그에 다국어 기능이 필요하다는 생각이 들었다.그래서 next-intl을 이용해 다국어 서비스를 구현해보기로 했다.1.i18n먼저 다국어 서비스를 할 때는 지켜야 할 원칙들이 있다.이걸 internationalization이라고 하는데, 무척 길기에 첫글자 i와...

댓글을 불러오는 중...