실시간 농산물 선별 백엔드 플랫폼
전국 20개 이상 현장에 납품된 온프레미스 AI 선별 시스템의 핵심 백엔드
배경
기존 농산물 AI 자동 등급 분류 시스템은 PyQt 기반 로컬 설정 앱과 분산된 스크립트로 운영되어, 현장별 커스터마이징이 어렵고 원격 모니터링이 불가능했습니다. Flask + Blueprint 구조의 유지보수 한계, Admin 기능 부재, Django 생태계의 채용 용이성 등을 고려해 백엔드 플랫폼을 Django + DRF로 전면 재구축하기로 결정했습니다. 전국 20개 이상의 농산물 선별 시설에서 초당 30건 이상의 선별 요청을 처리해야 하는 환경이었습니다.
해결 과정
Django + DRF를 선택한 이유는 ORM 기반 모델링, Admin 자동 생성, API 문서 자동화, 풍부한 생태계가 산업용 시스템에 적합했기 때문입니다. 2024년 12월부터 약 2개월 만에 인증, 선별, 설정 관리, 모니터링, 대시보드, PLC 통신, 관리자 설정 등 8개 Django 앱을 설계하고 구축했습니다. JWT 인증 시스템, RBAC 기반 권한 관리, 설정 프로파일 관리(버전 관리, Import/Export, Soft Delete)를 포함하여 v3.5.0 릴리스를 달성했습니다.
초당 30건 이상의 선별 요청에서 등급 연산, PLC 폴링, 이미지 업로드 등이 API 서버를 블로킹하는 문제를 해결하기 위해, Celery Worker를 작업 특성별로 3개 전용 큐(등급 연산, 범용 I/O, PLC 폴링)로 분리했습니다. Lock-free Redis 분산 카운터로 Race Condition을 방지하고, 50건 Batch Insert + 1초 Timeout으로 DB 트랜잭션 오버헤드를 최소화했습니다.
선별 데이터가 매일 수만 건씩 누적되면서 대시보드 로딩이 느려지는 문제에는 PostgreSQL RANGE 파티셔닝을 도입했습니다. Celery Beat가 매일 자동으로 파티션을 롤링하고 30일 초과 데이터를 정리하며, 핵심 7개 모델에 복합 인덱스를 추가하여 조회 성능을 최적화했습니다.
매 선별 요청마다 설정 데이터를 DB에서 조회하는 병목은 3단계 폴백 캐시 구조(Worker-level 캐시 → Redis 캐시 → DB)로 해결했습니다. DTO 패턴 기반 캐시 관리자를 구현하여 서버 시작 시 캐시 워밍, 무효화 전략, 스레드 안전한 초기화를 적용했습니다.
또한 기존에 분리된 두 개의 데이터 처리 프로세스(결과 전송 + 분류 수신)를 통합 처리 엔진 단일 프로세스로 합쳐 설정 동기화를 간소화하고, 별도 Docker 컨테이너로 운영하여 관리 복잡도를 줄였습니다.
성과
- PostgreSQL 파티셔닝으로 대시보드 로딩 시간 85% 단축, 그래프 API 응답 속도 90% 개선
- 4개 도메인(Vision/Weight/Discharge/Farm) DTO 기반 캐싱 프레임워크 구축, 목표 캐시 적중률 80%로 설정 조회 DB 부하 대폭 절감
- Docker Compose 7개 서비스 정의, 현장별 브랜치 관리를 통해 전국 20개 이상 시설에 v3.5.2 납품
- Django Channels + Redis Pub/Sub 이중 실시간 통신 체계로 장비 상태, 온도, 선별 데이터를 WebSocket 서버 푸시 방식으로 제공