Search

1-pager

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
“본질에서 출발 → 문제 → 해결책 → 프레임워크”