해커톤: 아이디어 도출, 팀 구축, 구현, 입상 전략까지 - Chapter 4 프로젝트
일주일 치 구내식당 식단표를 OCR로 인식하여 메신저 봇을 통해 하루 단위로 확인할 수 있는 서비스입니다.
- 아이디어 도출 기법: 마인드 맵, 스캠퍼(SCAMPER), 스마트(SMART) 기법 실습
- OCR API 활용: 네이버 CLOVA OCR을 이용한 식단표 이미지 텍스트 추출
- 서버리스 아키텍처: AWS Lambda와 DynamoDB를 활용한 경량 서비스 구축
- 메신저 봇 연동: Slack Bot과의 API 연동을 통한 사용자 인터페이스 제공
- 웹 스크래핑: BeautifulSoup을 이용한 식단표 이미지 URL 추출
매주 업데이트되는 구내식당 식단표 이미지를 자동으로 수집하고, OCR 기술로 텍스트를 추출하여 메신저를 통해 당일 메뉴를 간편하게 조회할 수 있는 봇 서비스입니다.
- 📷 구내식당 웹사이트에서 식단표 이미지 자동 수집
- 🔍 CLOVA OCR API를 통한 이미지 텍스트 인식
- 📅 날짜별 점심/저녁 메뉴 데이터 자동 파싱 및 저장
- 🤖 Slack 메신저를 통한 실시간 메뉴 조회
- ☁️ 서버리스 아키텍처로 관리 부담 최소화
🌐 웹사이트 → ⚡ OCR Lambda → 🗄️ DynamoDB
(식단표) (이미지 처리) (저장)
↑
│ 조회
│
🤖 Slack Bot ← ⚡ 조회 Lambda ───────┘
(사용자) (메뉴 응답)
- 클라우드: AWS Lambda, DynamoDB
- 언어: Python 3.9+
- OCR: 네이버 CLOVA OCR API
- 웹 스크래핑: BeautifulSoup4, requests
- 메신저: Slack Bot API
- 데이터 처리: boto3 (AWS SDK)
CafeteriaMenuBot/
├── README.md
├── requirements.txt
├── lambda_layer.zip # 공통 의존성 레이어
├── saveCafeteriaMenu/
│ └── lambda_function.py # 식단표 수집 및 저장
├── getCafeteriaLunchMenu/
│ └── lambda_function.py # 점심 메뉴 조회
└── getCafeteriaAllOfMenu/
└── lambda_function.py # 전체 메뉴 조회
- 역할: 구내식당 웹사이트에서 식단표 이미지를 수집하고 OCR 처리
- 주요 기능:
- 웹사이트에서 식단표 이미지 URL 추출
- CLOVA OCR API로 이미지 텍스트 인식
- 날짜별/시간대별 메뉴 파싱 및 DynamoDB 저장
- 실행 주기: 주 1회 (스케줄링)
- 역할: 당일 점심 메뉴만 조회하여 Slack으로 응답
- 주요 기능:
- DynamoDB에서 당일 점심 메뉴 조회
- Slack Block Kit 형식으로 응답 포맷팅
- 역할: 당일 전체 메뉴(점심+저녁) 조회하여 Slack으로 응답
- 주요 기능:
- DynamoDB에서 당일 전체 메뉴 조회
- 점심/저녁 메뉴를 구분하여 응답
- AWS 계정 및 AWS CLI 설정
- 네이버 클라우드 플랫폼 계정 (CLOVA OCR 사용)
- Slack 워크스페이스 및 Bot 토큰
# 프로젝트 클론
git clone https://github.com/roharon/book-hackathon-project.git
cd CafeteriaMenuBot
# Python 의존성 설치
pip install -r requirements.txtaws dynamodb create-table \
--table-name cafeteria_menu \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUESTaws lambda publish-layer-version \
--layer-name cafeteria-menu-dependencies \
--zip-file fileb://lambda_layer.zip \
--compatible-runtimes python3.9각 함수별로 배포 패키지를 생성하고 업로드합니다.
cd saveCafeteriaMenu
zip -r ../saveCafeteriaMenu.zip .
cd ..
aws lambda create-function \
--function-name saveCafeteriaMenu \
--zip-file fileb://saveCafeteriaMenu.zip \
--handler lambda_function.lambda_handler \
--runtime python3.9 \
--role arn:aws:iam::YOUR_ACCOUNT:role/lambda-execution-role \
--layers arn:aws:lambda:REGION:ACCOUNT:layer:cafeteria-menu-dependencies:1 \
--environment Variables='{
"CLOVA_OCR_URL":"YOUR_CLOVA_OCR_ENDPOINT",
"CLOVA_OCR_SECRET":"YOUR_CLOVA_OCR_SECRET"
}'# getCafeteriaLunchMenu
cd getCafeteriaLunchMenu
zip -r ../getCafeteriaLunchMenu.zip .
cd ..
aws lambda create-function \
--function-name getCafeteriaLunchMenu \
--zip-file fileb://getCafeteriaLunchMenu.zip \
--handler lambda_function.lambda_handler \
--runtime python3.9 \
--role arn:aws:iam::YOUR_ACCOUNT:role/lambda-execution-role \
--layers arn:aws:lambda:REGION:ACCOUNT:layer:cafeteria-menu-dependencies:1
# getCafeteriaAllOfMenu (동일한 방식으로 배포)Slack Bot과 연동하기 위한 REST API 엔드포인트를 생성합니다.
# API Gateway 생성
aws apigateway create-rest-api --name cafeteria-menu-api
# 리소스 및 메서드 생성
# /lunch-menu (POST) -> getCafeteriaLunchMenu
# /all-menu (POST) -> getCafeteriaAllOfMenu- 네이버 클라우드 플랫폼에서 CLOVA OCR 서비스 신청
- API Gateway 도메인과 Secret Key 발급
- Lambda 함수에 환경 변수 설정:
CLOVA_OCR_URL: OCR API 엔드포인트CLOVA_OCR_SECRET: OCR API 시크릿 키
- Slack App 생성 및 Bot Token 발급
- Slash Command 설정:
/점심메뉴: 점심 메뉴 조회 명령/전체메뉴: 전체 메뉴 조회 명령
- Request URL을 API Gateway 엔드포인트로 설정
POST /lunch-menu
Content-Type: application/x-www-form-urlencoded
Response:
{
"response_type": "in_channel",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*점심 메뉴*"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "메뉴 내용..."
}
}
]
}
POST /all-menu
Content-Type: application/x-www-form-urlencoded
Response: 점심 + 저녁 메뉴 블록 조합
- 이미지에서 텍스트를 추출하는 OCR의 원리와 활용법
- 네이버 CLOVA OCR API의 테이블 인식 기능 활용
- OCR 결과 데이터의 정제 및 파싱 기법
- AWS Lambda의 이벤트 기반 처리 모델
- DynamoDB NoSQL 데이터베이스 설계
- Lambda Layer를 통한 의존성 관리
- BeautifulSoup을 이용한 HTML 파싱
- 동적 웹사이트에서 데이터 추출하기
- 웹 스크래핑 시 고려사항 (로봇 배제 표준, 요청 빈도 등)
- Slack Bot API와 Block Kit 활용
- Slash Command 구현 및 응답 포맷팅
- 사용자 친화적인 메시지 디자인
- 정규표현식을 이용한 텍스트 패턴 매칭
- 날짜/시간 데이터 처리
- 반복적인 데이터 구조 파싱
- 이미지 품질 확인 (해상도, 명도, 대비)
- OCR API 파라미터 조정 (
enableTableDetection등) - 전처리 과정 추가 (이미지 크기 조정, 노이즈 제거)
- 타임아웃 설정 증가 (최대 15분)
- 메모리 할당량 증가
- 처리 로직 최적화 (병렬 처리, 캐싱)
- IAM 역할 권한 확인
- 테이블명 및 키 스키마 확인
- VPC 설정 시 엔드포인트 확인
- Lambda 콜드 스타트 최소화
- 응답 시간 3초 이내 유지
- 필요시 비동기 처리 구현
『해커톤: 아이디어 도출, 팀 구축, 구현, 입상 전략까지』
- 저자: 노아론 (github.com/roharon)
- 출판사: 로드북
- 출간일: 2025년 7월 28일
이 프로젝트를 통해 OCR 기술과 서버리스 아키텍처를 활용한 실용적인 서비스 개발 경험을 쌓아보세요!