서버 컴포넌트 와 클라이언트 컴포넌트에 대해서 이야기를 나누기 전에
메인 페이지로 돌아가보자. 이전에 제작한 사이트에서 localhost 3000번 포트로 돌아가게 되면 html 코드와 css코드로 구성된 페이지를 보게된다. 그러면 내 브라우저에 있는 클라이언트가 어떤식으로 html을 받게 되는걸까?
html 을 받는방법으로 2가지가 존재한다.
현재 방법은 클라이언트 사이드를 사용했다.
페이지를 이동했다면, 클라이언트는 우리 애플리케이션의 서버에게 리퀴스트를 보낸다.
서버측에서 텅빈 HTML 페이지를 보내주고 거기서 렌더링이 시작 된다. 또한 자바스크립트 번들도 제공하여 클라이언트가 자바스크립트 번들을 파싱해서 html을 렌더링한다.
많은 사람들이 여기서 헷갈려하는데, 한번 확인해보자
어느 홈페이지는 들어가서 콘솔을 들어가보면,
이런식으로 요소에 html코드가 왕창 적혀있다.
여기서 콘솔을 클릭하여 자바스크립트 코드를 작성해서 h1 코드를 만들어보자
const h1Element= document.createElement("h1")
이렇게 해주고 호출하면 당연히 값이 나타난다!
텅빈 h1에 값을 집어넣어보자
h1Element.value = "hello"
그리고 클라이먼트에 append 해서 h1을 추가해보자
사이트에서 집어넣고싶은 곳을 선택해서 해당 공간의 클래스네임이 뭔지 찾은 다음
이런 식으로 컨테이너를 선언해준다.
마지막으로 콘솔에서 생성한 heElement
를 append해주면?
하단에 h1이 생성된걸 볼수 있다.
이게 바로 클라이언트 사이드 렌더링이다.
텅빈 html을 받고, 서버에서 제공한 자바스크립트 번들을 파싱해서 value 값을 가진 html를 렌더링하는 것이다
서버 사이드 렌더링은 조금 다른 방식으로 렌더링이 진행된다.
next.js 에서는 이 두가지의 방법을 모두 사용한다. 클라이언트 컴포넌트를 가질수 있고, 서버 컴포넌트도 가질수 있다.
왜 굳이? 라고 생각할수 있다.
server components
- 성능 측면에서 활용할수있는 훌륭한 컴포넌트
- 서버에서 렌더되어 클라이언트로 보내지는 컴포넌트를 뜻하며, 이것은 곧, 렌더링하면서 활용된 디펜던시들 또한 서버에 머물러있어서 클라이언트에 디펜던시를 전달해줄 필요가 없게된다. (성능 개선)
- 당연히 처음 로드 될때도 파싱을 할 필요가 없으니 훨씬 빠르게 진행된다.
client components
- 맨위에 "use client"를 작성한 컴포넌트가 이에 해당한다.
- 기본적으로 앱 디렉토리에 존재하는 모든 컴포넌트는 서버 컴포넌트이다.
- 그런데 만약에 이걸 클라이언트 컴포넌트로 변경하고 싶다면, use client를 작성해서 선언을 해주면 된다.
- 그럼 이걸 언제 사용하는가? -> 클라이언트 hooks 를 사용하고 싶을때 (state, effect)
- 가능한 적은 빈도로 클라이언트 컴포넌트를 사용하는 것을 전반적인 목표로 잡는 것이 좋다.
물론 서버와 클라이언트 컴포넌트를 같이 사용해도 되지만, 일반적인 규칙이 존재하는데,
서버 컴포넌트가 있다면 클라이언트를 렌더링 할수 있지만, 클라이언트 컴포넌트는 서버 컴포넌트를 렌더링 할수 없다.
한가지 예외가 존재한다. 바로 서버 컴포넌트를 클라이언트 컴포넌트의 props로 받아서 전달 받아서 렌더링하는 경우이다.
server component
- 언제 쓸까?
client component
- 언제 쓸까?