[둥지] FastAPI + AI 워커를 위한 모던 백엔드 구조 설계 (feat. uv, Producer-Consumer)
FastAPI 기반의 AI 서비스 백엔드를 설계하며 내린 기술적 의사결정을 공유합니다. pip 대신 Rust 기반의 uv를 도입하여 의존성을 관리하고, Redis를 활용한 Producer-Consumer 패턴으로 클라우드 API와 홈 서버(GPU) 간의 비동기 처리를 구현했습니다.
FastAPI 기반의 AI 서비스 백엔드를 설계하며 내린 기술적 의사결정을 공유합니다. pip 대신 Rust 기반의 uv를 도입하여 의존성을 관리하고, Redis를 활용한 Producer-Consumer 패턴으로 클라우드 API와 홈 서버(GPU) 간의 비동기 처리를 구현했습니다.
Python 프로젝트를 위한 Dockerfile 작성 가이드입니다. Alpine 대신 Slim 이미지를 선택해야 하는 이유(glibc 호환성), 빌드 속도를 획기적으로 줄이는 레이어 캐싱(Layer Caching) 전략, 그리고 필수 환경 변수 설정법을 상세히 설명합니다.
다중 컨테이너 애플리케이션을 정의하는 Docker Compose의 핵심 전략을 정리합니다. DB 연결 오류를 막는 Healthcheck, 시스템 멈춤을 방지하는 Resource Limit, 그리고 설정 중복을 줄이는 YAML Anchor 활용법을 상세히 다룹니다.

JPA 사용 시 데이터가 증발하는 현상을 이해하기 위해 트랜잭션과 영속성 컨텍스트(메모리)의 관계를 파헤칩니다. 쓰기 지연(Write Behind)과 벌크 연산의 충돌 원리, 그리고 @Modifying을 통한 동기화 방법을 시스템 구조도와 함께 정리했습니다.

Spring Scheduler를 도입하여 예약된 방의 상태(자동 시작, 노쇼 종료, 정상 종료)를 자동으로 관리하는 로직을 구현했습니다. Cron 표현식을 활용한 주기적 실행 흐름과 JPA 쿼리 메서드를 이용한 상태 변경 과정을 상세히 정리합니다.
스케줄러 테스트 중 방 상태 변경(Dirty Checking)이 DB에 반영되지 않고 증발하는 문제를 해결했습니다. 트랜잭션 내에서 벌크 연산과 영속성 컨텍스트 관리가 충돌하는 원인을 분석하고 @Modifying 옵션으로 해결한 과정을 공유합니다.
API 엔드포인트 설계 시 ID 값을 Path Variable(/resource/{id})로 넘길지, Request Body로 넘길지 고민될 때의 판단 기준을 정리했습니다. 확장성, RESTful 의미론, 그리고 서버 로그와 관련된 보안 이슈를 비교 분석합니다.

DTO 유효성 검증(@Valid) 실패 시 400 Bad Request가 아닌 500 Internal Server Error가 발생하는 원인을 분석합니다. MethodArgumentNotValidException을 전역 예외 처리기에서 핸들링하여 커스텀 에러 코드로 응답하는 방법을 정리했습니다.

둥지 프로젝트의 서비스화를 위해 AWS 프리티어의 한계를 극복하는 하이브리드 클라우드(AWS + Home PC) 아키텍처를 설계했습니다. FastAPI, React, RDS, Redis 등을 선정한 구체적인 이유와 도메인 주도 폴더 구조 설계를 공유합니다.
application.yml에 server.servlet.context-path를 설정했을 때, Spring Security와 Controller에서 403 Forbidden 에러가 발생하는 원인과 해결 방법을 정리했습니다.