POC 계측 — 갈래 1·2 비교
인쇄 버튼을 누른 뒤 대화상자가 뜨기까지를 세 구간으로 쪼개 재고, 표본별 페이지당 행 수를 남긴다. 조판 경로는 손대지 않는다 — DOM 실측이 느린 것 자체가 비교 대상이다. 갈래를 바꿔도 본문과 표본, 건수는 그대로고 폼이 던지는 주소만 바뀐다.
POC 는 세 갈래 모두 인증을 걸지 않는다. 감사 로그와 오픈 렌더러는 측정 대상이 아니라 설계 판단으로 남으므로, 갈래를 가르는 축은 조판을 어디서 하나와 데이터를 누가 넣나 둘뿐이다.
측정 프로토콜
next dev로 잰 값은 쓰지 않는다. 개발 서버는 요청마다 컴파일하고 StrictMode 가 조판을 두 번 돌린다.pnpm build && pnpm start또는 배포본에서 잰다.- 저사양 기기에서 잰다. 설계가 SSR 을 고른 1순위 근거가 저사양이라 고사양 수치로는 판정이 안 된다. 같은 기기가 없으면 DevTools 의 CPU 4x~6x slowdown 으로 대신하고 어느 쪽인지 기록에 남긴다.
- 인쇄 대화상자는 뜨자마자 Esc 로 닫는다. 구간 C 가
print()반환까지라 사람이 늦게 닫으면 그만큼 늘어난다. - 표본마다 4,000건을 세 번씩 돌려 가운데 값을 쓴다. 첫 실행은 콜드 스타트와 폰트 로드가 섞인다.
이 기기에서 잰 값
측정 결과가 없다. 위에서 표본과 건수를 골라 실행하면 뷰어 탭이 여기로 기록을 보낸다.
공통 기반 서버 조판 확인
갈래가 아니다. 갈래 2·3 이 올라설 서버 조판 모듈과 문서 껍데기가 브라우저에서 끝까지 동작하는지 보는 자리다(HDIT-3099). 조판 데이터를 밖에서 받지 않고 표본 생성기로 직접 만든다. 분할 결과만 보기 는 문서 대신 총 페이지 수와 페이지별 행 수를 돌려준다 — 위 기준선과 대조할 때 쓴다.
저장소에 커밋된 기준선 — 갈래 1
갈래 2·3 이 비교할 대상이다. 새로 재지 않아도 읽을 수 있게 모듈로 둔다.
페이지당 행 수 정본 — rowsPerPage.measured.ts
| 표본 | 방향 | 첫 페이지 | 본문 페이지 | 서버 조판 가능 |
|---|---|---|---|---|
| 인사기본정보조회 | 세로 | 19 | 20 | 19–20 흔들림 |
| 세대차량 현황 | 가로 | 21 | 21 | 18–21 흔들림 |
| 민원일반 | 가로 | 11 | 11 | 고정 — 수치 하나로 맞는다 |
| 접수리스트 | 가로 | 14 | 14 | 고정 — 수치 하나로 맞는다 |
| 일별접수/처리현황 | 세로 | 38 | 38 | 고정 — 수치 하나로 맞는다 |
흔들리는 이유는 행 높이가 불규칙해서가 아니라 페이지마다 실리는 요소가 달라서다. 인사 표본은 결재선이 첫 장에만 붙고, 그룹이 끝나는 페이지에는 소계 행이 하나 더 들어가며, 행마다 주소 서브행이 붙어 데이터 한 행이 두 줄이라 한 줄짜리 소계가 남는 공간에 들어가기도 하고 안 들어가기도 한다. 그래서 설계 문서의 floor((용지높이 − 여백 − 머리글 − 바닥글) / 행높이) 로도,소계 행을 한 행으로 세고
라는 보완으로도 이 둘은 맞지 않는다.
다만 흔들림 자체가 서버 조판을 막지는 않는다(HDIT-3073 에서 확인). 세대차량은 18–21 로 흔들리면서도 서버 조판과 25칸 전부 일치한다. 페이지마다 실리는 요소가 달라 생기는 흔들림은 서버도 페이지마다 다시 계산하므로 따라간다. 따라가지 못하는 것은 인사 표본처럼 같은 소계 페이지가 20행을 담기도 하고 19행을 담기도 하는 경우이고, 그때는 행 높이가 행마다 다르다는 뜻이라 상수 모델로는 재현되지 않는다.
구간 기준선 — baseline.measured.ts
| 표본 | 건수 | 페이지 | A DOM | └ 조판 | └ DOM 생성 | B 레이아웃 | 버튼→준비 | 본문 |
|---|---|---|---|---|---|---|---|---|
| 인사기본정보조회 | 100 | 6 | 34ms | 10ms | 2ms | 3ms | 38ms | 0.05MB |
| 인사기본정보조회 | 500 | 26 | 80ms | 33ms | 22ms | 0ms | 81ms | 0.25MB |
| 인사기본정보조회 | 1,000 | 51 | 115ms | 44ms | 42ms | 0ms | 116ms | 0.49MB |
| 인사기본정보조회 | 2,000 | 101 | 196ms | 77ms | 81ms | 0ms | 200ms | 0.99MB |
| 인사기본정보조회 | 4,000 | 201 | 338ms | 141ms | 145ms | 0ms | 346ms | 1.98MB |
| 세대차량 현황 | 100 | 6 | 37ms | 9ms | 2ms | 3ms | 40ms | 0.04MB |
| 세대차량 현황 | 500 | 25 | 69ms | 26ms | 20ms | 0ms | 70ms | 0.19MB |
| 세대차량 현황 | 1,000 | 48 | 103ms | 38ms | 40ms | 0ms | 105ms | 0.38MB |
| 세대차량 현황 | 2,000 | 96 | 164ms | 65ms | 68ms | 0ms | 167ms | 0.75MB |
| 세대차량 현황 | 4,000 | 191 | 303ms | 116ms | 144ms | 0ms | 308ms | 1.51MB |
| 민원일반 | 100 | 10 | 34ms | 8ms | 2ms | 4ms | 39ms | 0.08MB |
| 민원일반 | 500 | 46 | 89ms | 29ms | 31ms | 0ms | 90ms | 0.38MB |
| 민원일반 | 1,000 | 91 | 143ms | 56ms | 57ms | 0ms | 145ms | 0.76MB |
| 민원일반 | 2,000 | 182 | 254ms | 98ms | 111ms | 0ms | 259ms | 1.52MB |
| 민원일반 | 4,000 | 364 | 483ms | 188ms | 229ms | 0ms | 493ms | 3.03MB |
| 접수리스트 | 100 | 8 | 33ms | 8ms | 2ms | 3ms | 38ms | 0.06MB |
| 접수리스트 | 500 | 36 | 74ms | 23ms | 26ms | 0ms | 74ms | 0.29MB |
| 접수리스트 | 1,000 | 72 | 122ms | 45ms | 49ms | 0ms | 125ms | 0.58MB |
| 접수리스트 | 2,000 | 143 | 226ms | 86ms | 105ms | 0ms | 230ms | 1.17MB |
| 접수리스트 | 4,000 | 286 | 421ms | 161ms | 202ms | 0ms | 429ms | 2.34MB |
| 일별접수/처리현황 | 100 | 3 | 28ms | 6ms | 1ms | 2ms | 31ms | 0.02MB |
| 일별접수/처리현황 | 500 | 14 | 47ms | 13ms | 13ms | 0ms | 48ms | 0.11MB |
| 일별접수/처리현황 | 1,000 | 27 | 69ms | 20ms | 26ms | 0ms | 69ms | 0.22MB |
| 일별접수/처리현황 | 2,000 | 53 | 110ms | 36ms | 46ms | 0ms | 111ms | 0.44MB |
| 일별접수/처리현황 | 4,000 | 106 | 190ms | 68ms | 88ms | 0ms | 194ms | 0.88MB |
고사양 맥(15코어 32GB), localhost, 헤드리스 Chrome 152 에서 3회 측정한 중앙값이다. 저사양 수치가 아니고 구간 C 가 빠져 있다 — 헤드리스에는 인쇄 대화상자가 없다. 판정에 쓰려면 하한선 기기에서 위 실행부로 다시 재야 한다.
저장소에 커밋된 실측 — 갈래 2
응답 크기와 서버 조판 시간, 한 방으로 처리 가능한 최대 건수다(HDIT-3073). 서버 쪽 값이라 기기를 붙여 다시 재지 않아도 읽을 수 있다. 페이지 분할이 갈래 1 과 맞는지는 /poc/split 에서 따로 대조한다.
건수 램프 — server-once.measured.ts
| 표본 | 건수 | 페이지 | 응답 | 서버 조판 | 갈래 1 브라우저 조판 |
|---|---|---|---|---|---|
| 인사기본정보조회 | 100건 | 6 | 0.09MiB | 2ms | 10ms |
| 인사기본정보조회 | 500건 | 26 | 0.40MiB | 6ms | 33ms |
| 인사기본정보조회 | 1,000건 | 51 | 0.79MiB | 9ms | 44ms |
| 인사기본정보조회 | 2,000건 | 101 | 1.57MiB | 27ms | 77ms |
| 인사기본정보조회 | 4,000건 | 201 | 3.13MiB | 52ms | 141ms |
| 세대차량 현황 | 100건 | 6 | 0.09MiB | 2ms | 9ms |
| 세대차량 현황 | 500건 | 25 | 0.40MiB | 5ms | 26ms |
| 세대차량 현황 | 1,000건 | 48 | 0.78MiB | 10ms | 38ms |
| 세대차량 현황 | 2,000건 | 96 | 1.56MiB | 26ms | 65ms |
| 세대차량 현황 | 4,000건 | 191 | 3.10MiB | 64ms | 116ms |
| 민원일반 | 100건 | 10 | 0.12MiB | 1ms | 8ms |
| 민원일반 | 500건 | 46 | 0.57MiB | 7ms | 29ms |
| 민원일반 | 1,000건 | 91 | 1.14MiB | 12ms | 56ms |
| 민원일반 | 2,000건 | 182 | 2.27MiB | 32ms | 98ms |
| 민원일반 | 4,000건 | 364 | 4.54MiB | 85ms | 188ms |
| 접수리스트 | 100건 | 8 | 0.10MiB | 1ms | 8ms |
| 접수리스트 | 500건 | 36 | 0.49MiB | 5ms | 23ms |
| 접수리스트 | 1,000건 | 72 | 0.98MiB | 10ms | 45ms |
| 접수리스트 | 2,000건 | 143 | 1.95MiB | 43ms | 86ms |
| 접수리스트 | 4,000건 | 286 | 3.90MiB | 69ms | 161ms |
| 일별접수/처리현황 | 100건 | 3 | 0.05MiB | 0ms | 6ms |
| 일별접수/처리현황 | 500건 | 14 | 0.25MiB | 2ms | 13ms |
| 일별접수/처리현황 | 1,000건 | 27 | 0.50MiB | 6ms | 20ms |
| 일별접수/처리현황 | 2,000건 | 53 | 0.99MiB | 10ms | 36ms |
| 일별접수/처리현황 | 4,000건 | 106 | 1.98MiB | 32ms | 68ms |
마지막 칸은 갈래 1 이 같은 표본·건수에서 DOM 실측 분할에 쓴 시간이다 (paginateMs). 서버로 옮겨 없어지는 비용이 그 값이고, 그 자리에 들어오는 비용이 왼쪽의 서버 조판 시간이다. 둘 다 고사양 기기 수치이므로 저사양 판정에는 쓰지 않는다.
저사양 대리 측정 — CPU 4배 스로틀
| 갈래 | 버튼 → 레이아웃 완료 | A DOM | └ 조판 | └ 커밋 | 서버 조판 |
|---|---|---|---|---|---|
| 갈래 1. 브라우저 조판 | 18,086ms | 18,027ms | 15,169ms | 2,386ms | — |
| 갈래 2. 서버 조판 한 방 | 1,509ms | 758ms | 0ms | 475ms | 95ms |
민원일반 4,000건, 두 갈래를 번갈아 3회씩 돌린 중앙값이다. 하한선 기기가 없어 CPU 스로틀로 대신했고, 실제로 4.07배 느려진 것을 확인한 뒤 쟀다. 갈래 1 의 18 초 가운데 15.2 초가 DOM 실측 분할이다 — 서버로 옮기면 그 구간이 통째로 사라진다. 다만 스로틀 배수와 느려진 배수가 맞지 않으므로(강제 레이아웃이 섞여 있다) 이 비율을 실제 저사양 기기의 예측치로 쓰지 않는다.
한 방 상한 — 응답 5.72MiB 기준
| 표본 | 행당 바이트 | 응답 상한 | 요청 상한(폼 전송) | 먼저 막는 쪽 |
|---|---|---|---|---|
| 인사기본정보조회 | 819.23B | 7,222건 (362쪽) | 9,108건 | 응답 |
| 세대차량 현황 | 811.24B | 7,332건 (350쪽) | 11,914건 | 응답 |
| 민원일반 | 1,189.24B | 5,009건 (456쪽) | 5,930건 | 응답 |
| 접수리스트 | 1,021.17B | 5,828건 (417쪽) | 7,688건 | 응답 |
| 일별접수/처리현황 | 517.15B | 11,450건 (302쪽) | 20,533건 | 응답 |
다섯 표본 모두 응답이 먼저 막는다. 갈래 1 은 브라우저가 조판해 응답이 작으므로 반대로 요청이 먼저 막힌다 — amplifyLimits.measured.ts 의 값이 그것이다. 설계 문서의 비기능 요구인 4,000건은 다섯 표본 모두 한 응답에 들어간다. 응답 상한은 배포본 실측값이다(HDIT-2996). 막힐 때는 504 가 아니라 한 건 초과면 500, 크게 초과면 413 이 오므로 상태 코드만으로 요청 벽과 응답 벽을 가를 수 없다.