웹 애플리케이션을 만들 때 가장 중요한 것 중 하나는 사용자에게 컨텐츠를 어떻게 전달할 것인가이다. 웹 페이지를 렌더링하는 방법에는 여러 가지가 있고, 각 방법마다의 장점과 단점이 있다. 이 글에서는 웹 페이지 렌더링의 세 가지 주요 방법인 SSR(Server Side Rendering), CSR(Client Side Rendering), 그리고 SSG(Static Site Generation)에 대해 알아보고, 각각의 방법이 언제 사용되는지, 그리고 그 방법의 장단점은 무엇인지를 초보자도 이해할 수 있도록 상세하게 설명할 것이다.
SSR(Server Side Rendering)은 웹 페이지를 서버에서 렌더링하는 방식을 의미한다.
사용자가 웹 페이지에 접속 요청을 하면, 서버는 해당 페이지의 내용을 완전히 렌더링하여 사용자의 웹 브라우저로 HTML 형식의 완성된 페이지를 전송한다. 이렇게 되면 브라우저는 추가적인 JavaScript의 실행 없이 페이지를 바로 표시할 수 있게 된다.
Next.js는 SSR을 쉽게 구현할 수 있는 도구를 제공한다. 아래는 Next.js를 사용하여 간단한 SSR을 적용한 웹 페이지의 예시이다.
1. 데이터를 가져오는 함수 작성: 먼저, 서버에서 데이터를 가져오는 함수를 작성한다. 이 예시에서는 임의의 데이터를 반환하는 함수를 사용한다.
function fetchData() {
return {
title: "Next.js와 SSR",
content: "Next.js를 사용한 서버 사이드 렌더링에 대한 이해"
};
}
2. 페이지 렌더링:
Next.js에서는 getServerSideProps
라는 함수를 사용하여 서버에서 데이터를 가져오고, 이 데이터를 페이지 컴포넌트에 전달할 수 있다.
export async function getServerSideProps() {
const data = fetchData();
return {
props: { data }
};
}
function HomePage({ data }) {
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
export default HomePage;
위의 예제에서, getServerSideProps
는 서버에서만 실행되며, 이 함수를 통해 가져온 데이터는 HomePage
컴포넌트로 전달된다. 따라서 사용자는 HomePage
컴포넌트가 렌더링된 결과를 바로 볼 수 있다.
이처럼 Next.js를 사용하면 간단한 코드 몇 줄만으로 SSR을 적용할 수 있다. 웹 페이지의 로딩 속도를 향상시키고, SEO를 개선하려는 개발자들에게 SSR은 매우 유용한 도구가 될 수 있다.
SSR은 웹 애플리케이션에서 페이지를 서버에서 렌더링하는 방식이다. 이 방식은 특정 상황에서 큰 이점을 제공하지만, 몇몇 단점도 있다. 이를 이해하면 SSR이 자신의 프로젝트에 적합한지 판단하기 쉽다.
CSR(Client Side Rendering)은 서버에서 페이지를 미리 렌더링하는 것이 아니라, 클라이언트(즉, 사용자의 웹 브라우저)에서 페이지를 렌더링하는 방식이다.
사용자가 웹 페이지에 접속하면, 서버는 초기 HTML 구조를 제공하지 않고 JavaScript 파일만을 보내준다. 브라우저는 이 JavaScript를 실행하여 필요한 데이터를 API 호출 등을 통해 가져온 후, 웹 페이지를 구성한다.
이러한 방식은 초기 로딩 시간이 다소 길 수 있지만, 데이터나 뷰가 변경될 때 페이지 전체를 다시 로드하지 않고 변화된 부분만 업데이트하기 때문에 사용자 경험을 부드럽게 만들어 준다.
CSR을 구현할 때 React.js만 사용해도 충분한다. 그런데 Next.js를 사용하는 것은 React.js만 사용하는 것보다 몇 가지 큰 이점이 있다. 다음은 Next.js의 주요 특징 및 이점입니다:
/pages/api
안에 API 라우트를 만들어 백엔드 로직을 간단하게 처리할 수 있다. 이를 통해 별도의 서버 없이도 API 요청을 처리할 수 있다.즉, CSR만 필요하다면 React.js만으로도 충분하겠지만, 웹 애플리케이션의 성장과 확장성, 다양한 렌더링 방식의 필요성, 최적화 기능 등을 고려한다면 Next.js를 사용하는 것이 많은 장점을 가지게 된다.
import { useEffect, useState } from 'react';
function HomePage() {
const [data, setData] = useState({ title: '', content: '' });
useEffect(() => {
async function fetchData() {
// 여기서 실제 데이터를 API 호출로 가져올 수 있다.
// 예제에서는 setTimeout을 사용하여 비동기 처리를 시뮬레이션한다.
const mockData = await new Promise(resolve => {
setTimeout(() => {
resolve({
title: 'CSR로 렌더링된 제목',
content: 'CSR로 렌더링된 내용이다.'
});
}, 1000);
});
setData(mockData);
}
fetchData();
}, []);
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
export default HomePage;
이 코드는 Next.js 프로젝트 내에서 CSR 방식으로 데이터를 불러와 렌더링하는 예제이다. useEffect
와 useState
는 React의 Hooks로, 컴포넌트의 상태 관리와 생명주기를 관리하는 데 사용된다.
코드에서 useEffect
내부의 fetchData
함수는 웹 페이지가 처음 로드될 때 한 번만 실행되어 비동기적으로 데이터를 가져온 후, 이를 상태로 설정한다. 이렇게 가져온 데이터는 그 후 컴포넌트에서 렌더링된다.
CSR(Client Side Rendering)은 모든 렌더링 작업이 브라우저(클라이언트 측)에서 이루어지는 방식을 말한다.
이러한 접근법은 웹 애플리케이션의 동적인 부분들을 처리하기에 유용하며, 특히 SPA(Single Page Application)와 같은 현대의 웹 애플리케이션에서 자주 사용된다.
이러한 장점과 단점을 종합해 보면, CSR은 특정한 웹 애플리케이션에서 매우 효과적일 수 있지만, 사용하기 전에 그 애플리케이션의 요구 사항과 일치하는지 확인하는 것이 중요하다.
SSG(Static Site Generation)은 사전에 모든 웹페이지를 정적 파일로 생성하는 방식을 의미한다.
이렇게 생성된 웹페이지는 서버에 요청할 때마다 동일한 파일을 고객에게 제공한다. 이 방식은 블로그, 마케팅 웹사이트, 문서 사이트 등 내용이 자주 바뀌지 않는 웹사이트에 이상적이다.
export async function getStaticProps() {
const data = await fetchData(); // 외부 데이터를 가져오는 함수
return {
props: { data }
};
}
function BlogPage({ data }) {
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
export default BlogPage;
위 코드는 Next.js의 SSG 기능을 활용하여 블로그 페이지를 정적으로 생성하는 예시이다. getStaticProps
함수는 빌드 시점에 실행되어 데이터를 가져오고, 해당 데이터를 사용하여 정적 페이지를 생성한다.
이렇게 SSG는 특정 상황과 요구 사항에 따라 매우 유용할 수 있다. 하지만, 애플리케이션의 특성과 필요한 기능을 고려하여 적절한 렌더링 방식을 선택하는 것이 중요하다.
웹 개발에서 렌더링은 매우 중요한 부분을 차지하고 있다. SSR, CSR, 그리고 SSG는 각각의 환경과 요구 사항에 따라 탁월한 성능을 발휘할 수 있다. 하나의 방법이 모든 상황에서 가장 좋다고 말할 수는 없다. 여러분이 개발하고자 하는 웹 사이트나 애플리케이션의 특성, 그리고 사용자의 요구 사항을 잘 파악하고, 이 글에서 소개한 세 가지 방법의 장단점을 고려하여 최적의 방법을 선택하는 것이 중요하다.
[Next.js] SSR, SSG, CSR 언제 사용하는것이 좋을까 - 적절한 활용 사례 |
---|
[Next.js] 3가지 렌더링 SSR, CSR, SSG 이해하기: 장단점 분석 |
[Next.js] 환경변수를 사용하는 간단한 방법 |
CloneCoding
한 줄의 코드에서 시작되는 혁신!