학습 목표·선수 지식: 입력 상태를 필요한 하위 트리에 두고 렌더 비용을 비교합니다. 선수 지식: React props·state.
입력 반응과 초기 응답은 따로 측정합니다
SSR은 서버에서 HTML을 만드는 방식입니다. 서버 조회가 느리면 초기 응답도 느릴 수 있고, HTML이 빨리 도착해도 큰 클라이언트 렌더가 입력을 막을 수 있습니다. 화면이 느린 순간이 첫 방문인지 검색어 입력인지 먼저 구분합니다.
검색 상태를 사용하는 컴포넌트에 둡니다
아래는 기존 App Router 프로젝트의 app/page.tsx 전체 교체 예제입니다. 입력하면 대소문자를 무시한 목록과 건수가 바뀝니다. Summary는 SearchPanel의 형제이므로 검색 state 업데이트로 부모 Page가 다시 실행되지 않습니다. 항목이 세 개뿐이라 메모이제이션부터 추가하지 않습니다.
app/page.tsx · 전체 파일
"use client";
import { useState } from "react";
const items = ["App Router", "Server Component", "Suspense"];
function SearchPanel() {
const [keyword, setKeyword] = useState("");
const visible = items.filter((item) =>
item.toLowerCase().includes(keyword.toLowerCase()),
);
return (
<section>
<label>
검색{" "}
<input
value={keyword}
onChange={(event) => setKeyword(event.target.value)}
/>
</label>
<ul>
{visible.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
<p>{visible.length}건</p>
</section>
);
}
function Summary() {
return <aside>입력 상태와 무관한 안내</aside>;
}
export default function Page() {
return (
<main>
<h1>렌더 범위 비교</h1>
<SearchPanel />
<Summary />
</main>
);
}
수정 전과 후를 같은 조작으로 비교합니다
비교 전에는 keyword를 Page에 두고 SearchPanel에 props로 전달해 보세요. React DevTools Profiler 기록을 시작하고 같은 문자열 router를 입력합니다. Summary가 어느 커밋에 렌더됐는지 기록한 뒤 state를 위 코드처럼 옮겨 다시 측정합니다. React Compiler 사용 여부, Strict Mode, 기기와 목록 크기를 고정하세요. 개발 측정과 production 응답 속도를 섞지 않습니다.
| 관찰 | 다음 수정 | 기대 변화 |
|---|---|---|
| 형제 컴포넌트가 입력마다 렌더 | 상태 소유 위치 축소 | 관련 없는 형제 렌더 감소 |
| 필터 계산 자체가 오래 걸림 | 측정 후 useMemo·알고리즘 비교 | 같은 의존성에서 계산 재사용 |
| 긴 목록 DOM 생성이 지배적 | 페이지네이션·가상화 검토 | 동시에 만드는 요소 감소 |
| 큰 초기 JS 다운로드 | 클라이언트 경계·지연 로딩 검토 | 초기 전송량 감소 |
메모이제이션은 어떤 값을 재사용할까요?
| API | 재사용 대상 | 한계 |
|---|---|---|
| memo | 같은 props의 컴포넌트 결과 | 자체 state·context 변경은 렌더될 수 있음 |
| useMemo | 의존성이 같은 계산 결과 | 검색어가 바뀌면 필터 계산도 다시 필요 |
| useCallback | 함수 참조 | 함수 호출 비용 자체를 없애지 않음 |
프레임워크 이름만으로 성능 순위를 매기지 않습니다. 같은 데이터·렌더링 방식·빌드·기기에서 비교해야 원인을 해석할 수 있습니다. 이 글에서는 브라우저 Profiler 수치를 측정하지 않았으므로 속도 향상 퍼센트를 제시하지 않습니다.





관련 학습 자료
- https://react.dev/
- https://nextjs.org/
- https://developers.google.com/web/tools/lighthouse
- https://www.webpagetest.org/
- Next.js App Router 학습 순서: 라우팅, 렌더링, SEO, 배포까지
- Next.js 보안 패치 기준: v16.2.5 릴리스로 영향 범위 점검하기
- Firebase 초기화 구조: Next.js firebase.ts 설계 기준
공식 기준과 확인 범위
확인일: 2026-09-12. API 설명은 Next.js 16 App Router 기준이며 과거 릴리스 글은 본문의 태그 범위를 유지합니다. 부분 API 코드는 기존 프로젝트에 통합하는 예시입니다.
- https://react.dev/reference/react/Profiler
- https://react.dev/reference/react/memo
- https://react.dev/reference/react/useMemo
공식 자료 재확인: 2026-09-12. 이 글의 실행하지 않은 브라우저/배포 점검은 독자 확인 과제로 구분합니다.
이 글이 도움이 되었나요?
Next.js 학습 순서
필수 13개 · 전체 27개
읽음 기록 관리
전체 과정 목차 (27개)
- 필수 길잡이 · Next.js App Router 학습 순서: 설치부터 배포까지
- 필수 학습 · Next.js package.json: scripts dependencies 이해
- 필수 학습 · Next.js App Router로 만드는 첫 프로젝트 완성 실습 가이드
- 필수 학습 · Next.js에서 .next 폴더는 어떤 역할을 할까?
- 필수 학습 · Next.js 동적 라우트 완전 정리: [slug], params, catch-all
- 선택 참고 · Next.js params should be awaited 해결: App Router 기준
- 선택 참고 · Next.js window is not defined 오류 해결: 브라우저 API를 안전하게 쓰기
- 선택 참고 · Next.js hydration failed 오류 해결: 원인과 해결 방법
- 필수 학습 · Axios 사용법: React Next.js에서 API 요청 구조 잡는 법
- 선택 참고 · Next.js Route Handler 405 오류 해결: GET/POST 파일 위치와 메서드 설정 확인
- 필수 학습 · Next.js Server Actions + React Hook Form 검증 기준
- 선택 참고 · Next.js useSearchParams Suspense 오류 해결: 빌드 실패 기준
- 선택 참고 · Next.js fetch 캐시 문제 해결: 데이터가 바뀌었는데 화면이 그대로일 때
- 선택 참고 · Next.js Dynamic server usage 오류 해결: cookies headers 기준
- 선택 참고 · Next.js 환경변수 적용 오류 해결: .env.local을 바꿨는데 값이 안 바뀔 때
- 필수 학습 · Next.js Metadata API 완전 정리: 정적 metadata와 generateMetadata
- 선택 참고 · Next.js metadata가 적용되지 않을 때 확인할 7가지
- 선택 참고 · Next.js Image remotePatterns 오류 해결: 외부 이미지 도메인 허용하기
- 필수 학습 · Next.js redirects 설정: next.config.js에서 URL 이동 처리
- 필수 학습 · Next.js SEO 체크리스트: metadata·초기 HTML·OG 이미지 점검
- 선택 참고 · Next.js SEO 완전 가이드: App Router metadata부터 배포 확인까지
- 필수 학습 · Next.js 16 성능 최적화 체크리스트: 번들·이미지·캐시·배포
- 필수 학습 · Next.js 렌더링 성능 최적화: React 화면이 느릴 때 기준 현재 글
- 필수 학습 · Next.js 16 Proxy 마이그레이션: Node.js Runtime·matcher 검증
- 선택 참고 · Next.js 보안 패치 기준: v16.2.5 영향 범위 점검
- 선택 참고 · Next.js SEO SSR 적용법: 검색 노출과 렌더링 구조 잡기
- 시점·기록 · Next.js 16.3.0-canary.106의 useCache deprecation 경고와 hybrid not-found 수정 이해하기
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.