프리뷰 게이트웨이·세션 계층의 효율 문제. #332(컨테이너 실행 격리)는 런타임 계층이라 파일이 겹치지 않는다(PreviewRuntimeLauncher·PreviewWorkspaceService·createAndStartContainer).
확정 사실
| # |
위치 |
문제 |
| 7-1 |
PreviewSessionService.java:243-252, 336-340 |
프록시가 resolveGateway → touch → repository.save() 를 요청마다 한다. 트랜잭션 밖이라 save 가 merge 로 동작해 자산(JS/CSS/이미지) 하나당 SELECT + merge-SELECT + UPDATE 3왕복 + 쓰기 락. 페이지 1회 로드에 자산이 N개면 N×3 |
| 7-2 |
PreviewGatewayService.java:119-125 |
전 자산에 Cache-Control: no-store, ETag/Last-Modified 미전달 → 해시가 박힌 불변 자산(/assets/index-xxxx.js)까지 매 새로고침마다 재전송 |
| 7-3 |
PreviewGatewayService.java:101-115, 261, 332 · PreviewGatewayController.java:76-81 |
업스트림 응답을 ofByteArray 로 전량 메모리 버퍼링(HTML 은 String 변환으로 한 번 더 복사). 요청 본문은 readAllBytes 로 무제한 — 인증 없는 경로라 대용량 POST 로 OOM 을 유도할 수 있다 |
| 7-4 |
PreviewGatewayService.java:284-308 |
base 흡수 재요청(최대 2단계)이 자산마다 최대 3회 컨테이너 왕복 |
| 7-5 |
DockerContainerService.java:129, 951-960 |
컨테이너 생성마다 pullImageCmd(로컬 존재 미확인, 최대 3분 대기). 코딩 에이전트 쪽은 inspectImageCmd 로 올바르게 처리하고 있다(CodingAgentContainerRunner.java:180) |
| 7-6 |
DockerContainerService.java:166-181, 659-673 |
컨테이너 로그 드라이버 상한 없음 — dev 서버 stdout 이 TTL 동안 무제한 적재 |
할 일
보류(#332 구역): npm 캐시 볼륨 재사용, binding-approval-hold 6시간 동안 컨테이너를 stop 후 재기동으로 바꾸기 — #332 후속으로 제안한다.
검증
프리뷰 페이지 1회 로드 시 preview_sessions UPDATE 횟수 전/후 · 대용량 자산 스트리밍 확인 · 10MB 초과 POST 가 413
계획 원문: .agent-team/00-plan/perf-cost-plan.md U7
프리뷰 게이트웨이·세션 계층의 효율 문제. #332(컨테이너 실행 격리)는 런타임 계층이라 파일이 겹치지 않는다(
PreviewRuntimeLauncher·PreviewWorkspaceService·createAndStartContainer).확정 사실
PreviewSessionService.java:243-252, 336-340resolveGateway→touch→repository.save()를 요청마다 한다. 트랜잭션 밖이라 save 가 merge 로 동작해 자산(JS/CSS/이미지) 하나당 SELECT + merge-SELECT + UPDATE 3왕복 + 쓰기 락. 페이지 1회 로드에 자산이 N개면 N×3PreviewGatewayService.java:119-125Cache-Control: no-store, ETag/Last-Modified 미전달 → 해시가 박힌 불변 자산(/assets/index-xxxx.js)까지 매 새로고침마다 재전송PreviewGatewayService.java:101-115, 261, 332·PreviewGatewayController.java:76-81ofByteArray로 전량 메모리 버퍼링(HTML 은 String 변환으로 한 번 더 복사). 요청 본문은readAllBytes로 무제한 — 인증 없는 경로라 대용량 POST 로 OOM 을 유도할 수 있다PreviewGatewayService.java:284-308DockerContainerService.java:129, 951-960pullImageCmd(로컬 존재 미확인, 최대 3분 대기). 코딩 에이전트 쪽은inspectImageCmd로 올바르게 처리하고 있다(CodingAgentContainerRunner.java:180)DockerContainerService.java:166-181, 659-673할 일
Sec-Fetch-Destnavigation)에만 touch 하거나last_accessed_at이 60초 이내면 skip. 갱신은@Modifying단일 UPDATEprivate, max-age=3600, immutable, 그 외는 업스트림 ETag/Last-Modified 전달 +If-None-Match패스스루ofInputStream+StreamingResponseBody(SSE 경로에 이미 있는 패턴), 요청 본문 상한 10MB 초과 시 413inspectImageCmd선확인 후 없을 때만 pullwithLogConfig(json-file, max-size=10m, max-file=2)보류(#332 구역): npm 캐시 볼륨 재사용,
binding-approval-hold6시간 동안 컨테이너를 stop 후 재기동으로 바꾸기 — #332 후속으로 제안한다.검증
프리뷰 페이지 1회 로드 시
preview_sessionsUPDATE 횟수 전/후 · 대용량 자산 스트리밍 확인 · 10MB 초과 POST 가 413계획 원문:
.agent-team/00-plan/perf-cost-plan.mdU7