해결된 질문
작성
·
105
0
강의 이외에, 추가적으로 서버 컴포넌트에 대해 궁금증이 생겨 여러 블로그를 참고 하는 와중, 하나 헷갈리는 개념이 있어 여쭤 보려고 합니다.
<알고 싶은 내용>
서버 컴포넌트의 등장 배경 중 "waterfall 문제" 라는 내용이 알맞는 내용인 지 궁금합니다.
<과정>
제가 참고했던 여러 블로그에서 공통적으로 언급한 내용 중 하나가 "서버 컴포넌트의 등장 배경 중 하나로 클라이언트 컴포넌트의 waterfall 문제 " 라는 내용이 있었습니다.
그리고, 위의 문제는 서버 컴포넌트 도입 이후, 데이터 요청을 서버에서 사전에 처리하여 해결되었다고 간단히 설명하고 마치는 내용이었습니다.
<제가 헷갈리는 부분>
그렇다면 waterfall 문제는 결국, 서버 컴포넌트 이전의 SSR 방식으로도 해결 수 있는 문제가 아닐까? " 라는 의문이 들었습니다.
이유는 SSR 방식 역시 서버에서 데이터를 미리 가져와 HTML을 생성한 후 클라이언트에 전달하기 때문에, 서버 컴포넌트가 waterfall 문제를 해결했다면 기존 SSR 방식으로도 해결할 수 있지 않을까 하는 생각이 들었습니다.
<결과>
위의 내용을 알아보기 위해 아래의 내용을 바탕으로 검색을 해봤지만, 확실한 대답을 찾지 못해 질문을 남겨봅니다.
SSR 렌더링 방식에서 waterfall 문제가 발생하는 지의 여부
SSR과 RSC의 차이
답변 2
0
안녕하세요 이정환입니다.
우선 waterfall이 아예 발생하지 않을 수는 없습니다. 어떤 방식이든 조금이라도 기다려야 하는 구간이 생길 수 밖에 없기 때문이죠. 따라서 이 문제의 핵심은 특정 시점(예를 들어 FCP 등)까지 얼만큼의 딜레이가 발생해야 하는지를 논하는게 더 중요한 것 같습니다.
먼저 CSR의 경우에는 아래 그림과 같이 강의에서 안내드리고 있는 것 처럼 최초 접속시에 서버와 브라우저가 HTML을 JS Bundle을 받아 실행한 뒤가 되어서야 FCP가 이루어집니다. 이 방식에서는 브라우저가 JS Bundle을 직접 실행할 때 까지 화면이 등장하지 않기 때문에 FCP가 늦어지게 됩니다.
SSR은 CSR의 이런 단점을 해결합니다.
SSR의 경우에는 아래 그림과 같이 서버 측에서 JS를 미리 실행하여 완성된 HTML 페이지를 한방에 브라우저에게 보내주게 됩니다. 그 결과 CSR 방식에 비해 FCP 까지의 시점이 단축됩니다.
추가로 RSC는 FCP를 앞당길 수 있는 기술이 아닙니다. 엄밀히 말하자면 RSC는 클라이언트에게 전달되는 JS Bundle의 용량을 줄이기 위해 사용되어 FCP가 아닌 TTI까지의 딜레이를 단축하기 위한 기술입니다.
이 내용은 우리 강의의 3.4 챕터 "리액트 서버 컴포넌트 이해하기" 에서 아주 자세히 소개하고 있으니 해당 부분을 주의깊게 다시 살펴보시면 어떨까 싶습니다!
0
안녕하세요, 인프런 AI 인턴입니다. 이준구 님의 질문에 대해 서버 컴포넌트와 SSR의 차이, 그리고 ‘waterfall 문제’에 대해 설명드리겠습니다.
Waterfall 문제
란 주로 클라이언트 측에서 발생하는 요청의 체인으로 인해 데이터 로딩 및 화면 렌더링이 지연되는 문제를 말합니다. 클라이언트가 데이터 fetching을 각각의 컴포넌트마다 따로 수행하면서 전체적인 성능에 영향을 줄 수 있습니다.
서버 컴포넌트(RSC)는 클라이언트에서는 필요 없는 데이터 로딩을 줄이고 서버에서 데이터 fetching을 미리 수행해 클라이언트에 필요한 HTML과 필요한 데이터만 전달함으로써 이 문제를 해결하려고 도입되었습니다. 이는 클라이언트 측에서는 최소한의 JS 로딩만 담당하게 되어, 초기 로딩 속도를 향상시킵니다.
SSR(Server-Side Rendering)는 초기 요청 시에 서버에서 페이지를 완전히 그려 클라이언트에 초기 HTML을 제공하는 방식입니다. SSR도 초기 로딩에 유리하나, 이후 상호작용에서는 클라이언트 측 로직이 필요하게 되면서 ‘waterfall 문제’가 여전히 발생할 수 있습니다.
RSC는 서버에서 모든 컴포넌트가 실행되며, 컴포넌트 결과만 클라이언트에 전달됩니다. 따라서 각 컴포넌트의 데이터 fetching이 서버에서 미리 해결되어 데이터를 한번에 같이 내려주게 되어, 사전 요청 처리만으로도 클라이언트 측 로딩 시간을 줄일 수 있습니다.
추가로 확인하고 싶으신 부분은 Next.js 공식 문서나, 관련 강의에서 다뤄진 ‘리액트 서버 컴포넌트 이해’ 단원을 참조하시면 더욱 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
넵!! 구체적인 답변 감사합니다!!