# 2. Rendering 흐름 & Lifecycle
## SSR → Hydration → CSR 전환 흐름
Nuxt SSR은 세 단계로 구성된다.
```
[브라우저 요청]
↓
[서버] setup() 실행 → HTML 생성 → 클라이언트로 전송
↓
[브라우저] HTML 즉시 표시 (사용자에게 보임)
↓
[브라우저] Vue JS 로드 → Hydration (서버 HTML에 이벤트 연결)
↓
[브라우저] onMounted() 실행 → 완전한 SPA처럼 동작
```
---
## Lifecycle 훅 실행 위치
| 훅 | 서버 | 클라이언트 | 설명 |
|----|------|------------|------|
| `setup()` | ✅ | ✅ | 컴포넌트 초기화, 양쪽 모두 실행 |
| `onServerPrefetch()` | ✅ | ❌ | 서버에서만 실행, SSR용 데이터 페칭 |
| `onBeforeMount()` | ❌ | ✅ | DOM 마운트 직전 |
| `onMounted()` | ❌ | ✅ | DOM 마운트 완료, 브라우저 API 사용 가능 |
| `onBeforeUnmount()` | ❌ | ✅ | 컴포넌트 제거 직전 |
| `onUnmounted()` | ❌ | ✅ | 컴포넌트 제거 완료 |
---
## 실전 코드 예시
### setup()에서의 서버/클라이언트 분기
```vue
```
### onServerPrefetch — 서버에서 데이터 미리 준비
```vue
```
> `useAsyncData` / `useFetch`가 내부적으로 `onServerPrefetch`를 사용한다.
> 직접 쓸 일은 드물지만, 동작 원리 이해에 중요하다.
### onMounted — 브라우저 전용 작업
```vue
```
---
## Hydration이란?
서버가 생성한 정적 HTML에 Vue의 반응형 시스템과 이벤트 핸들러를 연결하는 과정이다.
```
서버 HTML: ← 이벤트 없음
↓ Hydration
클라이언트: ← 이벤트 연결됨
```
### Hydration 불일치(Mismatch) 주의
서버와 클라이언트에서 다른 결과를 렌더링하면 경고가 발생한다.
```vue
로딩 중...
```
---
## Nuxt 전용 훅 (useNuxtApp)
```vue
```
---
## 요약
```
서버 실행: setup() → onServerPrefetch()
↓
HTML 생성 및 전송
↓
클라이언트 수신: HTML 즉시 표시
↓
Hydration (JS 연결)
↓
setup() → onBeforeMount() → onMounted()
↓
이후 SPA처럼 동작
```