주의사항 : 약간의 비용적 과장, 타임라인 상 코드 상으로 예전에 해뒀는데 여기에 같이 버무린 부분 있음 주의.
"월 인프라 비용이 $45... 좀 더 절약한다. 쥐어짜면 뭐든 나온다.
개인 서비스를 운영중이다. 혼자 개발하고 있다. 월 인프라 비용이 $45-50이 나온다. 줄일거다. 이거 줄일 수 있다.
아직 dev/production 둘 다 테스트하느라 build를 계속해야해서 이해할 수 있지만 내 돈이 아까운건 사실이다.
아 거 프리티어에서 최대한 절약을 해보면 되겠다.
구글 클라우드 무료 한도:
생각보다 GCP가 많이 혜자팩이다. 꼭 써라. AWS보다 저렴하다 진짜.
??? : 저희 캐싱할만큼 사이즈 안커요.
아니. build cache는 필수다. 일단 해라. 아무튼 하라고.
프론트만 바뀌었는데 백엔드까지 빌드할 이유는 없다.
추후, 프론트, 백 둘 다 분리하면 베스트다.(라고 해놓고 일주일 이내 진행 예정) 터보 레포로 로컬에서 묶어서 편하게 누리다가 배포단계에서 호되게 당하고 있다.
turbo-ignore라는 도구로 변경된 부분만 빌드하도록 했어요.
# 이런 식으로 API가 바뀌었을 때만 빌드
if npx turbo-ignore apps/api; then
echo "API Clean - Build skip!"
else
echo "API Dirty - Build start!"
fi
결과: 프론트만 바꿨을 때 백엔드 빌드가 아예 안 돌아간다.(이거 잘한거 아니다. 결국 백/프론트 따로 빌드하는게 가장 베스트다.)
소스 코드는 매번 바뀌지만 package.json, pnpm-lock.yaml은 잘 안 바뀐다. 이걸 기준으로 캐싱했더니 캐시 히트율이 90%+로 올라간다.
실시간 알림 때문에 쓰던 Redis를 과감히 제거했다. 대신 PostgreSQL 큐 시스템으로 바꿨다.제거하고 나중에 유튜브 알고리즘에 이 영상이 올라왔다 (https://www.youtube.com/watch?v=OZrmFD2ajlQ)
Gemini API 쓸 때 프롬프트 구조를 바꿨다. 자주 쓰는 부분은 앞에, 바뀌는 부분은 뒤에 배치해서 캐싱 효과를 최대한 활용했다.
// 이렇게 바꿨더니 캐시가 잘 되더라.
const prompt = `
${공통_법무_컨텍스트} // 95% 재사용
${문서_타입_템플릿} // 80% 재사용
---
사용자 요청: ${사용자_입력} // 매번 다름
`;
서버에서 PDF 만들면 메모리도 많이 쓰고 비용도 나가더라(뭐 크롬 엔진도 올려야하고 아무튼 무거워지고 비쌈). react-to-print로 브라우저에서 바로 PDF 만들도록 바꿨다.
드디어 성공! 🎉
| 항목 | Before | After | 절감률 |
|---|---|---|---|
| 전체 비용 | $45-50/월 | $15-20/월 | 70-85% |
| 빌드 시간 | 30분 | 10-15분 | 50-67% |
각 서비스마다 무료 한도가 있는데 대충 메이저한 것들 찾아보니 GCP가 혜자더라.
소스 코드 말고 package.json, lock 파일 기준으로 캐싱하면 히트율이 엄청 올라가더라.
모든 변경이 전체 빌드를 유발할 필요 없어요. turbo-ignore 같은 도구 적극 활용하자.(turbo repo 기준)
PDF 생성, 이미지 처리 등 클라이언트에서 할 수 있는 건 과감히 옮겨보자. 서버에서 모든걸 하는게 능사가 아니더라.(돈 많으면 나중에 서버로 옮기고...)
월 $45에서 $15로, 85% 비용 절감했다.
물론 성능 트레이드오프는 있었지만, 초기 단계에서 돈이 부족하다면 비용 효율성이 더 중요하다고 생각한다.
혹시나 서비스를 맨 처음 운영해볼 사람들은 구두쇠 모드로 인프라 최적화에 도전해보자. 생각보다 재미있고, 그 돈 아껴서 저녁에 치킨 한번 더 먹을 수 있다.
