DAY 10작업 10일째
새로고침마다 느리던 어드민을 고쳤다
어드민 초안함이 열 때마다 GitHub에 글 폴더와 파일을 하나씩 물어서, 재시작 직후 11초 · 평소 1초씩 걸리던 것을 목록 기억과 미리 받기로 줄였다.
어드민은 글을 DB 없이 GitHub 저장소에서 바로 읽는다. 초안함을 새로고침할 때마다 한 박자씩 멈춰서, 서버 안에서 초안함 한 번을 그리는 데 걸리는 시간을 단계별로 재 봤다.
| 단계 | 서버를 막 켰을 때 | 그다음 새로고침 |
|---|---|---|
| 자주 보낸 메모 제안 | 0.8초 · 호출 1번 | 0초 |
| 글 목록 | 4.3초 · 호출 39번 | 0.5초 · 호출 1번 |
| 저장 시각 | 2.8초 · 호출 12번 | 0초 |
| 프로젝트 목록 | 3.0초 · 호출 6번 | 0.5초 · 호출 1번 |
| 합계 | 10.9초 | 1.0초 |
GitHub 자체는 빨랐다. 문제는 횟수와 순서였다. 막 켰을 때는 글 38편을 파일 하나씩 받아 오느라 11초가 걸렸고, 배포할 때마다 서버가 다시 켜지니 배포 직후 첫 접속이 늘 이랬다. 그 뒤로는 파일 내용을 기억해 두었지만, 여전히 새로고침마다 글 폴더와 프로젝트 폴더의 목록을 GitHub에 물었다. 그리고 네 단계를 앞 단계가 끝나길 기다렸다가 차례로 불렀다.
폴더 목록은 잠깐 기억한다
목록을 매번 묻는 이유는 바깥에서 저장소가 바뀌기 때문이다. AI가 MCP로 쓴 초안은 어드민을 거치지 않고 GitHub에 바로 커밋된다. 그래서 목록을 오래 기억할 수는 없지만, 몇십 초 늦게 보이는 것은 괜찮다고 봤다. 어드민에는 이미 2분마다 저장소를 살펴 새 초안을 알려 주는 기능이 있어서, 그 사이의 변화도 결국 알아챈다.
폴더 목록을 20초 동안 기억하고, 어드민에서 무언가를 저장하거나 발행하면 그 순간 기억을 지운다. 내가 고친 것은 바로 보이고, MCP가 올린 것은 늦어도 20초 안에 보인다.
async list(dir) {
const hit = lists.get(dir);
if (hit && Date.now() - hit.at < LIST_TTL) return hit.promise;
const promise = listNow(dir);
lists.set(dir, { at: Date.now(), promise });
return promise;
}
기억하는 값을 결과가 아니라 받는 중인 요청(promise)으로 두어서, 같은 순간 여러 화면이 같은 목록을 물어도 GitHub에는 한 번만 묻는다. 파일 내용도 같은 방식으로, 받는 중인 파일은 다시 받으러 가지 않는다.
켜자마자 미리 받아 둔다
재시작 직후의 11초는 서버가 켜지는 순간 뒤에서 한 번 미리 받아 두는 것으로 가렸다. 초안함에서 서로 기다릴 필요가 없는 메모 제안, 글 목록, 프로젝트 목록은 함께 부르게 바꿔서, 미리 받는 시간도 3초로 줄었다. 사람이 첫 화면을 열 때쯤에는 이미 끝나 있다.
바꾼 뒤 같은 측정을 다시 하니, 미리 받기가 끝난 뒤의 새로고침은 GitHub 호출 없이 0.003초였다.
감수한 것
MCP로 올라온 초안은 최대 20초 늦게 보인다. 기억은 서버 메모리에만 있어서 재시작하면 다시 받아야 하고, 미리 받기가 끝나기 전 3초 안에 들어오면 그만큼 기다린다. 서버 계산이 빨라져도, 로그인 확인처럼 서버 바깥에서 거치는 구간의 시간은 그대로 남는다.
AI(Claude Code)가 작업 기록을 바탕으로 쓰고, 검토를 거쳐 올린 글이에요. 어떻게 쓰이나요 →