-
[FastAPI] 분석 엔진에 '눈', EasyOCR 연동 및 트러블슈팅 (Saga Step 2)프로젝트/개인프로젝트 2026. 3. 10. 10:29
안녕하세요! 오늘은 우리 분석 요원(FastAPI)에게 이미지 속 글자를 읽을 수 있는 능력을 부여했습니다. 🤖 파이썬의 강력한 라이브러리인 EasyOCR을 활용해 실제 메뉴판을 텍스트로 변환하는 과정을 공유할게요!
🏗️ 1. 왜 EasyOCR인가요?
메뉴판은 한글과 영어가 섞여 있는 경우가 많아요. 🇰🇷🇺🇸
- 다국어 지원: 80개 이상의 언어를 지원하며, 특히 한글 인식률이 매우 뛰어납니다.
- 가벼움과 고성능: 별도의 클라우드 유료 API 없이도 로컬에서 딥러닝 기반의 정확한 분석이 가능해요.
🛠️ 2. 오늘 만난 에러 에러들 (Troubleshooting)
❌ Issue 1: "이미지가 어디 있는지 모르겠어요!" (경로 문제)
메시지는 잘 수신했는데, 자꾸 파일을 못 찾는다는 에러가 떴습니다.
- 원인: 모노레포 구조에서 FastAPI가 NestJS의 uploads 폴더를 찾아가야 하는데, 상대 경로(../) 설정이 꼬여있었습니다.
- 해결: os.path.abspath와 os.path.join을 활용해 절대 경로를 로그로 찍어가며 위치를 정확히 잡아주었습니다! 📍
❌ Issue 2: "분석 결과가 텅 비어 있어요" (인식 실패)
파일은 찾았는데 결과가 빈 리스트([])로 나오는 현상이 있었습니다.
- 원인: 텍스트가 없는 단순 음식 사진을 넣었거나, 이미지 해상도가 너무 낮을 때 발생합니다.
- 해결: 글자가 선명한 메뉴판 이미지로 테스트하고, OCR 엔진 내부의 try-except 문을 보강해 원본 결과를 상세히 디버깅하도록 수정했습니다.
💻 3. 핵심 코드: OCR 서비스 쪼개기
유지보수를 위해 main.py에 다 넣지 않고, 서비스를 별도로 분리했습니다.
# app/services/ocr_service.py class OCRService: def __init__(self): # 한글, 영어 모델 로드 (서버 시작 시 한 번만!) self.reader = easyocr.Reader(['ko', 'en']) def extract_text(self, image_path: str): # 이미지에서 텍스트만 리스트로 쏙! return self.reader.readtext(image_path, detail=0)
📸 4. 분석 결과 (Log)

드디어 터미널에 찍힌 한글 메뉴 이름들! 비빔밥, 떡볶이, 심지어 원산지 정보까지 완벽하게 읽어냈습니다. 🏆
🏁 마치며
이제 분석 엔진은 글자를 읽을 줄 알게 되었습니다! 👁️ 다음 포스팅에서는 이 텍스트들을 다시 NestJS로 보내서 DB의 상태를 '분석 완료'로 바꾸는, 비동기 Saga 패턴을 완성해보겠습니다.
추후 AI를 학습시켜서 이렇게 분석한 메뉴판마다의 음식들 별로 칼로리도 계산할 수 있도록 만들어 보고 싶습니다.
또한 현재는 글이나 단어를 읽고 분석 결과를 나타내는데 사진만 보고도 어떤 음식인지 알 수 있도록 구현해보고 싶습니다.
'프로젝트 > 개인프로젝트' 카테고리의 다른 글
[FastAPI] 파이썬 분석 엔진 기지 건설! RabbitMQ 메시지 수신 성공기 (feat. zsh 트러블슈팅) (0) 2026.03.10 🚀 [NestJS] Saga 패턴의 시작: RabbitMQ와 함께하는 비동기 메뉴 분석 API 구현기 (0) 2026.03.08 [NestJS] 회원가입부터 사용자 취향 설정까지: 인증 및 유저 모듈 통합기 (F-03, F-04) (0) 2026.03.07 🥗 [NestJS/Prisma] 식단 관리 서비스의 꽃, 주간 리포트 API 구현 및 트러블슈팅 (0) 2026.03.05 Meal API Troubleshooting(API 보안 강화) (0) 2026.03.04