Github 링크
LALA: 외국인 관광객을 위한 로컬 데이터 + Azure AI RAG 기반 지능형 가이드 서비스
서울 너머 진짜 한국의 숨결을 잇는 로컬 관광 솔루션
내국인 일상 데이터(카드 소비, 지역 커뮤니티 언급)와 AI 기술을 결합하여, 정보의 갈라파고스를 해소하고 지역 경제 활성화를 도모하는 프로젝트입니다.
1. 프로젝트 개요 및 핵심 솔루션
- 문제 정의: 서울에만 편중된 관광 정보와 글로벌 플랫폼의 정보 부족으로 인해 외국인 관광객의 로컬 명소 접근이 제한됨.
- 핵심 솔루션:
- 내국인 데이터 기반: 경기도 카드 소비 데이터 및 당근마켓 언급수 기반의 '진짜 맛집/명소' 랭킹 시스템.
- AI 도슨트: 네이버 리뷰 기반의 맞춤형 가이드 및 AI 음성 인터페이스 제공.
- 기상 인지 추천: 악천후 발생 시 실내 코스로의 선제적 전환 알고리즘 적용.
2. 주요 기술적 성과 (Key Achievements)
🏗 인프라 및 보안 (Secret-Zero 환경 구축)
- Azure Key Vault & OIDC 연동: 하드코딩된 시크릿을 제거하고 Azure Key Vault와 GitHub Actions OIDC를 연동하여 보안성을 극대화했습니다.
- 서버리스 아키텍처: Azure Functions를 활용한 비용 효율적인 서버리스 구조를 설계하고 운영 효율을 높였습니다.
- Modern Python Workflow:
pyproject.toml을 도입하여 프로젝트 패키지화 및 경로 문제를 해결하고, 싱글톤 패턴 기반의 KeyVaultManager를 구현하여 성능을 최적화했습니다.
📊 데이터 엔지니어링 및 백엔드
- 공간 데이터 최적화: PostgreSQL + PostGIS를 활용해 반경 기반 장소 탐색 성능을 확보하고, pgvector를 통해 별도의 DB 없이 AI 유사도 검색을 구현했습니다.
- 크롤러 안정화 및 분산 처리: 배치형 실행 구조를 Azure Queue 기반 분산 처리로 전환하여 안정성을 확보하고, 데이터 파이프라인(Crawl → Aggregator)을 체인으로 연결했습니다.
- 데이터 정규화: IQR 이상치 보정 및 Min-Max 정규화를 통해 데이터 편향성을 제거하고 공정한 랭킹 시스템을 구축했습니다.
📱 iOS 앱 개발 및 UI/UX 최적화
- 맵 마커 클러스터링 최적화: 대량의 마커 렌더링 성능 이슈를 해결하기 위해 뷰포트 기반 필터링과 줌 레벨 버킷 캐싱을 도입했습니다.
- AI 기반 UX 개선: 배포 전 AI 시선 예측(Attention Insight) 모델로 시각적 위계를 점검하고, 배포 후 AI 행동 분석을 통해 이탈 요소를 제거하는 데이터 주도 UX를 실천했습니다.
- 안정적인 라이프사이클 관리: 앱 복귀 시 날씨 API가 갱신되지 않는 문제를
scenePhase 감지 로직으로 해결했습니다.
📈 모니터링 및 신뢰성 확보
- 하이브리드 모니터링: 실시간 장애 지표(Event Hub + ASA)와 배치 기반 비용 데이터(Cost API)를 통합한 Power BI 대시보드를 구축했습니다.
- XAI(설명 가능한 AI): 사용자에게 추천 근거(리뷰, 기상 데이터)를 투명하게 공개하여 서비스 신뢰도를 높였습니다.
3. 주요 트러블슈팅 사례 (Problem-Solving)
- 현상: 지도 확대 시 마커가 개별로 표시되지 않고 숫자 클러스터로만 남는 버그 발생.
- 원인: 과밀 구간 강제 클러스터링 정책이 최대 확대 상태를 반영하지 못함.
- 해결: 최대 확대 구간에서 강제 클러스터링 비활성화 및 줌/뷰포트 기반 캐시 키 도입으로 전환 안정화.
- 결과: 대량 마커 구간 프레임 드랍 감소 및 UX 일관성 확보.
4. 인공지능 윤리 적용
- 투명성: 기상청 등 데이터 출처 명시.
- 공정성: 광고성 리뷰 필터링 및 수학적 정규화로 데이터 편향 제거.
- 안전성: LLM 장애 시 사전 정의된 스크립트로 자동 전환되는 Fallback 아키텍처 설계.
- 포용성: 시각 정보 보완을 위한 다국어 TTS(Azure Speech) 및 영어 UI 지원.
기술 스택: Azure (Functions, Key Vault, OpenAI, Event Hub), PostgreSQL (PostGIS, pgvector), Swift (iOS), Python, Power BI
시연
시연 동영상
iOS 기능 시연 동영상
전체 시연 동영상
웹앱



iOS





Monitoring Dashboard(PowerBI)




Azure Resource


데이터 파이프라인

담당
- WebApp 부분, iOS
- github 개발환경 구성, OIDC 구성
- Azure Keyvault 책임자
- 당근 크롤링 처리
- 경기도 카드 소비 공공데이터 적재
- PowerBI, Azure Log 파이프라인 구성
사용 스택
- GPT5.3-Codex Agentic Code
- Azure Keyvault
- Azure Function
- Azure Container
- Azure PostgreSQL(PostGIS, PGVector)
- Azure Eventhub
- Azure Stream Analytics
- Azure AI(chatgpt-4o-mini, text-embedding), RAG
- Docker
- Azure WebApp
- Azure AI
- Azure Speech
- Python 3.11
- Selenium
- Github Action
- Github OIDC
- Github Project
- git
트러블슈팅
1. 인프라 및 보안 (Infrastructure & Security)
- Azure Key Vault 및 OIDC 인증 오류
- 문제: GitHub Actions를 통한 배포 중
ForbiddenByRbac(권한 부족) 에러 및 AADSTS700213(페더레이션 자격 증명 주체 불일치) 오류 발생.
- 원인: Key Vault에 대한 접근 권한 설정 미비 및 GitHub 브랜치와 Azure의 federated credential subject가 일치하지 않음.
- 해결: Key Vault에
Secrets Officer 권한을 부여하고, dev 브랜치용 주체 정보를 추가하여 OIDC 로그인을 성공시킴.
- 환경 변수 주입 및 실행 경로 문제
- 문제: 로컬에서
.env 파일은 존재하나 프로세스 환경 변수로 자동 주입되지 않아 DB_DSN 누락 에러 발생.
- 해결:
python-dotenv 라이브러리를 통해 .env 자동 로드 로직을 구현하고, 필수 값 누락 시 명시적 예외 처리를 추가함.
2. 백엔드 및 데이터 엔지니어링 (Backend & Data Engineering)
- PostgreSQL 및 pgvector 버전 불일치
- 문제:
extension "vector" is not available 에러 발생.
- 원인: pgvector 확장 프로그램은 PostgreSQL 17/18 경로에 설치되었으나, 실제 실행 중인 서버는 PostgreSQL 16 버전이었음.
- 해결: PostgreSQL 서버 버전과 pgvector 설치 경로를 맞추고 PATH를 재설정하여 확장 프로그램 설치 성공.
- 데이터 파이프라인 자료형 불일치
- 문제: 에어코리아 API에서 예상치 못한 문자열("점검중") 유입으로 파이프라인 셧다운 발생 및 자료형 불일치 충돌.
- 해결: 숫자가 아닌 값 유입 시
Null을 반환하는 예외 처리를 추가하고, 인식 가능한 BIGINT로 형변환을 수행함.
- 당근 크롤러 워커 상태 정체
- 문제: 단일 배치에서 큐(Queue) 기반 분산 처리로 전환 후 워커 상태 오판정으로 처리 누락 및
running 상태 정체 발생.
- 해결:
UPDATE ... RETURNING 문을 사용하여 상태 전환 로직을 고정하고, 정체된 태스크를 자동으로 정리하는 가드 로직을 도입함. -> Timeout 문제 해결
3. iOS 프론트엔드 (iOS Frontend)
- 지도 마커 렌더링 성능 및 UX 이슈
- 문제: 마커가 많아질 때 렌더링 지연 및 최대 확대 상태에서도 개별 마커가 아닌 숫자 클러스터로 표시되는 버그 발생.
- 원인: 클러스터링 판단 로직이 줌/뷰포트 상태를 완전히 반영하지 못하고 화면 밖 마커까지 계산에 포함함.
- 해결: 뷰포트 기반 필터링으로 계산량을 줄이고, 최대 확대 구간에서 강제 클러스터링을 비활성화하여 개별 마커 노출을 보장함.
- 앱 백그라운드 복귀 시 데이터 미갱신
- 문제: 백그라운드에서 다시 활성화 시 날씨 정보가 갱신되지 않음.
- 해결:
scenePhase 변화를 감지하여 앱이 .active 상태가 될 때 위치 정보를 강제 호출하고 날씨 API를 다시 가져오는(reload) 경로를 보장함.
4. AI 및 모니터링 (AI & Monitoring)
- AI 도슨트 환각(Hallucination) 현상
- 문제: 명소 도슨트가 맛집이나 카페 정보를 설명하는 오류 발생.
- 원인: 네이버 리뷰 데이터에 명소 후기와 식도락 리뷰가 혼재되어 LLM에 전달됨.
- 해결:
clean_and_filter_text() 함수를 통해 식도락 키워드를 사전에 필터링하고 검증된 데이터만 LLM에 전달하는 가드레일을 구축함.
- Power BI 모니터링 대시보드 오류
- 문제:
DirectQuery 모델 로드 실패 및 실시간 서비스명이 'unknown'으로 표시됨.
- 원인: DirectQuery에서 지원하지 않는 M 변환 사용 및 ASA(Stream Analytics) 매핑 필드 불일치.
- 해결: 파티션 쿼리를 단순화하고, SAQL에서 다중 필드 파싱 및 정규화를 강화하여 정상적인 서비스 매핑을 구현함.
배운점
- 자신이 참여한 프로젝트는 최선을 다하여 마무리를 반드시 지으려는 마음가짐을 팀원분께 배웠다.
- Github Workflow를 이용한 Github Projects 칸반 자동화
- Github OIDC + Azure Keyvault를 이용한 배포시 환경변수 주입 전략
- Docker Container를 이용한 linux 환경에서의 팀 개발 환경 동일화 전략
- Docker Container를 Azure Container에 올려 컨테이너단위 버전 관리 전략
- Eventhub Namespace는 이름 재작성이 안됨 -> Blue-Green 방식으로 알맞은 Eventhub Namespace로 서비스 이동 전략
- CosmosDB는 전세계적 실시간 접근에 용이한 cost high NOSQL DB -> 그게 아니라면 비용을 따져 관계형 DB인 Azure PostgreSQL 사용
- robots.txt 확인하고 크롤링을 해야 함(당근 크롤링시 확인을 뒤늦게 한 패착)
- Flask API를 이용해 python 코드 기반의 라우팅을 연결하려면 docker container단위로 Azure Container에 올려 배포하면 REST API 기반으로 사용 가능하다.
- Eventhub에서 PowerBI로 출력 시 파티션 사용 불가
- 이때문에 준실시간 관제형 PowerBI 의미체계모델 생성은 하이브리드 아키텍처 확정: Event Hub -> ASA -> Function -> PostgreSQL -> Power BI(Direct Query)
- mac에서는 powerbi desktop 사용 불가. 굳이 수정하려면 windows에서 pbip 파일 생성 후 report폴더의 json을 수정하는 형태로 사용
- iOS 에서 화면 로딩이 느릴 시 캐싱을 활용하여 개선 가능
- 서버에서 값을 받아오는 것을 실패할 시 대신 기본으로 표현하는 방식을 fallback이라고 함
- agent skill을 이용한 front design skill, ui-ux-pro skill codex에 적용하기
- gh 설치 통한 pr 작성
- azure ai foundry, python을 통한 튜닝
- azure speech를 통해 tts 생성이 가능하며, 프론트에서 api를 통해 가져와 사용 가능
- Azure ResourceGroup에서 역할을 할당하여 접근 가능한 리소스 설정 가능
- PowerBI 라이선스 계정이 다른 계정에 있을 경우, 게스트로 초대하여 관련 리소스 읽기 권한을 최소한으로 부여하여 모니터링 관련 리소스 접근 가능