Next.js 서버 사이드 렌더링(SSR) 예제 분석
2025. 2. 28. 17:49ㆍ프론트엔드/Next JS
728x90
Next.js 서버 사이드 렌더링(SSR) 예제 분석
이 코드는 Next.js 프로젝트에서 **서버 사이드 렌더링(SSR)**을 활용하여 도서 목록을 표시하는 컴포넌트입니다. 주요 기능은 다음과 같습니다.
- getServerSideProps를 사용하여 서버에서 데이터를 가져옴
- 가져온 데이터를 Home 컴포넌트에 전달하여 화면에 렌더링
- useEffect를 이용하여 브라우저에서 실행되는 코드와 서버에서 실행되는 코드 구분
- SearchableLayout을 사용하여 페이지에 검색 기능 적용
이제 코드의 각 부분을 자세히 살펴보겠습니다.
📌 1. 서버 사이드 렌더링(SSR) - getServerSideProps
export const getServerSideProps = () => {
console.log("서버사이드프롭스에요"); // 서버에서 실행됨
const data = "hello";
return {
props: {
data,
},
};
};
🔹 getServerSideProps란?
- Next.js에서 **서버 사이드 렌더링(SSR)**을 사용하려면 getServerSideProps 함수를 정의해야 합니다.
- 이 함수는 서버에서 실행되며, 컴포넌트보다 먼저 실행됩니다.
- 여기서 반환하는 props 객체는 해당 페이지 컴포넌트로 전달됩니다.
🔹 실행 순서
- 사용자가 페이지에 접근하면 서버에서 getServerSideProps가 실행됩니다.
- 서버에서 데이터를 가져오고, 그 데이터를 props로 전달합니다.
- Home 컴포넌트가 data를 받아 화면을 렌더링합니다.
🔹 주의할 점
- 브라우저에서는 실행되지 않습니다.
→ window 객체를 사용할 수 없습니다. - console.log는 브라우저가 아닌 서버 터미널에서 확인할 수 있습니다.
📌 2. Home 컴포넌트 - 서버에서 받은 데이터 활용
export default function Home({
data,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
console.log(data); // 서버와 브라우저에서 실행됨
useEffect(() => {
console.log(window); // 브라우저에서 실행됨
}, []);
🔹 data의 흐름
- getServerSideProps에서 반환한 { props: { data } } 값이 Home 컴포넌트의 props로 전달됩니다.
- data는 서버에서 먼저 콘솔에 찍히고, 이후 브라우저에서도 찍힙니다.
🔹 useEffect를 사용하는 이유
- console.log(window);는 클라이언트에서만 실행되어야 합니다.
- 하지만 Next.js는 서버에서도 실행되므로 useEffect 내부에서 window를 사용해야 오류가 발생하지 않습니다.
📌 3. 도서 목록 렌더링
import books from "@/mock/books.json";
import BookItem from "@/components/book-item";
- books.json 파일에서 도서 데이터를 불러옵니다.
- BookItem 컴포넌트를 사용하여 책 정보를 표시합니다.
<section>
<h3>지금 추천하는 도서</h3>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
<section>
<h3>등록된 모든 도서</h3>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
- books.map(...)을 이용해 BookItem을 여러 개 생성합니다.
- key={book.id}는 React에서 리스트를 렌더링할 때 필수적인 속성입니다.
📌 4. 페이지 레이아웃 지정 - getLayout
Home.getLayout = (page: ReactNode) => {
return <SearchableLayout>{page}</SearchableLayout>;
};
🔹 getLayout이란?
- Next.js에서는 특정 페이지에만 다른 레이아웃을 적용하고 싶을 때 getLayout을 사용할 수 있습니다.
- 여기서는 SearchableLayout을 적용하여 검색 기능이 있는 레이아웃을 사용하고 있습니다.
📌 5. CSS Module 스타일 적용
import style from "./index.module.css";
- index.module.css는 CSS Module을 사용한 스타일 파일입니다.
- 이를 통해 className={style.container}처럼 고유한 클래스명을 적용할 수 있습니다.
<div className={style.container}>
- style.container를 적용하여 index.module.css의 스타일을 사용할 수 있습니다.
📌 실행 흐름 정리
- getServerSideProps가 서버에서 실행되며 데이터를 가져옴.
- 서버에서 가져온 데이터가 Home 컴포넌트의 props로 전달됨.
- Home 컴포넌트에서 데이터를 받아 화면을 렌더링.
- useEffect를 사용하여 클라이언트에서만 실행되는 코드 처리.
- getLayout을 이용해 검색 기능이 포함된 SearchableLayout 적용.
📌 마무리
이제 Next.js에서 **서버 사이드 렌더링(SSR)**을 사용하는 방법을 이해했을 것입니다. 이 방식은 초기 페이지 로딩 시 데이터를 서버에서 가져와 SEO 최적화와 성능 개선에 유리합니다.
✅ getServerSideProps는 서버에서만 실행되므로 클라이언트 전용 코드는 useEffect에서 처리해야 합니다.
✅ getLayout을 사용하면 페이지별로 다른 레이아웃을 적용할 수 있습니다.
✅ CSS Module을 사용하여 컴포넌트별로 스타일을 안전하게 관리할 수 있습니다.
728x90
'프론트엔드 > Next JS' 카테고리의 다른 글
| 📌 API 통신 방법 정리 (컴공 회의실) (0) | 2025.03.01 |
|---|---|
| 🚀 Windows에서 npm 실행 오류 해결 방법 (Execution Policy 문제) (1) | 2025.02.28 |
| 프로그래머스 코드챌린지: 서버 증설 횟수 최적화 분석 (1) | 2025.02.28 |
| 🔥 프론트엔드 개발 면접 정리: JavaScript, React, TypeScript, Next.js, 성능 최적화 총정리 (1) | 2025.02.28 |
| cacheTime VS staleTime (2) | 2025.02.27 |