SSR Fundamentals — 1 Pager
한마디: SSR의 본질에서 시작해서 프레임워크에 도달하는 여정.
프레임워크는 마법이 아니라 해결책의 모음이다.
핵심 아이디어 3개
# | 핵심 | 한 문장 |
1 | 본질 | 서버에서 HTML 형태로 응답을 만들어 보내요 — 20년 전 PHP와 같아요 |
2 | 진화 | 점점 더 넘기고 싶어짐 → 문제 발생 → 해결책 붙임 |
3 | 프레임워크 | 해결책들의 모음 — 마법이 아니라 당연한 확장 |
연역적 전개: 핵심 → 챕터
[핵심 1] 본질 = 서버에서 HTML 형태로 응답을 만들어 보내요
│
├─→ 0장: 시작하기
│ └─ 독자의 고통 공감 ("이 코드 어디서 실행되는 거야?")
│ └─ 문서의 약속 (읽고 나면 스스로 답할 수 있다)
│
├─→ 1장: 어떻게 여기까지 왔나 (역사 = 맥락)
│ ├─ 서버만 (PHP 시대) — 경계 없음, 단순
│ ├─ 클라만 (SPA) — 인터랙션 좋음, SEO/초기로딩 문제
│ └─ 둘 다 (현재) — 경계 발생 → 복잡성의 시작
│
└─→ 2장: SSR의 본질 (최소 구현)
├─ Express + 문자열 조합 — "이게 SSR이야?"
├─ React + renderToString — "React도 결국 문자열"
└─ 정리: "서버에서 HTML 형태로 응답을 만들어 보내요 - 이게 전부예요"
│
[핵심 2] 문제 → 해결책 (질문이 생기면 붙인다)
│
└─→ 3장: 살 붙이기
│
├─ 3-1: 라우팅
│ └─ 문제: URL이 여러 개면?
│ └─ 해결: 파일 기반 라우터
│
├─ 3-2: 데이터 페칭
│ └─ 문제: HTML 만들 때 데이터 필요하면?
│ └─ 해결: getServerSideProps
│ └─ 제약: 반환값은 직렬화 가능해야 함
│
├─ 3-3: Hydration
│ └─ 문제: 클라이언트 인터랙션도 필요하면?
│ └─ 해결: hydrate로 이벤트 연결
│ └─ 제약: 함수는 직렬화 불가 → 클라에서 재연결
│ └─ 함정: Hydration Mismatch
│
├─ 3-4: 코드 스플리팅
│ └─ 문제: JS 번들이 커지면?
│ └─ 해결: dynamic import
│
├─ 3-5: 이미지 프로세싱
│ └─ 문제: 이미지가 무거우면?
│ └─ 해결: next/image
│
└─ 3-6: 사전 렌더링
└─ 문제: 매번 새로 만들어야 해?
└─ 해결: SSG (빌드 타임), ISR (주기적 재생성)
│
[핵심 3] 프레임워크 = 해결책들의 추상화
│
└─→ 4장: 프레임워크가 해주는 것들
├─ 3장에서 붙인 것들의 정리
├─ "이걸 매번 직접 만들기 귀찮으니까 추상화"
└─ Next.js, Remix, Nuxt = 같은 문제를 푸는 도구들
│
[심화] 더 고도화된 해결책들
│
└─→ 5장: 심화 (2차 릴리즈)
│
├─ 5-1: 직렬화
│ └─ 근본 제약을 깊이 다룸
│ └─ JSON.stringify의 한계
│ └─ SSR에서 직렬화가 일어나는 모든 지점
│
├─ 5-2: Streaming SSR
│ └─ 문제: 느린 데이터 때문에 전체 대기
│ └─ 해결: 준비된 부분부터 보냄 (Fizz)
│ └─ 제약: renderToString이 동기 함수
│
├─ 5-3: React Server Components
│ └─ 문제: 서버 전용 코드가 번들에 포함
│ └─ 해결: 서버에서만 실행되는 컴포넌트
│ └─ 제약: 동형 컴포넌트의 한계
│
└─ 5-4: Edge Computing
└─ CDN에서 렌더링
Plain Text
복사
역사 = 맥락
왜 “서버 + 클라 둘 다”가 됐는지:
서버만 (PHP 시대)
↓ 브라우저가 강해짐
클라만 (SPA)
↓ SEO, 초기 로딩 문제
다시 서버로, 근데 둘 다
↓
경계가 생김 → 오늘날의 복잡성
Plain Text
복사
핵심 문장: “종착점은 항상 HTML이고, 다른 건 ’어디서 만드느냐’뿐이다.”
각 해결책의 “왜” (챕터 내 설명용)
해결책 | 문제 | 왜 이 문제가 생기나 (제약) |
Hydration | 함수가 안 넘어감 | 직렬화 불가 — 네트워크는 문자열만 전송 |
데이터 페칭 | 렌더링 전 데이터 필요 | 동기적으로 완료되어야 HTML 생성 가능 |
Streaming | 느린 데이터 때문에 전체 대기 | renderToString이 동기 함수 |
RSC | 서버 전용 코드가 번들에 포함 | 동형 컴포넌트의 한계 |
SSG/ISR | 매 요청마다 렌더링 비효율 | 서버 부하, 응답 시간 |
직렬화 = 많은 제약의 원천
- 함수
, Date 객체
, 클래스 인스턴스
- 이게 Hydration, getServerSideProps 제약 등의 근본 원인
흐름 한눈에
본질 이해 → 문제 만남 → 해결책 붙임 → 프레임워크 도달
2장 3장 4장 5장
Plain Text
복사
SSR FF가 하는 것
전체 그림 + 내부 공개
•
프레임워크가 “마법”이 아니라 “당연한 확장”으로 보임
•
새 기술 나와도 “또 다른 해결책”으로 보임
•
“이 코드가 어디서 실행되는 건데?” 질문에 스스로 답할 수 있음
파레토 요약
20%로 80% 설명:
•
본질 = HTML 형태로 응답을 만들어 보내요 — 이것만 알면 시작점이 잡혀요
•
직렬화 — 많은 제약의 원천 (각 챕터에서 설명)
•
문제 → 해결책 — 프레임워크는 이것들의 모음
체크리스트
이 1-pager만으로 SSR FF 구조가 이해되는가?
각 챕터가 “문제 → 해결책”에서 파생됨이 보이는가?
“마법이 아니라 해결책”이라는 메시지가 전달되는가?
메타
항목 | 내용 |
버전 | v2.0 |
대상 | 프론트엔드 개발자 (SSR 경험 유무 무관) |
분량 | 6장 (0-5장) + 심화 |
Root Lever | “본질에서 출발 → 문제 → 해결책 → 프레임워크” |
