Ajjoona's Tech Blog

[SAN] 자연어 통합 검색 API: AiEmbeddingClient 설계와 BindException 트러블슈팅

GET /api/search 구현 과정에서 결정한 사항들 — Scrap을 검색 풀에서 제외한 이유, AiEmbeddingClient 인터페이스 분리 전략, @ModelAttribute 검증 실패가 500을 던진 원인과 BindException 핸들러 통합, CGLIB 프록시 기동 실패까지 기록합니다.

Preview Image

[둥지] 운영 알림 설계: Discord 웹훅으로 워커 사망·잔액 부족 감지하기

워커 사망, IROS 잔액 부족, OpenAI quota 초과 등 즉각 대응이 필요한 운영 이벤트를 Discord 웹훅으로 알림 받도록 구현한 과정을 기록합니다. 알림 채널 선택, 공통 모듈 설계, 트리거 포인트 결정 근거를 중심으로 정리합니다.

[SAN] 이벤트 기반 비동기 파이프라인: Spring Event

MVP 단계에서 Kafka 없이 Spring Event로 비동기 파이프라인을 구현한 이유를 정리합니다. 이벤트 기반 구조의 결합도 분리, @TransactionalEventListener AFTER_COMMIT 타이밍 문제, 스레드 풀 분리, Short Polling 선택까지 의사결정 과정을 기록합니다.