두 가지 다 수정해서 dist 까지 새로 빌드해 넣은 완성본입니다. tsc 컴파일 통과(수정한 파일에 타입 오류 없음), package.json/package-lock.json은 원본 그대로 유지했습니다. 1. 10초 지연 — 원인 확정 및 수정 원인은 ioredis 에 commandTimeout 이 없던 것입니다. KeyDB 로 가는 TCP 연결이 half-open(상대가 재시작하거나 pf/NAT state 만료로 사라졌지만 OS 는 아직 끊긴 걸 모르는 상태)이 되면, GET/SET 이 OS TCP 스택이 포기할 때(≈10초)까지 매달려 요청 전체가 멈춥니다. FreeBSD 홈랩에서 딱 이 증상이 잘 납니다. 여기에 무효화가 KEYS(서버 전체 블로킹)를 써서 지연을 더 키웠고요. src/cache/cache.ts 수정: commandTimeout: 1500 + connectTimeout: 2000 + keepAlive: 5000 → 단일 캐시 명령이 1.5초 넘기면 실패 처리하고 즉시 PG 폴백. 총 지연 ≤ 2초 보장. 앱 레벨 withTimeout() 이중 안전장치로 모든 GET/SET/무효화에 상한 적용. read 캐시 채우기(set)를 fire-and-forget 으로 바꿔 응답을 막지 않게. 무효화 KEYS → SCAN(논블로킹 커서) + UNLINK(백그라운드 삭제)로 교체, 전체 소요도 1.5초로 제한. 폴백·캐시 키 규칙·TTL 은 그대로입니다. .env 의 REDIS_URL 이 localhost 라면 redis://127.0.0.1:6379 로 바꾸는 것도 권장합니다(IPv6 ::1 우선 해석 지연 방지). 기본값은 이미 127.0.0.1. 2. 카테고리 수정/삭제 추가 백엔드: category.service 에 update/remove, 컨트롤러 핸들러, 라우트 PATCH /:id·DELETE /:id(둘 다 authRequired + requireAdmin). 수정 시 이름/슬러그 중복 검사(자기 제외) + 캐시 무효화. 삭제는 글이 남아 있으면 409로 거부(데이터 유실 방지 — 글 옮기거나 삭제 후 재시도). 스크린샷 기준 0 주제 카테고리는 바로 삭제됩니다. 프론트: 목록 각 행에 수정/삭제 버튼, 수정은 인라인 편집(Enter 저장·Esc 취소), 처리 후 공개 목록·글쓰기 셀렉트 자동 갱신. DB 스키마 변경 없어 마이그레이션 불필요합니다. 배포는 npm run build 후 pm2 restart 인데 dist 는 이미 넣어놨습니다. 자세한 내역은 아카이브 안 EDIT-DELETE-DELAY-FIX.md 에 있습니다. 한 가지 확인 부탁: 지연이 실제로 half-open 연결 때문인지 검증하려면 문제 재현 시 keydb-cli -h 127.0.0.1 ping 이 즉시 PONG 을 주는지 봐주세요. 즉답이면 이 수정으로 끝이고, 그것도 느리면 KeyDB 프로세스/바인딩 쪽을 더 봐야 합니다.