📎 동기식 문서 업로드 로직 비동기로 전환 (📈180s + α 👉 22s)
- 📌 문제점
- 문서 업로드 시 OCR 처리, Pinecone 인덱싱, 문서 저장 로직이 모두 Controller에 동기적으로 구현되어 있었음
- Azure AppService의 기본 Gateway Timeout이 220초로 설정되어 있어, 업로드 시간이 이를 초과하면 Timeout Error 발생
- ⚙️ 해결과정
- PDF를 Blob에 업로드한 후 OCR 처리 및 Pinecone 인덱싱 로직을 비동기로 전환할 필요가 있었음
- Message Queue는 작업 비용 및 예산 문제로 도입이 어려워 제외
- Serverless로 긴 작업을 처리할 수 있는 Function App과 Batch Job을 검토
- Batch Job은 즉시 실행이 불가능하고 비용이 높아 부적합하다고 판단
- Function App은 단일 실행 시간이 10분으로 제한되어 전체 로직 수행에 적합하지 않았음
- 비용 효율성과 긴 작업 처리에 유리한 Azure Durable Function을 도입하여 비동기 처리를 구현
- 📈 결과
- 업로드 시간 230초 + α에서 22초로 단축
📎 HWPX 이미지 입력 및 Markdown 스타일 HWPX 변환 기능 추가
📎 정기 결제 구현
- 📝 요구사항
- Toss Payments를 활용한 정기 결제 기능 도입
- ⚙️ 구현과정
- Azure Function Timer Trigger를 활용해 매일 새벽 2시에 자동 결제 로직 실행
- 만기일이 2일 이내인 사용자의 결제 진행
- 결제 자체는 성공했으나, 스키마 불일치로 결제 기록이 저장되지 않는 문제 발생
- Sentry에
userId
,paymentsId
를 전송하여 수동 데이터 입력 방식으로 보완
- Sentry에
- 사용자의 카드 오류 등으로 3일 이상 결제 실패 시, 기존 요금제가 유지되는 경우 발생
- 3일 이상 실패한 경우 무료 요금제로 자동 강등하고, 사용자가 수동으로 복구할 수 있도록 안내
📎 사용자 플랜별로 사용량 제한 구현
📝 요구사항
- 요금제에 따른 기능 사용량 제한 및 사용량 로깅 기능 추가
- 사용량 데이터를 MongoDB에 저장하여 분석 가능하도록 구성
⚙️ 구현과정
- 함수 실행 시간을 측정하여 MongoDB에 적재한 후 Cache를 통해 사용량을 갱신하는 Proxy Layer 구현
- 사용량 조회 시 매번 MongoDB를 직접 조회할 경우 동시성 이슈 및 성능 저하 우려
- → 캐싱 기반 구조로 전환
- 캐싱 로직 세부
- 캐시에 사용량이 존재하면 즉시 반환
- 없을 경우, Redis 분산락을 이용해 중복 조회를 방지하고 MongoDB에서 조회 후 Cache 업데이트
- Proxy를 통해 전달된 로직 실행 이후에도 사용량을 Cache 및 MongoDB에 동기화