작성
·
269
·
수정됨
0
안녕하세요 제로초님.
이제 막 Next 강의 시작해서 기초부터 보고 있는데 이해가 되지 않는 부분이 있어 질문드립니다.
next/link에 관한 부분인데요.
공식문서보니까 next/link 사용시에 클라이언트 사이드 라우팅이 된다고 하는데
그 말인 즉슨 link에 해당하는 페이지 컴포넌트의 자바스크립트를 미리 받아놓고 사용자가 Link로 이동할 때 클라이언트에서 페이지를 생성한다는 뜻으로 이해했는데요.
그럼 이동하는 페이지 컴포넌트에 console.log("하이")가 있으면 클라이언트, 즉 브라우저에 console.log가 출력되어야하는 거 아닌가요?
하지만 제 예상과 다르게 Link로 이동한 페이지 컴포넌트의 console.log는 서버에 출력되네요.
1. "use client"를 명시하지 않은 컴포넌트는 모두 서버에서 렌더링 되는 컴포넌트다
2. Link로 이동하면 클라이언트 사이드 렌더링을 한다.
이 두 가지 개념이 어떻게 공존할 수 있는지, 위에 설명드린 케이스와 함께 잘 이해가 되지 않네요ㅜ
답변 2
0
서버컴포넌트는 서버에서 실행된 뒤 html부분만 클라이언트로 전달됩니다. 그래서 서버에서 콘솔로그가 출력되는 것이고요.
클라이안트 라우팅을 한다고 해도 서버컴포넌트를 클라이언트에서 실행하지 않습니다. 네트워크탭에서 페이지 데이터를 받는 것을 보실 수 있습니다.
네 그 파일이 sub 파일이 맞고요.
Link 컴포넌트의 특징은, 화면에 Link 태그가 보이면 그 주소 파일을 미리 불러옵니다. 프리페치가 맞고요.
/sub 으로 이동할 때 네트워크탭에 아무것도 없나요? 그런데 백엔드에서 그 때 콘솔로그가 찍히는 건 말이 안 됩니다.
https://test1-seven-ashen.vercel.app
네 /sub 으로 이동할 때 네트워크탭에 아무것도 새로 불러오지 않더라구요.
그래서 프리패치해서 가져온 sub파일로 렌더링한다고 생각했습니다.
2. npm run dev로 실행한 개발 환경에서는 /sub로 이동한 뒤 터미널에 console.log가 찍혔습니다. 배포환경에선 백엔드 console.log 확인하는 방법을 몰라서 어떻게 동작하는 지 모르겠네요.
결국 제가 궁금했던 건 Link로 이동했을 때 화면에 렌더링되어야하는 jsx코드와 javascript코드가 어떤 위치(클라이언트, 서버), 어떤 시점에서 실행되는 지가 궁금했는데 음.. 명확한 답을 얻기가 쉽지 않은 것 같아서
일단 Link를 사용하면 서버에서 완성한 파일(html 비슷한 무언가)을 프리패치하여 이동시에 클라이언트사이드 렌더링한다.
정도로 이해하고 넘어가려고 합니다;;ㅜㅜ
아아, 백엔드가 아니라 프론트서버입니다. 프론트서버에서 /sub 페이지 방문시 콘솔로그가 찍히는데 정작 브라우저에서는 /sub 페이지 요청이갔다고 프론트서버에 아무것도 안 보내는 게 이상한거긴 하거든요. 프론트서버가 브라우저가 /sub 페이지로 이동했는지 어떻게 알았을까하는 의문입니다.
아 프론트 서버라고 하는 군요.
개발 환경에서는 "/"에서 sub?_rsc=acgkz를 미리 받아오기도 하지만
"/sub"로 이동했을 때 네트워크탭에 sub?_rsc=acgkz가 또 불러와지는 걸 확인했습니다.
vercel에 배포한 것에선 "/sub"로 이동했을 때 아무것도 불러오지 않구요.
https://dev.to/peterlidee/static-and-dynamic-rendering-in-next-13-52gb
제가 봤을 때는 배포 후에는 서버컴포넌트이지만 스태틱렌더링이 적용된 것 같습니다. 빌드타임에 페이지가 확정되었으므로 링크 이동을 해도 프리페치 외에는 추가로 더 가져올 게 없는 것이죠. 다이나믹렌더링으로 전환되면 요청을 보낼 것 같네요.
0
안녕하세요, 인프런 AI 인턴입니다.
jin l님의 질문에 대해 답변을 드리겠습니다.
질문하신 내용은 Next.js의 <Link>
컴포넌트의 동작 방식과 클라이언트 측 렌더링(혹은 서버 측 렌더링)과 관련된 것입니다. <Link>
컴포넌트를 사용할 때 클라이언트 사이드 라우팅이 이루어지는데, 사용자가 링크를 클릭하면 브라우저의 JavaScript가 해당 페이지의 컴포넌트를 불러와 렌더링하게 됩니다. 이 때, 페이지에 console.log
가 있다면 이는 브라우저의 콘솔에서 확인할 수 있어야 정상입니다.
Next.js의 서버 렌더링 개념 중 “use client를 명시하지 않은 컴포넌트는 모두 서버에서 렌더링 되는 컴포넌트다”는 주로 Next.js 12 버전 이후부터 도입된 서버 컴포넌트에 대한 설명으로 보입니다. 서버 컴포넌트는 서버에서 렌더링되고 클라이언트로 전송되는 HTML을 생성합니다. 하지만, <Link>
로 페이지를 이동할 때에는 이런 서버 컴포넌트가 아니라, 클라이언트 컴포넌트가 활성화되어 클라이언트 사이드에서 동작합니다.
jin l님이 언급하신 상황에서 console.log
가 서버에 출력된다면, 다음과 같은 몇 가지 가능성을 고려해볼 수 있습니다:
getServerSideProps
나 getInitialProps
같은 데이터 가져오기 함수에서 콘솔 로그가 실행되는 경우<Link>
컴포넌트를 통하지 않고 서버 측 리다이렉션이 발생하는 경우이와 관련해 비슷한 유형의 질문에서 유사한 답변이 제공되었음을 확인하였습니다. 아래 링크를 참조하여 좀 더 자세히 알아볼 수 있습니다:
현 상황에서는 추가적인 코드 검사나 상황 설명이 필요할 수 있으므로, 문제가 지속된다면 자세한 코드와 실행 환경을 함께 공유해주시면 도움을 받으실 수 있을 것으로 보입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
https://test1-seven-ashen.vercel.app
개발환경과 프로덕션환경이 다른 것 같아서 임시로 배포해봤습니다.
"/", "/sub" 이 두 가지의 경로만 갖는 간단한 사이트입니다.
초기 "/" 경로로 진입했을 때 네트워크 탭을 확인하면 html 파일 하나와 여러js파일 그리고 파일 형식을 알 수 없는 sub?_rsc=acgkz를 불러옵니다.(해당 파일을 클릭하면 sub페이지가 보여집니다.) 그리고 Home에 있던 "/sub"에 대한 Link를 클릭해서 이동하면 네트워크 탭에선 아무것도 불러오지 않습니다.
1. 초기 페이지 로드시에는 서버로부터 완성된 html파일을 받아 렌더링한다.
2. 페이지에 Link가 있을 경우 서버에서 그에 해당하는 페이지 데이터를 프리패치한다. (sub?_rsc=acgkz)
3. 사용자가 페이지 이동시에 이미 완성된 sub?_rsc=acgkz로 새로운 화면을 렌더링한다.
이정도로 이해했는데 맞는지 모르겠습니다. 답변에서 말씀하신 html 부분이라는 게 sub?_rsc=acgkz 이게 맞는지도 궁금하구요.
그럼 Link 클릭하기 전에 클라이언트에서 이미 완성된 파일을 갖고 있다는 건데 그럼 "/sub"로 이동하기 전에 서버에서 sub?_rsc=acgkz를 완성하면서 console.log도 실행된걸까요? 아니면 sub?_rsc=acgkz 내부에 완성된 html 파일과 "/sub"로 이동했을 때 실행할 자바스크립트 로직이 분리되어 존재하고 있는 걸까요?
npm run dev로 실행한 환경에선 "/sub"로 이동했을 때 서버(터미널)에 console.log가 출력되었습니다.
질문이 많아서 죄송합니다. 검색도 해보고 공식문서도 보고 있는데 명확한 동작 원리를 파악하기가 어렵네요.