작성
·
106
0
안녕하세요! 학습 중, 궁금한게 있어 질문 드립니다!
이번 무한 스크롤 과정에서는 클라이언트 컴포넌트가 사용되었는데, 순수 서버 컴포넌트로는 개발하기는 거의 불가능에 가깝다고 느껴졌습니다.
가정을 하면, "사용자의 동작 혹은 이벤트에 따라서 랜더링 요소가 변경되어야 한다" 면, 클라이언트 컴포넌트를 거의 사용해야 될 것 같다라고 생각이 됩니다.
이러한 케이스가 아니라면, 대부분 서버 컴포넌트로 하는것이 좋다(?) 라고 느껴집니다.
보안성...? 응답 성능적으로도, SEO 관점으로도...
혹시 위의 내용이 틀리거나, 또 다르게 판단을 해야될 기준? 같은게 있을까요?
답변 2
1
안녕하세요 🙂
말씀하신 것처럼~! Next.js에서는 다음과 같은 기준으로 컴포넌트를 구분하는 것이 좋습니다:
사용자 이벤트 처리가 필요할 때 (onClick, onChange 등)
상태 관리가 필요할 때 (useState, useReducer 등)
브라우저 API 사용이 필요할 때 (localStorage, window 객체 등)
생명주기 메서드나 useEffect가 필요할 때
무한 스크롤과 같이 사용자 인터랙션에 따른 UI 업데이트가 필요할 때
데이터 페칭이 필요할 때
서버 리소스에 직접 접근이 필요할 때
민감한 정보(API 키 등)를 사용할 때
SEO가 중요한 정적 콘텐츠를 렌더링할 때
클라이언트 번들 크기를 줄여야 할 때
Next.js의 가장 큰 강점은 하이브리드 렌더링 방식입니다. 같은 페이지 내에서도 각 부분의 특성에 맞게 서버와 클라이언트 컴포넌트를 조합할 수 있습니다.
Next.js에서는 다음과 같은 접근법이 권장됩니다:
기본적으로 서버 컴포넌트로 시작하기
페이지와 레이아웃은 서버 컴포넌트로 구성
데이터 페칭은 서버에서 처리
필요한 부분만 클라이언트 컴포넌트로 분리하기
인터랙티브 UI 요소만 'use client' 지시문으로 분리
컴포넌트 트리의 최대한 말단에 클라이언트 컴포넌트 배치
컴포넌트 합성 활용하기
서버에서 가져온 데이터를 클라이언트 컴포넌트에 props로 전달
서버 컴포넌트가 클라이언트 컴포넌트를 임포트하여 사용
이런 방식으로 SEO, 보안, 성능의 이점을 최대한 활용하면서도 강력한 사용자 경험을 제공할 수 있습니다 💪
0
안녕하세요, 인프런 AI 인턴입니다. BeakGwa님.
Next.js에서 서버 컴포넌트와 클라이언트 컴포넌트를 사용하는 기준에 대해 질문해 주셨네요. 서버 컴포넌트와 클라이언트 컴포넌트의 사용은 여러 가지 요인에 따라 결정되며, 몇 가지 주요 기준을 말씀드리겠습니다.
사용자 인터랙션: 사용자의 이벤트나 동작(예: 버튼 클릭, 입력 필드 업데이트 등)에 따라 컴포넌트의 상태가 변경되어야 하는 경우 클라이언트 컴포넌트를 사용해야 합니다. 서버 컴포넌트는 UI를 렌더링하지만, 상호작용을 처리할 수는 없습니다.
데이터 페칭: 서버 컴포넌트는 데이터를 서버에서 직접 가져올 수 있기 때문에 SEO에 유리합니다. 사용자가 페이지를 요청할 때 서버에서 데이터를 가져온 후, 완전한 HTML을 렌더링하여 보낼 수 있기 때문입니다.
성능: 서버 컴포넌트는 쓸데없는 JavaScript를 클라이언트에 전송하지 않기 때문에 초기 로딩 성능에 이점을 줄 수 있습니다. 클라이언트에서 JS를 적게 처리할 수 있어(gzip 및 압축된 형태로 전달) 더욱 빠른 응답이 가능합니다.
보안: 민감한 데이터를 다루거나 서버 측 비즈니스 로직 처리가 필요한 경우 서버 컴포넌트 사용이 적절합니다. 클라이언트에서 실행되는 JavaScript는 역공학 당하기 쉽기에 이러한 경우에 서버 컴포넌트가 도움을 줄 수 있습니다.
따라서 위의 기준을 고려하여 컴포넌트를 나누게 될 것입니다. 클라이언트 측에서 많은 인터랙션이 필요한 경우 클라이언트 컴포넌트를, 그 외의 경우 성능이나 보안 등을 고려하여 서버 컴포넌트를 선택하면 좋습니다.
더 깊이 있는 이해를 돕기 위해 관련 질문 링크를 제공해 드립니다:
- 서버/클라이언트 컴포넌트에 대한 질문과 답변
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.