WIKINext.js
플레이북

Next.js

화면(HTML)을 언제 만드느냐로 갈린다.

Next.js렌더링SSRCSRSSGReact프론트엔드 기초
프레임워크Java 개발자5분

한눈에

  • SSR = 요청마다 서버가 그 자리에서 HTML을 굽는다 (주문받고 조리, 항상 최신)
  • CSR = 서버는 빈 껍데기만, 브라우저 JS가 화면을 그린다 (재료만 받아 손님이 직접 조리)
  • SSG = 빌드 때 모든 페이지를 미리 HTML로 구워둔다 (진열대에 미리, 제일 빠름)
  • Java 대응 = JSP·Thymeleaf는 SSR, @RestController+프론트 SPA는 CSR 구조
  • Next.js = React 위에 얹힌 프레임워크 (화면을 언제·어디서 그릴지 정함)
  • 선택 기준 = 화면이 얼마나 자주 바뀌느냐 (거의 안 바뀜 SSG / 최신·개인화 SSR·CSR)

식당을 생각하면 편하다. 음식을 언제 만드느냐가 갈린다. 주문을 받고 그때부터 조리하면 항상 갓 만든 음식이 나오지만 손님이 좀 기다린다. 재료만 손님 테이블에 주고 직접 조리하게 하면 주방은 편한데 손님 자리에서 시간이 든다. 아니면 아예 미리 다 만들어 진열대에 올려두고 손님이 오면 바로 집어가게 한다. Next.js가 화면(HTML)을 만드는 방식이 딱 이 셋이다. 각각 SSR, CSR, SSG다.

Next.js는 React "위에 얹힌" 프레임워크다. React는 화면을 컴포넌트로 그리는 재료고, Next.js는 그 화면을 언제, 어디서 그릴지를 정해주는 틀이다.

화면을 언제 만드느냐, 세 가지

같은 결과(HTML)를 만드는데, 만드는 시점과 장소가 다르다.

  • SSR (Server-Side Rendering) — 요청이 올 때마다 서버가 그 자리에서 HTML을 굽는다. 주문받고 조리하는 식당. 항상 최신 데이터가 나오고 로그인한 사람마다 다른 화면을 줄 수 있다. 대신 요청마다 서버가 일한다.
  • CSR (Client-Side Rendering) — 서버는 거의 빈 껍데기 HTML만 주고, 브라우저가 자바스크립트를 돌려 화면을 그린다. 재료만 받아 손님이 직접 조리. 처음 화면이 뜨기까지 조금 걸리지만, 한 번 뜨면 이후 조작이 매끄럽다.
  • SSG (Static Site Generation)빌드할 때 미리 모든 페이지를 HTML로 구워둔다. 진열대에 미리 올려둔 음식. 요청이 오면 이미 구운 걸 즉시 내주니 제일 빠르다. 대신 내용이 바뀌면 다시 구워야(빌드) 한다.

Java로 서버 렌더링 해본 사람 기준 다리

새로운 개념이 아니라 이미 해본 것들이다. 자리만 이름이 바뀐 거다.

JSP·Thymeleaf ↔ SSR — 서버가 요청 때 HTML을 만들어 내려주던 그 방식
미리 만든 .html 정적 서빙 ↔ SSG — 완성된 HTML을 그대로 전달
@RestController(JSON) + 프론트 SPA ↔ CSR — 서버는 데이터만, 화면은 브라우저 JS가 그림
React ↔ 화면 그리는 재료 — Next.js는 그 위에 "언제 그릴지"를 얹은 프레임워크

Spring MVC에서 컨트롤러가 뷰 이름을 반환하고 서버가 HTML을 만들어 내려줬다면, 그게 정확히 SSR이 하는 일이다. 반대로 @RestController로 JSON만 주고 화면은 프론트가 그리게 했다면 그건 CSR 구조다. Next.js는 이 선택을 페이지 단위로 골라 쓰게 해준다는 게 다르다.

SSG로 화면이 나오기까지

이 블로그가 쓰는 방식인 SSG를 한 번 따라가 보면 감이 온다.

글(마크다운) 작성
이 노트 같은 콘텐츠를 파일로 씀
빌드 때 전부 HTML로 구움
npm run build — 모든 페이지를 미리 렌더링
정적 파일로 완성
서버 없이 파일 뭉치만 남음
요청 오면 즉시 전달
이미 구워둔 HTML을 그대로 내줌 — 제일 빠름

언제 뭘 쓰나

정답은 하나로 안 정해지고, 화면 내용이 얼마나 자주 바뀌느냐로 갈린다.

  • 거의 안 바뀌는 화면(블로그 글, 문서, 소개 페이지) — SSG. 미리 구워두는 게 제일 빠르고 서버도 필요 없다.
  • 요청마다 최신이어야 하거나 사람마다 다른 화면(대시보드, 주문 내역, 로그인 후 화면) — SSR 또는 CSR. 그때그때 만들거나 브라우저에서 채운다.
  • 실무에선 한 사이트 안에서 섞어 쓴다. Next.js의 강점이 바로 이 "페이지마다 골라 쓰기"다.

우리 프로젝트에선

지금 읽고 있는 이 0to1 블로그가 통째로 SSG다. Next.js 설정에 output: 'export'를 줘서, 서버 없이 빌드 때 모든 페이지를 HTML로 구워버린다. 매번 npm run build를 돌리는 게 정확히 그 "미리 다 굽는" 과정이다. 그래서 배포된 사이트엔 돌아가는 서버가 없고, 구워진 정적 파일 뭉치만 CDN에 올라가 있다.

덕분에 빠르고 배포가 단순하지만, 글을 고치면 반드시 다시 빌드해야 화면에 반영된다 — 진열대 음식을 새로 만들어 다시 올려두는 셈이다. 이 빌드를 밤마다 자동으로 돌리는 장치가 AI 하네스에 있다.

더 읽기

그림과 표로 셋을 더 풀어놓은 글들. 헷갈릴 때 하나씩.