728x90
728x90
서버 컴포넌트와 클라이언트 컴포넌트
들어가며
- Next.js는 서버 컴포넌트와 클라이언트 컴포넌트의 개념을 도입한 리액트 기반의 풀스택(Full-Stack) 프레임워크이다.
- Next.js는 단순히 프론트엔드 라이브러리인 리액트를 넘어 서버 측에서도 코드를 실행할 수 있는 기능을 제공한다.
서버 컴포넌트
개념
- Next.js 프로젝트에서는 모든 리액트 컴포넌트가 기본적으로 서버에서 렌더링 된다.
- 이 컴포넌트들을 서버 컴포넌트라고 하며, 브라우저가 아닌 서버에서 실행된다.
예
- 다음과 같이 컴포넌트에 로그를 출력하면, 웹 브라우저 개발자 도구(클라이언트 단)가 아닌, IDE(서버 단)의 터미널에서 로그를 확인할 수 있다.
장점
성능 향상
- 클라이언트 측에서 다운로드해야 할 자바스크립트(JS) 코드가 줄어든다.
SEO 개선
- 서버 단에서 모든 컴포넌트를 실행하여 렌더링한 결과를 클라이언트 단으로 보내고, 클라이언트 단에서 해당 내용을 표시한다.
- 페이지의 모든 내용들을 웹 브라우저의 개발자 도구를 통해 확인할 수 있다.
- 웹 검색 크롤러가 모든 페이지 콘텐츠를 확인하고 내용을 수집할 수 있다.
클라이언트 컴포넌트
개념
- 일부 컴포넌트는 클라이언트 측에서만 사용할 수 있는 기능(@useState@, @useEffect@, 이벤트 핸들러 등)을 포함하기 때문에 클라이언트에서 렌더링되어야 한다.
- Next.js에서 특정 컴포넌트가 클라이언트 단에서 실행되도록 하려면 @use client@ 지시어를 사용하여 해당 컴포넌트를 클라이언트 컴포넌트로 지정하면 된다.
'use client';
import { useEffect, useState } from 'react';
import Image from 'next/image';
import burgerImg from '@/assets/burger.jpg';
import curryImg from '@/assets/curry.jpg';
import dumplingsImg from '@/assets/dumplings.jpg';
import macncheeseImg from '@/assets/macncheese.jpg';
import pizzaImg from '@/assets/pizza.jpg';
import schnitzelImg from '@/assets/schnitzel.jpg';
import tomatoSaladImg from '@/assets/tomato-salad.jpg';
import classes from './image-slideshow.module.css';
const images = [
{ image: burgerImg, alt: 'A delicious, juicy burger' },
{ image: curryImg, alt: 'A delicious, spicy curry' },
{ image: dumplingsImg, alt: 'Steamed dumplings' },
{ image: macncheeseImg, alt: 'Mac and cheese' },
{ image: pizzaImg, alt: 'A delicious pizza' },
{ image: schnitzelImg, alt: 'A delicious schnitzel' },
{ image: tomatoSaladImg, alt: 'A delicious tomato salad' },
];
export default function ImageSlideshow() {
const [currentImageIndex, setCurrentImageIndex] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCurrentImageIndex((prevIndex) =>
prevIndex < images.length - 1 ? prevIndex + 1 : 0
);
}, 5000);
return () => clearInterval(interval);
}, []);
return (
<div className={classes.slideshow}>
{images.map((image, index) => (
<Image
key={index}
src={image.image}
className={index === currentImageIndex ? classes.active : ''}
alt={image.alt}
/>
))}
</div>
);
}
주의
- @use client@ 지시어를 사용하지 않고 클라이언트 컴포넌트에서만 사용할 수 있는 기능을 사용할 경우, 빌드 과정에서 오류가 발생한다.
정리
- Next.js를 사용하면 서버 컴포넌트와 클라이언트 컴포넌트를 적절히 활용하여 성능을 최적화하고 SEO를 개선할 수 있다.
- 기본적으로 모든 컴포넌트는 서버 컴포넌트로 렌더링되며, 클라이언트 컴포넌트가 필요한 경우 @use client@ 지시어를 사용하여 지정할 수 있다.
참고 사이트
728x90
728x90
'Framework > Next.js' 카테고리의 다른 글
[Next.js] 테마 토글 기능 설정하기 (with shadcn/ui) (0) | 2024.11.05 |
---|---|
[Next.js] 갑자기 "'next'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다." 오류가 발생할 때 해결 방법 (0) | 2024.10.30 |
[Next.js] 환경 변수 사용 방법 (1) | 2024.10.29 |
[Next.js] 폴더 구조 및 동적 경로 설정하기 (0) | 2024.10.16 |
[Next.js] 정적 생성(Static Generation)과 서버사이드 렌더링(Server-side Rendering) (0) | 2024.08.08 |
[Next.js] 메타데이터(Metadata) 추가하기 (0) | 2024.08.07 |
[Next.js] Image 컴포넌트 (0) | 2024.08.05 |