개발자

Next.js의 Suspense VS dynamic

2023년 10월 12일조회 786

https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic Lazy Loading을 사용하기 위해서 Next.js에서는 2가지의 방법을 제공하고있습니다. 1. dynamic 2. React.lazy + Suspense 또한, Next 의 Streaming 관련글을 읽다 보니 https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming#example 예제에서는 Suspense를 사용한 예제를 보여주는데 위의 예제에서는 dynamic을 사용하지 않고 Suspense를 사용한 이유가 궁금합니다. 처음 링크된 글을 읽었을때는 dynamic 함수가 React.lazy + suspense를 구현함 과 동시에 여러 옵션들을 제공하고 있어서 dynamic 함수가 더 좋다(?) 라고 생각을 하게 되었는데, dynamic과 suspense의 정확한 차이점이 궁금합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

인기 답변

정종윤님의 프로필 사진

Next.js의 Streaming 예제 코드에서 dynamic을 사용하지 않은 이유에 대해 질문 주셨군요. 제가 살펴보니 동적 임포트(Dynamic Import)의 경우에는 클라이언트 컴포넌트에서의 지연 로딩을, Suspense의 경우는 서버 컴포넌트에서의 지연 로딩에 각각 적합한 사용법인 듯 합니다. 첫 번째 링크의 문서를 살펴보면 그 근거를 알 수 있는데요, 서버 컴포넌트는 기본적으로 코드 스플리팅(code splitting)이 적용되고 지연 로딩은 클라이언트 컴포넌트에서만 가능하다고 나와 있네요. 심지어 서버 컴포넌트 그 자체를 dynamic 메서드로 로드한다고 해도 서버 컴포넌트 그 자체가 지연 로딩이 되는 게 아니라 내부의 클라이언트 컴포넌트만 지연 로딩 된다고 합니다. 이것은 사실 서버 컴포넌트의 특성을 생각해보면 당연한 것입니다. 서버 컴포넌트는 사용자의 요청에 맞춰 딱 한 번 실행되며, 그 결과물로 하이드레이션 가능한 상태의 페이로드를 만들어내야만 하기 때문이에요. 서버 컴포넌트의 로직은 같은 서버에서 동기적으로 실행되기 때문에 별도의 지연 로딩...? 이랄 것이 필요하지 않아요. 다만 이렇게 생성해야하는 페이로드 자체의 단위가 클 수도 있고, 데이터 패치 같은 비동기 로직이 포함될 수도 있으니 페이로드를 만들어내는 과정에서 시간이 오래 걸릴 수가 있습니다. 이러한 경우에는 서버 컴포넌트를 렌더하는데 오래 걸리는 부분을 Suspense로 잘게 쪼개고 별도의 UI를 띄우기 위해 Suspense로 컴포넌트를 감쌀 수 있겠죠. 이게 두 번째 링크인 Streaming을 통해 가능한 것입니다. (혹시라도 이 부분이 이해하기 어렵다면 서버 컴포넌트와 클라이언트 컴포넌트의 차이에 대해 조금 더 공부가 필요합니다.)

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 10월 12일

Next.js의 `dynamic` 와 React의 `Suspense` + `React.lazy` 는 모두 컴포넌트의 lazy loading을 가능케 하는 기능입니다. 1. dynamic: Next.js 고유의 기능으로, server-side rendering과 static site generation을 지원합니다. 또한 참조할 모듈을 동적으로 가져오기 때문에, 초기 로드 시 필요없는 코드를 줄일 수 있습니다. 추가로, 로딩 중이거나 에러가 발생했을 경우 보여줄 컴포넌트를 지정할 수 있는 장점이 있습니다. 2. Suspense + React.lazy : 이것은 React 16.6버전부터 도입된 기능으로, 앱에서 코드 스플리팅을 사용하기 쉽게 만들어 줍니다. `React.lazy`는 default export를 가진 모듈에서만 작동하며, 서버 사이드 렌더링은 아직 지원하지 않습니다. 다음과 같은 이유로 예시에서 Next.js의 dynamic 대신 Suspense를 사용했을 것으로 추측됩니다: - 상황에 따라 UI 표현이 달라져야 할 때 (예: 데이터 로드 후 폴백 UI 표시) Suspense를 사용하면 좋습니다. - data fetching library와 같은 react suspense를 강력하게 지원하는 도구와 함께 Suspense를 사용할 때 유용합니다. 즉, 서버 사이드 렌더링이 중요하지 않고 리액트 내장 기능으로 해결하고 싶을 때 Suspense와 React.lazy를 사용하면 편리하지만, 서버사이드렌더링과 추가적인 옵션을 활용하고 싶다면 Next.js의 dynamic를 사용하는 것이 좋습니다. 따라서 어떤 방법을 선택할 지는 프로젝트의 요구사항과 구조에 따라 달라질 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!