이 프로젝트는 LLM을 활용한 여행 경로 추천 앱 **'TripOut'**을 위한 Python FastAPI 서버입니다.
- 2025.03.29(토) ~ (진행 중)
- Python: 3.10.16
- Framework: FastAPI 0.115.12
- IDE: Visual Studio Code
- Web Server (ASGI): Uvicorn
FastAPI 서버를 로컬 환경에서 실행하는 방법을 안내합니다.
-
Python 3.10.16
공식 다운로드 링크
(개발은 3.10.16 버전 기준입니다.) -
pip
Python 패키지 관리자. 대부분 Python 설치 시 자동 포함됩니다. -
외부 API KEY
- OpenAI API KEY
- KakaoMap API KEY
- Naver API KEY
-
패키지 설치 스크립트(
package_install.sh
) 사용법- 실행 권한 부여
chmod +x package_install.sh
- 패키지 설치 (Windows의 경우, Git Bash 등에서 실행)
./package_install.sh
- (선택) 가상환경 활성화
- 이미 가상환경이 있다면 아래 명령어를 실행하세요.
source .venv/bin/activate
- 이미 가상환경이 있다면 아래 명령어를 실행하세요.
- 실행 권한 부여
-
외부 API KEY: 프로젝트에서 사용하는 외부 API 키가 필요합니다.
- OpenAI API KEY
- KakaoMap API KEY
- Gemini API KEY
-
환경 변수 파일 생성
env_sample
파일을 복사해서.env
파일로 이름을 변경하세요. -
.env 파일 편집
필요한 API KEY 값을.env
에 입력합니다.
아래 명령어로 서버를 실행하세요:
uvicorn app.fastapi_cicd.flutter_fast_api:app --reload --host=0.0.0.0 --port 8000
카테고리 종류는 카카오 지도 API 카테고리 코드를 참고하세요.
- HTTP Method:
POST
- Endpoint:
/list/{category}
- Content-Type:
application/json
- 좌표 데이터: 쿼리 파라미터로 전달 (
x
,y
)
curl -X POST \
-H "Content-Type: application/json" \
-d '{"x": 127.743288, "y": 37.872316}' \
'http://127.0.0.1:8000/list/FD6'
Parameter | Type | Description |
---|---|---|
x |
float | 경도 (예: 127.743288) |
y |
float | 위도 (예: 37.872316) |
Key | Type | 설명 |
---|---|---|
store_name |
string | 장소 이름 |
AI_score |
float | Gemini가 판단한 장소 평가 점수 (0~10) |
x |
float | 장소의 x좌표(경도) |
y |
float | 장소의 y좌표(위도) |
status |
string | 장소의 현재 영업 정보 (예: '영업 중', '영업 종료') |
status_description |
string | 장소의 영업 설명 (예: '11:00에 영업 시작') |
visitorReviewScore |
string | 리뷰 평점(없으면 null) |
visitorReviewCount |
string | 리뷰 수(없으면 null) |
phone_number |
string | 장소 전화번호(없으면 null) |
[
{
"store_name": "육림객잔",
"AI_score": 9.0,
"x": 127.7415547,
"y": 37.8742425,
"status": "영업 종료",
"status_description": "11:30에 영업 시작",
"visitorReviewScore": null,
"visitorReviewCount": "55",
"phone_number": null
},
{
"store_name": "진미닭갈비 본점",
"AI_score": 7.5,
"x": 127.7367503,
"y": 37.8682037,
"status": "영업 종료",
"status_description": "10:30에 영업 시작",
"visitorReviewScore": "4.46",
"visitorReviewCount": "807",
"phone_number": "033-243-2888"
},
{
"store_name": "1.5닭갈비 본점",
"AI_score": 9.0,
"x": 127.7531309,
"y": 37.876346,
"status": "영업 종료",
"status_description": "11:00에 영업 시작",
"visitorReviewScore": "4.46",
"visitorReviewCount": "3,622",
"phone_number": "033-253-8635"
},
// ... 이하 생략
]
-
AI_score: Google Gemini 모델이 리뷰/영업정보 등을 종합 평가한 점수 (0~10, 높을수록 추천)
-
status/status_description: 실시간 크롤링된 영업 정보(없으면 null)
-
visitorReviewScore/visitorReviewCount: 리뷰 평점 및 리뷰 수 (없으면 null)
-
phone_number: 장소 연락처(없으면 null)

프로젝트의 일관성을 위해 다음 커밋 컨벤션을 사용합니다.
Tag | Name | Description |
---|---|---|
Feat | 기능 추가 | 새로운 기능/주요 파일을 추가할 때 |
Fix | 버그 수정 | 버그를 수정할 때 |
Design | 디자인 변경 | CSS 등 사용자 UI 디자인 변경 |
!BREAKING CHANGE | API 변경 | 커다란 API 변경의 경우 |
!HOTFIX | 긴급 버그 | 급하게 치명적인 버그를 고칠 때 |
Style | 스타일링 | 코드 포맷 변경, 세미콜론 누락, 코드 변경 없음 |
Refactor | 리팩토링 | 프로덕션 코드 리팩토링 |
Comment | 주석 | 필요한 주석 추가 및 변경 |
Docs | 문서 | 문서 수정 |
Test | 테스트 | 테스트 코드 추가/리팩토링(Production Code 변경 없음) |
Chore | 잡무 | 빌드 업무, 패키지 매니저 수정 등 (코드 변경 없음) |
Rename | 이름 변경 | 파일/폴더명 수정 또는 이동만 수행한 경우 |
Remove | 삭제 | 파일 삭제 작업만 수행한 경우 |
- 타입: 위 표의 Tag 중 하나
- 간단한 설명: 50자 이내, 현재형으로 작성
- 상세 설명: 필요 시 한 줄 띄우고 자세히 작성
- 간단한 코드 수정
- 버그 수정 →
Fix
- 코드 개선 →
Refactor
- 포맷팅만 →
Style
- 주석 추가 →
Comment
- 문서 파일 추가 →
Docs
- 버그 수정 →
- 커밋 메시지는 현재형으로 작성
- 제목은 50자 이내로 간결하게
- 본문이 필요한 경우 한 줄 띄우고 상세 설명 작성