chore(plan): 54-5 B05 · B06 속도 · 보안 조사 결과 보관
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FJqWQpoB1RE7hiaQ2wH8qV
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
# 54-5 B05 · B06 실시간 조작 속도 · 보안 재확인 (조사 · 보고만)
|
||||
|
||||
- 기준 커밋: `6233daab1` (sub_laptop_8 = origin/main_laptop_1)
|
||||
- 검증 프로젝트: `sub8_검증` (`c81b21f8…`) · 노선 224 · 저장 · 확정 누르지 않음(캐시만 · 브라우저 문맥 버림)
|
||||
- 측정 도구: 헤드리스 Chrome(실 GPU — ANGLE D3D11 Intel Iris Xe) · 1509×1069 · 페이지 안 계측(Event Timing · Long Task · fetch/XHR 감쌈 · sessionStorage 쓰기 셈 · DOM 변화 셈 · WebGL clear 셈) + CDP 메인 스레드 시간
|
||||
- ⚠ ORCA 내장 탭이 10초마다 강제로 내려감(다른 창 탭 여럿 · 숨은 탭 10초 뒤 버림 · `tab switch --focus` 로도 같음) → 10초 넘는 측정 불가 → 측정 전용 헤드리스 Chrome 으로 대체(공용 브라우저 아님 · 화면 안 띄움 · ORCA 탭은 닫음)
|
||||
- 통합 전 판 실행 대조는 안 함(워크트리 금지) → 통합 전 실측값은 커밋 글에 남은 수치로 대조(`9da48d5e7` 9-12 · `1abb456ef` 9-06)
|
||||
|
||||
## ① 기준 커밋
|
||||
|
||||
속도 · 실시간 · 보안 작업
|
||||
|
||||
| sha | 날짜 | 내용 |
|
||||
|---|---|---|
|
||||
| 7fdbb343a | 08-23 | 코리도 편집 즉시 반영 · 프리즈 제거(프레임 갭 3603→100ms) |
|
||||
| 08c0dc322 | 08-29 | 자동저장 제거 · 초기값 스냅샷 |
|
||||
| a35c8ff35 | 09-03 | 계획선 편집 중 횡단 재계산을 브라우저로 — 서버 왕복 제거 |
|
||||
| c2f681f9d · 8dca4bbfb | 09-04 | 휠 · 세로 맞춤 실시간(다시 그리기 대신 변환) |
|
||||
| 3cd717d8f | 09-06 | [저장]·[확정] 정본 서버 재계산 |
|
||||
| 9da3bce1b | 09-06 | 카드 버튼 즉시 저장 → 캐시 · `designRequestSeq` 제거(최신만 채택은 `B05_Profile_UI_Profile_Preview.ts:35-57` seq 가 맡음) |
|
||||
| c0bfcba34 | 09-06 | 유토 배분을 서버 Node 로(사용자 확정 · 400ms 잠잠해지면 · 최신만) |
|
||||
| df2dedcbc · 8e3c1f91f | 09-06 | 진입 중복 호출 제거 |
|
||||
| 0b30f5b03 · 1abb456ef · 4df5d0a7e | 09-06 | 지형 색인 · 카드 강제 레이아웃 67→1회 · B06 진입 2.3~2.9s → 2.0s |
|
||||
| 674777626 | 09-06 | 세션 확인 활동시각 쓰기 1분 1회 |
|
||||
| **9da48d5e7** | 09-12 | **B06 ▲▼ — `refreshCards` 묶음 + 120ms 디바운스 · 한 번 누름 920→17~23ms · 최장 멈춤 180~229ms · 1.5초 누름 누적 멈춤 2,577→473ms** |
|
||||
|
||||
좌측 패널 통합(통합 직전 기준 `cd26699d2` 09-29)
|
||||
|
||||
| sha | 날짜 | 내용 |
|
||||
|---|---|---|
|
||||
| 439f605ba · 7760dcd77 · 2c520537b | 09-29 | 좌측 칸 등록부 · 설계 가게 한 곳 · 저장 한 줄기 |
|
||||
| 38aae89b2 | 09-29 | 종단도 한 벌(`design_profile.ts`) — B06 위 종단도도 B05 것으로 |
|
||||
| 8a9456579 | 09-29 | 고름 한 곳 |
|
||||
| **dd8066275** | 09-29 | **옛 B06 계획선 편집 껍데기 삭제 — 120ms 디바운스 같이 사라짐** · 유토 뱃지 한 계산(전 측점 `structureAreaRows`) |
|
||||
| 90a2cb9a1 | 09-29 | 한 페이지 뼈대 · 숨은 3D 그리기 멈춤 |
|
||||
| **473d959d6** | 09-29 | **가운데 보기 전환 — 폼 한 벌 · `pipeReloadTimer` 추가** |
|
||||
| 7f04bf961 · 767adc4a4 | 09-29~30 | 관 · 옹벽 칸 한 곳 |
|
||||
| fc54a385d | 10-05 | 구조물 배치 칸을 정의대로 |
|
||||
| 0a095c14b … 1a9055444 | 10-05~06 | 52장 명세 공용 틀 + 구조물별 폼 |
|
||||
|
||||
## ② 수치 (지금 판)
|
||||
|
||||
열: 입력→그림 = Event Timing 최대(ms · 괄호 = 그중 JS) · 긴 작업 = 50ms 넘는 멈춤(ms) · 요청 = 조작 하나에 나간 요청(올림/받음) · 캐시 쓰기 = sessionStorage setItem 수 · 좌측 = 좌측 패널 DOM 갈아 끼운 노드 수 · DOM = 전체 · 오버레이 = 잠금 오버레이 뜸
|
||||
|
||||
### B05 (종단 보기)
|
||||
|
||||
| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM | 오버레이 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 쉼 3초(3D 켜짐) | — | 0 | 0 | 0 | 0 | 1 | 0 |
|
||||
| 종단 패널 펼침 | 16~24 | 0 | 0~1(설정 PUT) | 0 | 0 | 0~17 | 0 |
|
||||
| 구조물 고르기(목록 클릭) | 72~136 (38~54) | 0~57 | 0 | 1 | 95~114 | 106~147 | 0 |
|
||||
| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 53 · 88 | 0 | 1 (2KB) | 68 | 84 | 0 |
|
||||
| 좌측 칸 — 돌쌓기 측점 +m | 80~128 | 52~76 · 88 | 0 | 1 (2KB) | 72 | 88 | 0 |
|
||||
| 좌측 칸 — 메모 6자 타자 | ≤24 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| 좌측 칸 — 배관 관경 바꿈 | — | 59~64 · 68~93 | **1 · POST detail-basins 1KB/96KB · 211~478ms** | 1~2 | 52~119 | 143~245 | 0 |
|
||||
| 측점 끌기(구조물 알약 40px) | **160~240 (57~87)** | 59~95 · 62~95 | 0 | 1~2 | 136~158 | 172~182 | 0 |
|
||||
| 종단 점 ▲ 한 번 | 56~72 (12~22) | 53~78 | 1 · haul-plan 22KB/0.6KB(400ms 뒤) | 2 | 0 | 36 | 0 |
|
||||
| 종단 점 ▲ 2.5초 길게(약 20회) | 32~56 | 최대 64 | 2 · haul-plan | **42** | 0 | 558 | 0 |
|
||||
|
||||
- 쉼 3초 메인 스레드 시간 **1,484~1,600ms (≈50%)** · WebGL clear 700회(초당 ≈230) — 3D 가 가만히 있어도 매 프레임 그림 → 위 모든 B05 조작에 깔리는 바닥 부하
|
||||
- B05 진입: 5.9초 · 요청 21 · 받음 등고선 geojson **36.7MB** + 지형 미리보기 7.8MB + 등고선 7.0MB + 횡단 상세 2.6MB · 진입 때 `POST route/structures/migrate`(쓰기) · 긴 작업 합 832ms
|
||||
|
||||
### B05 ↔ B06 넘김
|
||||
|
||||
| 조작 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM |
|
||||
|---|---|---|---|---|---|
|
||||
| B05 → B06 (첫 번째) | **752** · 214 · 403 · 72 · 57 · 154 (합 1,652) | 6 · pipe-points 96KB 다시 받음(1,036ms) · missing-stations 541ms · haul-plan | 10~11 | 392~525 | 2,402~2,560 |
|
||||
| B06 → B05 | 198~231 · 104~114 | 1 (structures) | 2 | 207~390 | 863~1,094 |
|
||||
| B05 → B06 (두 번째) | **1,231~1,242** · 76~98 · 81~125 · 137~148 | 2 (structures · pipe-points — 메인 스레드 막혀 1,308~1,341ms 대기) | 1 | 260~371 | 1,474~1,611 |
|
||||
|
||||
- B06 쉼 3초 메인 스레드 5ms · WebGL 0 (숨은 3D 멈춤은 정상)
|
||||
- 통합 전 B06 페이지 진입 긴 작업 합 1,604~1,728ms(1abb456ef) → 지금은 **같은 페이지 안 보기 바꿈인데도** 1.5~1.7초를 매번 다시 씀
|
||||
|
||||
### B06 (횡단 보기)
|
||||
|
||||
| 조작 | 입력→그림 | 긴 작업 | 요청 | 캐시 쓰기 | 좌측 | DOM |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 종단 점 ▲ 한 번 | 40 | **587** | 1 · haul-plan | 2 | 0 | 900 |
|
||||
| 종단 점 ▲ 2.5초 길게 | pointerup **344** | **663 · 558 · 545 · 500** · 95 · 162 · 161 (합 2,684) | 4 · haul-plan(325~851ms) | 8 | 0 | 3,564 |
|
||||
| 횡단 조정 줄 — 카드 암 경계 ▲ | 96 (63) | 68 | 0 | 1 | 67 | 118 |
|
||||
| 구조물 고르기(돌쌓기) | 128 (74) | 80 | 0 | 2 | **247** | 279 |
|
||||
| 구조물 고르기(배관) | 120 (75) | 82 | 0 | 2 | **286** | 342 |
|
||||
| 좌측 칸 — 배관 관경 바꿈 | — | 109 · 54 | **2 · POST detail-basins + haul-plan** | 3 | 52 | 717 |
|
||||
| 좌측 칸 — 돌쌓기 높이 2→1.5 | 16 | 0 | 0 | **0** | **0** | **0** |
|
||||
|
||||
- **B06 ▲ 통합 전 대비(9da48d5e7 실측)**: 한 번 누름 최장 멈춤 180~229 → **587ms** · 길게 누름 누적 멈춤 473ms(1.5초) → **2,684ms(2.5초)** · 9-12 에 고친 것이 9-29 통합에서 되돌아감
|
||||
- B06 보기에서 돌쌓기 높이 칸을 바꿔도 캐시 쓰기 · 화면 변화 0 (B05 보기에선 즉시 반영) — 속도와 별개 흠 의심 · 확인 필요
|
||||
- 잠금 오버레이: 모든 조작에서 0 (규칙 맞음)
|
||||
|
||||
## ③ 느린 원인 후보 (6)
|
||||
|
||||
| # | 자리 | 왜 | 실측 근거 | 생긴 때 |
|
||||
|---|---|---|---|---|
|
||||
| S1 | `A00_Common/design/design_profile.ts:125` (`CROSS_PREVIEW_DEBOUNCE_MS = 16`) · `:367-392` · `B06_Section/B06_Section_UI_Section_View.ts:393-397` · `:287-291` · `B06_Section/B06_Section_Cross_Refresh.ts:129-140` | B06 ▲ 마다(초당 10회) 전 측점 재계산 → 바뀐 측점 카드 전부 다시 만들기 → 종단도 두 번 그림(`draw()` + `refreshCards`→`redrawProfile`) → 전 측점 `structureAreaRows` · 옛 B06 120ms 디바운스 사라짐 | B06 ▲ 587ms · 길게 500ms+ ×4 | dd8066275 · 38aae89b2 (통합) |
|
||||
| S2 | `A00_Common/design/design_view_cross.ts:493-497` (`host.onShow`) | 횡단 보기 보일 때마다 구조물 다시 읽기 · 상세 다시 받기 · `reconcileStaleDesigns` 전 측점 재계산 · 카드 전부 다시 — 바뀐 것 없어도 | B05→B06 1,231ms 한 덩어리 · pipe-points 96KB 매번 | 473d959d6 (통합) |
|
||||
| S3 | `B05_Profile/B05_Profile_UI_Viewer.ts:357-376` (`animate`) | 3D 가 쉬는 중에도 매 프레임 `renderer.render` — 메인 스레드 ≈50% 상시 점유 → 모든 B05 조작이 그 위에 얹힘 | 쉼 3초 CPU 1.5초 · clear 230/초 | 통합 전부터(90a2cb9a1 은 숨길 때만 멈춤) |
|
||||
| S4 | `A00_Common/design/design_view_cross.ts:140-143` (`pipeReloadTimer`) → `B05_Profile/B05_Profile_UI_Drainage_Panel.ts:551-553` · `:402-407` · B05 쪽 `:612-613` | 관 옵션 하나 바꿀 때마다 서버 `detail-basins` 왕복(96KB 받음) → 배수유역 목록 다시 그림 → 관 변경 알림 다시 퍼뜨림 — 5장 「조작 중 네트워크 왕복 금지」 어긋남 | 관경 바꿈 POST 163~478ms · B06 DOM 717 | B05 쪽 통합 전부터 · B06 쪽 473d959d6 |
|
||||
| S5 | `B06_Section/B06_Section_UI_Page_Pipe_Options.ts:144-148` | 관 옵션 바꿀 때 덮는 범위 측점마다 `refreshCard` → 측점마다 공용 종단도 전체 `draw()` — 9-12 에 고친 꼴(측점 수만큼 다시 그림)이 다시 생김 | 코드 읽기 · 관경 바꿈 긴 작업 109ms | 통합 때 커짐(무거운 공용 종단도로 바뀜) |
|
||||
| S6 | `B05_Profile/B05_Profile_UI_Structures_Panel.ts:393-400` (`liveCommit`) → `B05_Profile_UI_Structures_Panel_Commit.ts:216-219` · `B06_Section/B06_Section_UI_Page_Structures_Panel.ts:167-172` · `A00_Common/design/design_structure_form.ts:158-159` · `:214-234` · B06 쪽 `design_view_cross.ts:207-224` · `:447-462` | 고르기 · 칸 하나 · 알약 끌기마다 좌측 목록 통째 + 명세 폼 다시 만들기 · B06 은 목록을 두 번 다시 그리고 카드 전체 · 공용 종단도까지 | 고름 B05 95~114 · B06 247~286 노드 · 알약 끌기 160~240ms | 통합 · 52장 폼으로 무거워짐 |
|
||||
|
||||
덧(조작 아님): B05 진입 등고선 geojson 36.7MB · 진입 때 `structures/migrate` 쓰기 · 유토 배분 `haul-plan` 은 조작마다 22KB 올림이나 사용자 확정 설계(서버 Node · 400ms 잠잠 · 최신만)
|
||||
|
||||
## ④ 보안 (흠 11)
|
||||
|
||||
인증 · 권한 공통: 모든 B04/B05/B06 라우터가 `protected_with_company`(`main.py:613-637`) → 세션 + 회사 + 프로젝트가 같은 회사인지(`common_util/common_util_auth.py:105` · `:179` · `:187`) · `project_id` UUID 형 · `route_id` 는 프로젝트와 대조 · 조작 중 자동저장 PUT 없음
|
||||
|
||||
| # | 무게 | 자리 | 흠 |
|
||||
|---|---|---|---|
|
||||
| H1 | **치명** | `B05_Profile/B05_Profile_Structures_Schema.py:175` · `B05_Profile/B05_Profile_Structures_Repository.py:123` · `M02_MasterTemplete/M02_Item_Snapshot.py:67-69` · `:155-165` · `:212-223` | 구조물 저장 때 `structure_id` 아무 글자 그대로 저장 → 저장 뒤 `safe_sync` 가 `base / structure_id` 폴더를 `shutil.rmtree` · 그 자리에 씀 → `"../../.."` · 절대경로로 서버 디스크 폴더 지우기 가능(회사 사용자 누구나) · 안전 이름 `FOLDER_PATTERN`(`:53`) 이 있는데 여기선 안 씀 (코드로 확인함) |
|
||||
| H2 | 높음 | `B05_Profile/B05_Profile_Schema.py:66-67` · `:272` → `B05_Profile/B05_Profile_Engine_Solver.py:49-155` · `common_util/common_util_surface_sampler.py:134` · `B05_Profile/B05_Profile_Engine_Skeleton.py:284` | `filter_key` · `method` 자유 글자가 파일 이름에 들어감 → 경로 넘기(다른 프로젝트 지형 읽기 · 캐시 파일 쓰기) · confirm 은 값을 저장까지 |
|
||||
| H3 | 중간 | `B05_Profile/B05_Profile_Structures_Repository.py:200-202` · `common_util/common_util_drainage_pipes.py:345-361` | **52장 명세 칸 서버 검사 없음** — 정의에 없는 키(동적 `{머리}_{n}_{항목}` 포함)는 `continue` 로 통과 · 관 `options` 그대로 저장 · 명세 규칙은 브라우저(`A00_Common/design/design_structure_spec.ts`)에만 · 파이썬 짝 없음 · 자유 글자 길이 제한 없음 |
|
||||
| H4 | 중간 | `A00_Common/design/design_structure_ford_calc.ts:10` | 세월교 폭→최소 높이 규칙이 브라우저에만 · 서버는 받은 `ford_height_m` 그대로 — 5장 ⛔(브라우저만 계산) |
|
||||
| H5 | 중간 | `B05_Profile/B05_Profile_Router_Corridor.py:131-160` · 호출 `B05_Profile_UI_Corridor.ts:208` · `:228` | 코리도 PUT 이 브라우저가 만든 기하 · hash 를 검사 없이 저장 · 첫 빌드 때 자동 PUT — 5장 ⛔ · 서버가 만들 수 있음(`B05_Profile_Corridor_Prebuild.py`) |
|
||||
| H6 | 중간 | `B06_Section/B06_Section_Schema.py:198` · `B06_Section/B06_Section_Router_Confirm.py:124-169` | B06 저장 · 확정이 브라우저 `mass_haul` · 면적 · 관 길이를 먼저 적고 서버 재계산이 덮음 — 재계산 실패하면 로그만 · 브라우저 값 남음 · `standard_cross_section` 검사 없는 dict |
|
||||
| H7 | 낮음 | `B06_Section/B06_Section_Schema.py:174-177` (대 `:44-47`) | `CrossSectionPatch` 의 `ground_type` 등 자유 글자 · 사전 키 · 목록 길이 제한 없음 |
|
||||
| H8 | 낮음 | `B06_Section/B06_Section_Router.py:599` | 안 쓰는 `POST cross-design` 이 DB 에 바로 씀(저장 밖 쓰기 길) |
|
||||
| H9 | 낮음 | `design_view_profile.ts:503` · `:459` · `B05_Profile_UI_Corridor.ts:208` | [저장] 밖 쓰기 — 등고선 간격 PUT · 진입 때 structures/migrate · 코리도 첫 PUT — 5장 어긋남 |
|
||||
| H10 | 낮음 | `B06_Section_Router.py:431` · replan · cross-preview | `cross_half_width_m` 상한 없음 · `vertices` 길이 제한 없음 · 코리도 크기 검사가 전체 파싱 뒤 |
|
||||
| H11 | 낮음 | `station_offsets` · `curve_radii` · 관 `chainage_m` · `B05_Profile_Repository.py:256` | NaN/Infinity 통과 · 관 측점이 노선 길이 검사 없음 · `surface_model_id` 조회에 프로젝트 조건 없음(좌표계 코드만 샘) |
|
||||
|
||||
- 참고: 프로젝트 권한이 회사 단위뿐(멤버 · 읽기 전용 역할 없음) — 정책 결정 사항
|
||||
- 서버 정본 재계산: 계획선 저장(`B05_Profile_Router.py:387-402`) · B06 저장(`recompute_server_side`) 맞음 · 구조물은 등록부 대조만(재계산 아님)
|
||||
|
||||
## ⑤ 고칠 갈래와 차례 (8 · 작은 것부터)
|
||||
|
||||
| 차례 | 갈래 | 크기 | 예상 효과 |
|
||||
|---|---|---|---|
|
||||
| 1 | H1 — `structure_id` 를 `FOLDER_PATTERN` 으로 스키마 검사 + `sync_snapshots` 에서 한 번 더 | 몇 줄 | 서버 폴더 지우기 막음(최우선) |
|
||||
| 2 | H2 — `filter_key` · `method` 를 Literal 화이트리스트 | 몇 줄 | 경로 넘기 막음 |
|
||||
| 3 | S1 — 횡단 쪽 재계산 120ms 디바운스 되살림 · `onCrossDesignsUpdated` 받는 쪽에서 종단도 두 번째 그리기 뺌 · 숨은 보기 건너뜀 | 작음 | B06 ▲ 587ms → 9-12 수준(최장 ≈200ms · 길게 누적 ≈0.5초) |
|
||||
| 4 | S5 · S4 — 관 옵션 측점 루프를 `refreshCards` 한 번으로 · `detail-basins` 서버 왕복을 [저장] 때로(조작 중은 로컬) | 작음~중간 | 관 옵션 조작 왕복 0 · 다시 그림 1회 |
|
||||
| 5 | S2 — 횡단 보기 다시 보일 때 가게 판번호가 같으면 다시 읽기 · 전 측점 재계산 건너뜀 | 중간 | 보기 넘김 1.2~1.7초 → 바뀐 것만 |
|
||||
| 6 | S3 — 3D 그리기를 「바뀔 때만」(카메라 움직임 · 장면 변경 때 render 요청) | 중간 | 쉬는 중 메인 스레드 ≈50% → ≈0 · B05 조작 전반 체감 |
|
||||
| 7 | S6 — 고름 · 칸 바꿈 때 좌측 목록 통째 대신 바뀐 줄만 · 폼 다시 만들기 줄임 · B06 목록 두 번 그리기 없앰 | 중간 | 고름 B06 120ms → B05 수준 이하 |
|
||||
| 8 | H3~H11 — 52장 명세 서버 clean(파이썬 짝 + 거울 시험) · 세월교 높이 서버 검산 · 코리도 서버 생성 · B06 재계산 실패 시 거절 · 안 쓰는 POST 삭제 · [저장] 밖 쓰기 정리 · 상한 · NaN 막기 | 큼 | 5장 「서버 정본」 · 입력 검사 채움 |
|
||||
|
||||
## 남은 확인
|
||||
|
||||
- B06 보기 돌쌓기 높이 칸 바꿈 반영 0 (캐시 · 화면 모두) — 별도 흠 의심
|
||||
- B05 배관 관경 바꿈 뒤 고름이 풀린 일 1회(재현 불확실)
|
||||
- 통합 전 판 실행 대조가 필요하면 브레인 결정(워크트리 필요)
|
||||
- ORCA 내장 탭 10초 강제 내림 — 다른 창 탭 정리 또는 탭 보이게 두면 풀릴 수 있음
|
||||
Reference in New Issue
Block a user