Client Component
클라이언트 컴포넌트란 서버에서 미리 그려지긴 했지만 최종적으로는 브라우저에서 자바스크립트 번들과 함께 실행되어야 하는 컴포넌트입니다. 주로 사용자와 상호작용할 수 있는 UI를 제공하는게 목적입니다.
클라이언트 렌더링의 장점
브라우저에서 컴포넌트가 그려지게 되면 다음 2가지 장점이 있습니다.
- 사용자 인터렉션 대응 : useState, useEffect, 이벤트 핸들러 등을 선언하여 사용자의 입출력을 제어할 수 있습니다.
- 브라우저 API 사용 : 로컬 스토리지, setTimeout 등 브라우저 API를 사용할 수 있습니다.
클라이언트 컴포넌트 기본
클라이언트 컴포넌트를 사용하려면 컴포넌트 파일 최상단에 'use client'
를 선언합니다. 이렇게 선언하고 나면 해당 컴포넌트에서 임포트하는 모든 파일들이 모두 클라이언트 모듈이 됩니다. 예) 자식 컴포넌트, 유틸 함수 등
만약 특정 컴포넌트에 useState, onClick 등 상태나 이벤트 핸들러를 선언하고 싶다면 꼭 컴포넌트 파일 최상단에 'use client'
를 붙여야 합니다. 그렇지 않으면 다음과 같은 에러가 발생합니다.
위와 같은 에러가 나는 이유는 넥스트의 앱 라우터에서는 기본적으로 모든 컴포넌트가 다 서버 컴포넌트로 설정되어 있기 때문입니다. 따라서, 상태나 이벤트 핸들러를 사용하기 위해서는 꼭 'use client'
를 선언해 줘야 합니다.
여기서 주의해야 할 점은 모든 클라이언트 컴포넌트에 'use client'
를 붙일 필요가 없습니다. 한번 'use client'
를 붙였다면 해당 컴포넌트의 자식 컴포넌트들은 모두 클라이언트 컴포넌트로 간주됩니다. 따라서, 자식 컴포넌트들에는 'use client'
디렉티브를 붙이지 않아도 됩니다. 이렇게 'use client'
디렉티브는 서버와 클라이언트의 경계선이 되는데 이걸 네트워크 바운더리라고 표현합니다.