hgzero/reference/sample_유저스토리.md
2025-10-14 15:15:44 +09:00

44 KiB

여행 상세 일정 생성 서비스 - 유저스토리


마이크로서비스 구성

  1. User - 사용자 인증 및 사용자 정보 관리
  2. Trip - 여행 기본정보, 여행지 정보, 시간별 상세일정 요청/저장
  3. AI - AI 기반 시간별 상세 일정 생성 및 장소 추천 정보
  4. Location - 주변 장소 검색

유저스토리

1. User
1) 사용자 인증 및 관리
UFR-USER-010: [회원가입] 사용자로서 | 나는 여행 계획을 관리하기 위해 | 간편하게 회원가입하고 싶다.
- 시나리오: 신규 회원가입
  미로그인 상태에서 회원가입 화면에 접근한 상황에서 | 필수 정보를 모두 입력하고 회원가입 버튼을 클릭하면 | 가입이 완료되고 로그인 화면으로 이동한다.
  
  [입력 요구사항]
  - 기본 정보
    - 이름: 2자 이상 (한글/영문)
    - 이메일: 이메일 형식 준수
    - 연락처: 휴대폰 번호 형식
    - 아이디: 5자 이상 영문/숫자 조합
    - 비밀번호: 8자 이상 (영문/숫자/특수문자 포함)
    - 비밀번호 확인: 비밀번호와 동일
  
  [검증 요구사항]
  - 실시간 입력 검증
    - 각 필드 포커스 아웃 시 형식 검증
    - 아이디/이메일 중복 확인 (비동기)
    - 비밀번호 강도 표시 (약함/보통/강함)
  - 제출 시 검증
    - 모든 필수 항목 입력 확인
    - 이용약관 동의 여부 확인
  
  [처리 결과]
  - 성공: "회원가입이 완료되었습니다" 메시지 → 로그인 화면
  - 실패: 구체적인 오류 메시지 표시 (해당 필드 하단)
  
- M/13

---

UFR-USER-020: [로그인] 사용자로서 | 나는 여행 계획을 관리하기 위해 | 간편하게 로그인하고 싶다.
- 시나리오 1: 사용자 로그인
  미로그인 상태에서 로그인 화면에 접근한 상황에서 | 아이디와 비밀번호를 입력하고 로그인 버튼을 클릭하면 | 인증이 완료되고 대시보드로 이동한다.
  
  [입력 요구사항]
  - 아이디: 등록된 아이디 입력
  - 비밀번호: 해당 계정의 비밀번호 입력
  - 로그인 유지: 선택 옵션 제공
  
  [인증 처리]
  - 성공: 대시보드로 즉시 이동
  - 실패: "아이디 또는 비밀번호를 확인해주세요" 메시지
  - 5회 연속 실패: 30분간 계정 잠금 안내
  
- 시나리오 2: 로그인 상태 표시
  로그인 완료 후 대시보드에 접근한 상황에서 | 화면 상단 헤더를 확인하면 | 내 프로필 정보가 표시된다.
  
  [프로필 표시 요구사항]
  - 사용자 아바타: 이름 첫 글자 원형 표시
  - 아바타 클릭 시 메뉴
    - 내 정보 보기
    - 프로필 편집
    - 로그아웃
  - 메뉴 선택 시 해당 기능 실행
  
- M/8

---

UFR-USER-030: [프로필관리] 사용자로서 | 나는 내 정보를 최신 상태로 유지하기 위해 | 프로필 정보를 편집하고 싶다.
- 시나리오: 프로필 정보 수정
  로그인한 상태에서 프로필 편집 화면에 접근한 상황에서 | 변경할 정보를 수정하고 저장 버튼을 클릭하면 | 변경사항이 저장되고 확인 메시지가 표시된다.
  
  [수정 가능 항목]
  - 기본 정보
    - 이름: 실명 변경 가능
    - 연락처: 휴대폰 번호 변경
    - 이메일: 변경 시 재인증 필요
  - 프로필 이미지
    - 이미지 업로드 (최대 5MB)
    - 지원 형식: JPG, PNG
    - 미리보기 제공
  - 비밀번호
    - 현재 비밀번호 확인 필수
    - 새 비밀번호 규칙 동일 적용
    
  [저장 처리]
  - 저장 전 확인: "변경사항을 저장하시겠습니까?"
  - 저장 완료: "프로필이 성공적으로 업데이트되었습니다"
  - 취소 선택: "변경사항이 저장되지 않습니다. 계속하시겠습니까?"
  
- C/8

---

UFR-USER-040: [로그아웃] 사용자로서 | 나는 보안을 위해 | 서비스 사용 후 안전하게 로그아웃하고 싶다.
- 시나리오: 안전한 로그아웃
  로그인된 상태에서 프로필 메뉴의 로그아웃을 선택한 상황에서 | 로그아웃 확인 다이얼로그에서 확인을 클릭하면 | 세션이 종료되고 로그인 화면으로 이동한다.
  
  [로그아웃 요구사항]
  - 확인 다이얼로그
    - 메시지: "로그아웃 하시겠습니까?"
    - 버튼: 취소/확인 (취소 버튼이 기본 선택)
  - 로그아웃 위치
    - 프로필 드롭다운 메뉴 최하단
    - 아이콘과 텍스트로 표시
    
  [처리 결과]
  - 확인 선택: "안전하게 로그아웃되었습니다" 메시지 → 로그인 화면
  - 취소 선택: 다이얼로그 닫힘, 현재 화면 유지
  - 로그아웃 후 브라우저 뒤로가기 시 로그인 화면 유지
  
- S/3

---

2. Trip
1) 여행 관리 
UFR-TRIP-010: [주요서비스 배너] 여행자로서 | 나는 주요 서비스를 빠르게 접근하기 위해 | 대시보드에 새 여행 계획하기와 주변 장소 검색 기능의 배너를 보고 싶다.
- 시나리오: 주요 서비스 빠른 접근
  대시보드에 접근한 상황에서 | 상단 영역을 확인하면 | 새 여행 계획하기와 주변 장소 검색 배너가 표시되고 각각 클릭하여 해당 기능으로 이동할 수 있다.
  
  [배너 표시 요구사항]
  - 위치: 대시보드 상단 영역
  - 배치: 데스크톱(가로), 모바일(세로)
  - 스타일: 카드 형태로 시각적 구분
  
  [배너 구성]
  - 새 여행 계획하기 배너
    - 제목: "새 여행 계획하기"
    - 아이콘: 여행 관련 아이콘
    - 설명: "AI가 만드는 맞춤 여행 일정"
  - 주변 장소 검색 배너  
    - 제목: "주변 장소 검색"
    - 아이콘: 위치 관련 아이콘
    - 설명: "내 주변 맛집, 관광지 찾기"
    
  [상호작용 요구사항]
  - 새 여행 계획하기 클릭: 기본설정 화면 이동
  - 주변 장소 검색 클릭: 주변장소검색 화면 이동
  - 호버 효과: 카드 강조 표시
  
- S/3

---

UFR-TRIP-020: [상태별 여행 목록] 여행자로서 | 나는 여행 계획을 효율적으로 관리하기 위해 | 대시보드에서 여행중/계획중/추억중 상태별로 내 여행들을 확인하고 관리하고 싶다.
- 시나리오: 대시보드에서 여행 목록 확인
  로그인한 상태에서 대시보드에 접근한 상황에서 | 여행 목록 영역을 확인하면 | 내 여행들이 현재 상태에 따라 3개 섹션으로 구분되어 표시된다.
  
  [표시 요구사항]
  - 여행 상태별 섹션 구성
    - "여행중": 현재 진행 중인 여행
    - "계획중": 준비 중인 여행  
    - "추억중": 완료된 여행
  - 여행 카드 정보
    - 여행을 대표하는 이미지 (여행명 기반 자동 생성)
    - 여행명 표시
    - 여행 기간 (시작일 ~ 종료일) 및 우측에 진행상황 뱃지
    - 대표이미지 하단에 진행바 표시
  - 진행바 표시 방식 (이미지 하단)
    - 여행중: 전체 일정 대비 진행률 표시 (예: 50%)
    - 계획중: 4단계 진행 상황 표시 (기본설정/여행지설정/일정생성/완료)
    - 추억중: 진행바 표시 없음
  - 진행상황 뱃지 표시 방식 (여행기간 우측)
    - 여행중: "D+n" 형식 (예: D+5)
    - 계획중: 현재 단계명 (예: 기본설정중)
    - 추억중: 뱃지 표시 없음
    
  [상호작용 요구사항]  
  - 여행 카드 클릭 시 해당 여행의 상세 일정 화면으로 이동
  - 섹션당 최대 3개 카드 표시 (최신 순)
  - 추억중 섹션에 "전체보기" 링크 제공
  
  [비즈니스 규칙]
  - 여행 상태 자동 전환
    - 시작일 도래 시: 계획중 → 여행중
    - 종료일 경과 시: 여행중 → 추억중
  - 빈 섹션에는 해당 상태의 여행이 없음을 안내
  
- S/21

---

UFR-TRIP-022: [햄버거메뉴] 사용자로서 | 나는 모바일에서 주요 기능에 쉽게 접근하기 위해 | 햄버거 메뉴를 통해 네비게이션하고 싶다.
- 시나리오 1: 햄버거 메뉴 열기/닫기
  모바일 화면에서 | 상단 우측의 햄버거 메뉴(☰) 버튼을 탭하면 | 메뉴 패널이 전체 화면으로 표시된다.
  
  [메뉴 표시 방식]
  - 위치: 화면 중앙에 전체 화면 패널로 표시
  - 배경: 흰색 전체 화면 오버레이
  - 메뉴 항목: 세로 목록으로 중앙 정렬
  - 닫기: 메뉴 외부 영역 탭 시 자동으로 닫힘
  
- 시나리오 2: 메뉴 항목 선택
  햄버거 메뉴가 열린 상태에서 | 원하는 메뉴 항목을 탭하면 | 해당 화면으로 이동하고 메뉴는 자동으로 닫힌다.
  
  [메뉴 구성]
  - 🏠 홈: 대시보드로 이동
  - ✈️ 새 여행: 새 여행 계획 시작 (기본설정 화면)
  - 📍 장소검색: 주변 장소 검색 화면
  - 📋 여행목록: 전체 여행 목록 화면으로 이동
  
  [메뉴 디자인]
  - 각 항목: 아이콘 + 텍스트 레이블로 구성
  - 세로 배치: 한 줄에 하나의 메뉴 항목
  - 터치 영역: 최소 48px 높이
  - 여백: 항목 간 적절한 간격 유지
  
- 시나리오 3: 현재 페이지 표시
  어느 화면에서든 | 햄버거 메뉴를 열면 | 현재 있는 페이지의 메뉴 항목이 활성화 상태로 표시된다.
  
  [활성화 표시]
  - 텍스트 색상 변경 (파란색 등 강조색)
  - 해당 메뉴는 클릭 불가 상태

- S/5

---

UFR-TRIP-025: [하단네비게이션바] 사용자로서 | 나는 주요 기능에 빠르게 접근하기 위해 | 하단 네비게이션 바를 통해 앱을 탐색하고 싶다
- 시나리오: 하단 네비게이션 바 사용
  앱의 모든 화면에서 | 하단 네비게이션 바를 확인하면 | 4개의 주요 메뉴 아이콘이 항상 표시되고 탭하여 이동할 수 있다.
  
  [네비게이션 바 구성]
  - 🏠: 홈 (대시보드로 이동)
  - ✈️: 새 여행 (여행 생성 프로세스 시작)
  - 📍: 장소검색 (주변 장소 검색 화면)
  - 📋: 여행목록 (전체 여행 목록 화면)
  
  [표시 요구사항]
  - 위치: 화면 하단 고정
  - 아이콘만 표시 (텍스트 레이블 없음)
  - 현재 활성 메뉴: 아이콘 색상으로 구분
  - 터치 영역: 균등 분할, 최소 48px 높이
  - 키보드 활성화 시 네비게이션 바 숨김
  - 여행 생성 프로세스 중에는 네비게이션 바 비활성화
  
  [상호작용]
  - 메뉴 탭 시 즉시 화면 전환
  - 현재 화면 재탭 시 동작 없음
  - 화면 전환 시 부드러운 애니메이션

---

UFR-TRIP-030: [기본설정] 여행자로서 | 나는 여행 계획을 시작하기 위해 | 여행명과 함께 여행 멤버의 기본 정보와 이동수단 선호도를 한 화면에서 설정하고 싶다.
- 시나리오: 여행 기본정보 설정
  기본설정 화면에 접근한 상황에서 | 여행명, 멤버 정보, 이동수단을 입력하고 다음 단계를 클릭하면 | 모든 정보가 저장되고 여행일정설정 화면으로 이동한다.
  
  [여행 기본정보]
  - 여행명: 최대 16자 (필수)
  - 이동수단: 대중교통/자동차 중 선택 (필수)
  
  [멤버 관리]
  - 멤버 추가: 하단 '+' 버튼으로 입력 폼 표시
  - 멤버 정보
    - 기본: 이름(필수), 나이(필수), 성별(필수)
    - 건강상태: 우수/양호/주의/제한 중 선택 (필수)
      - 우수: 모든 활동 가능
      - 양호: 일반적인 활동 가능
      - 주의: 격렬한 활동 제한
      - 제한: 휴식 위주 활동
    - 활동 선호도: 관광/쇼핑/문화체험/자연체험/스포츠/휴식 (복수 선택)
  - 멤버 수정/삭제
    - 기본 상태: 편집/삭제 버튼 숨김
    - 멤버 카드 선택(클릭) 시: 편집/삭제 버튼 표시
    - 다른 카드 선택 시: 이전 카드 버튼 숨김, 새 카드 버튼 표시
  - 최대 인원: 10명
  
  [입력 검증]
  - 필수 항목 미입력 시 해당 필드 강조
  - 여행명 글자수 초과 시 실시간 알림
  - 멤버 미등록 시 안내 메시지 표시
  
  [자동 저장]
  - 입력한 정보가 자동으로 저장됨
  - 페이지를 다시 방문해도 이전 입력 정보가 그대로 남아있음
  - 브라우저를 닫았다가 다시 열어도 입력 정보 유지
  
- M/21

- 기술 태스크
  - 자동 저장 구현
    - LocalStorage를 활용한 3초 debounce 자동 저장
    - 페이지 재방문 시 LocalStorage에서 데이터 복원
    - 브라우저 종료에도 데이터 보존
  - 실시간 입력 검증
    - 프론트엔드에서 필드별 형식 검증
    - 서버 API 호출 최소화
  - 멤버 관리 UI
    - 동적 카드 생성/삭제
    - 선택 상태 기반 버튼 표시/숨김

---

UFR-TRIP-040: [여행지 설정] 여행자로서 | 나는 여행 계획을 세우기 위해 | 각 도시별 체류 기간과 숙소 정보를 관리하고 싶다.
- 시나리오: 여행지별 일정 설정
  여행일정설정 화면에 접근한 상황에서 | 여행 시작일을 설정하고 여행지별로 숙박일과 숙소 정보를 입력하면 | 각 여행지의 일정이 자동 계산되어 카드 형태로 표시된다.
  
  [여행 시작일 설정]
  - 전체 여행의 시작일 설정 (필수)
  - 안내 메시지: "여행시작일은 첫 여행지 도착일로 설정하세요"
  
  [여행지 카드 관리]
  - 여행지별 카드 표시
    - 숙박일수 표시 (n박)
    - 여행지명
    - 체류 기간 (자동 계산된 날짜 범위)
  - 편집/삭제
    - 기본 상태: 편집/삭제 버튼 숨김
    - 여행지 카드 선택(클릭) 시: 편집/삭제 버튼 표시
    - 다른 카드 선택 시: 이전 카드 버튼 숨김, 새 카드 버튼 표시
  - "+" 버튼으로 새 여행지 추가
  
  [새 여행지 추가]
  - 여행지명: 최대 20자 (필수)
  - 숙박일: 숫자 입력 (필수)
  - 숙소명: 최대 20자 (선택)
  - 체크인/체크아웃 시간: 시간 선택 (선택)
  - 추가/취소 버튼
  
  [자동 계산 및 검증]
  - 날짜 자동 계산: 이전 여행지 종료일이 다음 여행지 시작일로 자동 설정
  - 숙박일 입력하면 종료일이 자동으로 계산됨
  - 최소 1개 이상의 여행지 필수
  - 여행지 추가/편집/삭제할 때마다 변경사항이 자동 저장됨
  
- M/13

- 기술 태스크
  - 실시간 날짜 계산
    - 프론트엔드에서 날짜 자동 계산 로직 구현
    - 이전 여행지 종료일 기준 다음 여행지 시작일 설정
    - 숙박일 변경 시 후속 여행지 일정 자동 재계산
  - LocalStorage 자동 저장
    - 여행지 추가/편집/삭제 시 즉시 LocalStorage 저장
    - 날짜 계산 결과 실시간 저장
    - 페이지 새로고침/브라우저 종료 대응
  - 서버 통신 최적화
    - "다음 단계" 클릭 시에만 배치 API 호출
    - 전체 여행지 목록 일괄 전송
    - 날짜 연속성 서버 사이드 재검증

---

UFR-TRIP-050: [AI일정생성 요청] 여행자로서 | 나는 여행 상세 일정을 짜는 시간을 줄이고 최적의 여행을 위해 | AI 일정 생성을 요청하고 진행 상황을 확인하고 싶다.
- 시나리오: AI 일정 생성 요청 및 상태 확인
  여행 기본정보와 여행지가 설정된 상황에서 | AI일정생성 화면에서 시작시간과 요청사항을 입력하고 생성 버튼을 클릭하면 | AI 서비스에 요청이 전달되고 진행 상황이 실시간으로 표시된다.
  
  [생성 요청]
  - 여행명: 이전 단계에서 설정한 여행명 자동 표시
  - 여행 시작시간 설정
    - 시간: 0~23시 선택 (기본값: 9시)
    - 분: 00/10/20/30/40/50분 선택 (기본값: 00분)
  - 특별 요청사항: 최대 500자 입력 (선택)
  - 생성 버튼 클릭 시 AI 서비스로 요청 전송
  
  [진행 상태 표시]
  - AI 서비스로부터 진행률 수신 및 표시
  - 진행 단계 및 메시지 실시간 업데이트
  - 예상 남은 시간 표시
  - 취소 버튼: AI 서비스에 취소 요청 전송
  
  [결과 처리]
  - 생성 완료 시 결과 수신 및 저장
  - 완료 화면 표시
  - 생성된 일정 보기: 저장된 일정 조회 화면 이동
  - 다시 생성하기: 새로운 생성 요청
  
- M/13

---

UFR-TRIP-060: [생성된 일정조회] 여행자로서, 나는 생성된 일정을 확인하고 수정하기 위해, 일자별로 구분된 상세 일정을 조회하고 장소를 관리하고 싶습니다.
- 시나리오 1: 생성된 일정 조회 및 관리
  AI가 생성한 일정이 있는 상황에서 | 생성된일정조회 화면에 접근하면 | 일자별 탭으로 구분된 일정이 표시되고 장소별 관리가 가능하다.
  - 상단 액션 버튼
    - "🔄 일정 재생성" 버튼: 전체 일정 재생성 화면으로 이동
    - "📥 내보내기" 버튼: 일정 내보내기 옵션 표시 (상세 기능은 UFR-TRIP-100 참조)
  - 일자별 탭 구분
    - 차수 번호 (1, 2, 3...)
    - 날짜 표시 (예: 9월 1일 (월))
    - 도시명 표시
    - 날씨 정보: 차수 번호 옆 또는 날짜 아래에 날씨 아이콘 및 온도 표시
    - "🔄 다시 생성" 버튼
      - 기본 상태: 버튼 숨김
      - 날짜 탭 선택(활성화) 시: 해당 탭에만 버튼 표시
      - 다른 탭 선택 시: 이전 탭 버튼 숨김, 새 탭 버튼 표시
  - 시간대별 장소 카드 표시
  - 장소명, 카테고리, 소요시간 표시
  - 건강상태 고려 정보
    - 휴식 포인트 태그 (🪑 카페/벤치 위치)
    - 선택적 활동 표시 (기본/활동적 코스)
    - 접근성 아이콘 (♿ 엘리베이터, 경사로)
    - 도보 거리 표시 (제한 멤버 참고용)
  - 날씨 영향 알림
    - "우천 예상: 실내 대안 확인" 버튼
    - "폭염 주의: 충분한 휴식 권장" 안내
  - 장소 간 이동 정보 표시
    - 장소 카드 사이에 이동 정보 삽입
    - 이동 수단 아이콘 표시 (🚗 자동차, 🚶 도보, 🚌 대중교통)
    - 이동 시간 및 구체적 경로 표시
      - 예: "🚗 차량으로 10분 이동 (마리엔플라츠 → 뮌헨 레지덴츠)"
      - 예: "🚶 도보 5분 이동 (호텔 → 마리엔플라츠)"
    - 근거리(500m 이내)는 도보 권장 표시
    - 이동 수단별 상세 정보
      - 도보: 예상 소요 시간, 거리, 칼로리 소모량
      - 대중교통: 환승 정보, 정류장/역 정보
      - 자동차: 예상 주행 시간, 주차장 정보
  - 장소 액션 버튼
    - 기본 상태: 상세정보, 길찾기, 삭제 버튼 숨김
    - 장소 카드 선택(클릭) 시: 해당 카드의 버튼들 표시
    - 다른 카드 선택 시: 이전 카드 버튼 숨김, 새 카드 버튼 표시
    - 버튼 종류:
      - 상세정보 보기: 장소 상세 화면으로 이동
      - 길찾기: 국내(카카오맵), 해외(구글맵) 연동
      - 삭제: 해당 장소 제거
  - 장소 관리 기능
    - 순서 변경: 드래그 앤 드롭
  - 일정 변경사항 자동 저장: 장소 순서 변경, 삭제 등이 즉시 반영됨
  
- M/34

- 기술 태스크
  - 실시간 일정 관리
    - 프론트엔드에서 드래그 앤 드롭 순서 변경
    - 장소 삭제 시 즉시 UI 반영
    - 변경사항 즉시 로컬 상태 업데이트
  - 스마트 배치 저장
    - 사용자 수정 완료 후 debounce 적용
    - 변경된 항목만 서버 전송
    - 오류 시 로컬 상태 롤백
  - 날씨/장소 상태 감지
    - 실시간 날씨 정보 확인
    - 장소 운영 상태 모니터링
    - 변경 감지 시 사용자 알림

---

UFR-TRIP-062: [일정변경필요판단] 여행자로서 | 나는 여행 일정에 영향을 주는 변화가 있을 때 | 시스템이 자동으로 알려주고 일정 재생성을 권유받고 싶다.
- 시나리오 1: 날씨 변화로 인한 일정 변경 알림
  생성된 일정을 조회한 상황에서 | 시스템이 날씨 변화(비/눈 예보, 극한 기온)를 감지하면 | 영향받는 날짜와 이유를 알림으로 표시하고 재생성 버튼을 제공한다.
  
  [알림 표시 조건]
  - 날씨 변화 감지
    - 맑음 → 비/눈 예보 변경
    - 극한 기온 변화 (±10도 이상)
    - 태풍, 폭설 등 특보 발령
    - 미세먼지 나쁨 이상
  - 알림 표시 시점
    - 일정 조회 시 자동 확인 (1일 1회)
    - 사용자 새로고침 시
    - 여행 시작 D-1 푸시 알림
    
  [알림 내용]
  - 변경 이유: "2일차에 비 예보가 추가되었습니다"
  - 영향받는 활동: "야외 활동 3곳이 영향받습니다"
  - 권장 사항: "실내 활동 중심으로 일정을 재생성하시겠습니까?"
  - 액션 버튼: [일정 재생성] [그대로 진행]
  
- 시나리오 2: 장소 문제로 인한 일정 변경 알림
  특정 장소가 포함된 일정에서 | 시스템이 해당 장소의 영업 중단이나 휴무를 감지하면 | 대체 장소를 포함한 재생성을 권유한다.
  
  [장소 문제 감지]
  - 임시 휴업/영구 폐업
  - 정기 휴무일 충돌
  - 예약 마감/입장 불가
  - 특별 행사로 인한 접근 제한
  
  [알림 내용]
  - 문제 상황: "A 박물관이 월요일 휴무입니다"
  - 대안 제시: "인근의 B 박물관으로 대체 가능합니다"
  - 액션 버튼: [해당일 재생성] [장소만 변경] [그대로 진행]
  
- M/8

---

UFR-TRIP-070: [일정재생성] 여행자로서 | 나는 AI가 생성한 일정이 마음에 들지 않을 때 | 전체 또는 특정 날짜의 일정을 다시 생성하고 싶다.
- 시나리오 1: 전체 일정 재생성
  생성된 일정 조회 화면에서 전체 일정이 마음에 들지 않는 상황에서 | 상단의 "🔄 일정 재생성" 버튼을 클릭하면 | AI일정생성 화면으로 이동하여 처음부터 다시 생성할 수 있다.
  
  [전체 재생성 프로세스]
  - AI일정생성 화면으로 이동
  - 기존 설정 유지 (멤버, 이동수단, 여행지 정보)
  - 여행 시작시간 재설정 가능
  - 특별 요청사항 새로 입력 가능
  
- 시나리오 2: 일자별 재생성
  특정 날짜의 일정이 마음에 들지 않는 상황에서 | 해당 날짜 탭의 "🔄 다시 생성" 버튼을 클릭하면 | 해당일 일정만 새로 생성된다.
  
  [일자별 재생성 특징]
  - 선택한 날짜의 일정만 변경
  - 전후 날짜와의 이동 경로 자동 조정
  - 숙소 위치 기반 경로 최적화
  - 실시간 업데이트로 변경사항 표시
  
  [재생성 제한사항]
  - 재생성 횟수: 날짜별 최대 5회
  - 재생성 간격: 이전 생성 완료 후 가능
  - 히스토리: 최근 3개 버전 저장
  
- S/8

---

UFR-TRIP-080: [지도경로표시] 여행자로서 | 나는 일정의 이동 경로를 쉽게 파악하기 위해 | 지도상에 전체 여행 경로와 일자별 이동 경로를 시각적으로 확인하고 싶다.
- 시나리오: 지도에서 경로 확인
  생성된 일정이 있는 상황에서 | 지도 보기 버튼을 클릭하면 | 전체 여행 경로가 지도에 표시되고 일자별로 필터링할 수 있다.
  
  [지도 표시 요구사항]
  - 전체 경로 보기
    - 모든 방문 장소 마커 표시 (숫자 라벨)
    - 일자별 다른 색상으로 경로 구분
    - 이동 수단별 선 스타일 차별화 (실선: 차량, 점선: 도보)
  - 일자별 필터링
    - 특정 날짜 선택 시 해당일 경로만 강조
    - 다른 날짜는 연한 색으로 표시
  - 장소 정보 표시
    - 마커 클릭 시 장소명, 방문 시간 팝업
    - 이동 시간 및 거리 정보
  
  [지도 유형]
  - 정적 지도: 빠른 미리보기, PDF 출력용
  - 동적 지도: 확대/축소, 실시간 교통정보
  - 국내: 카카오맵 우선 사용
  - 해외: 구글맵 사용
  
  [상호작용 기능]
  - 지도 확대/축소
  - 현재 위치 표시
  - 특정 구간 상세 경로 보기
  - 대중교통 노선 정보 표시
  
- C/21

---

UFR-TRIP-090: [진행바 네비게이션] 여행자로서 | 나는 여행 계획 단계를 쉽게 이동하기 위해 | 상단 진행바를 통해 이전/다음 단계로 네비게이션하고 싶다.
- 시나리오 1: 진행바를 통한 단계 이동
  여행 계획 화면(기본설정~일정조회)에서 | 상단 진행바의 특정 단계를 클릭하면 | 이동 가능한 경우 해당 화면으로 이동한다.
  
  [진행바 구성]
  - 4단계 표시: 1.기본설정 → 2.여행지설정 → 3.AI일정생성 → 4.일정조회
  - 현재 단계: 파란색 원과 텍스트로 강조
  - 완료 단계: 체크 표시 또는 파란색 표시
  - 미완료 단계: 회색 표시
  
  [이동 제약조건]
  - 이전 단계로 이동: 항상 가능
  - 다음 단계로 이동: 해당 단계까지의 필수 정보가 모두 입력되어 있어야 가능
    - 여행지설정 이동 조건: 여행명, 멤버 1명 이상, 이동수단 선택 완료
    - AI일정생성 이동 조건: 위 조건 + 여행 시작일, 여행지 1개 이상 설정 완료
    - 일정조회 이동 조건: 위 조건 + AI 일정 생성 완료
  - 건너뛰기: 대상 단계까지의 모든 필수 정보가 완료되어 있으면 가능
    - 신규 여행: 순차적 진행 필요
    - 기존 여행 수정/재방문: 필수 정보가 있으면 어느 단계든 직접 이동 가능
  
  [상호작용]
  - 클릭 가능한 단계: 커서 포인터 표시
  - 클릭 불가능한 단계: 커서 기본 표시
  - 이동 불가 시: "이전 단계를 먼저 완료해주세요" 툴팁 표시
  
- 시나리오 2: 기존 여행 수정 시 자유로운 이동
  저장된 여행을 불러와 수정하는 상황에서 | 진행바의 '일정조회' 단계를 클릭하면 | 모든 필수 정보가 이미 저장되어 있으므로 바로 이동한다.
  
  [검증 및 안내]
  - 실시간 검증: 필수 항목 입력 상태 체크
  - 미입력 항목 안내: 구체적 메시지 표시
    - 기본설정: "여행명을 입력해주세요", "멤버 정보를 추가해주세요", "이동수단을 선택해주세요"
    - 여행지설정: "여행 시작일을 설정해주세요", "최소 1개 이상의 여행지를 추가해주세요"
    - AI일정생성: "먼저 일정을 생성해주세요"
  - 자동 포커스: 첫 번째 미입력 필드로 이동
  
- M/8

---

UFR-TRIP-100: [일정내보내기] 여행자로서 | 나는 생성된 일정을 오프라인에서도 확인하거나 다른 사람과 공유하기 위해 | 다양한 형식으로 내보내고 싶다.
- 시나리오 1: PDF로 내보내기
  생성된 일정 조회 화면에서 | 내보내기 버튼을 클릭하고 PDF를 선택하면 | 인쇄하기 적합한 형식의 PDF 파일이 다운로드된다.
  
  [PDF 내보내기 특징]
  - A4 사이즈 최적화 레이아웃
  - 날짜별 페이지 구분
  - 장소 정보 및 이동 경로 포함
  - 지도 이미지 포함 (정적 지도)
  - 인쇄 시 가독성 고려한 디자인
  
- 시나리오 2: 이미지로 내보내기
  생성된 일정 조회 화면에서 | 내보내기 버튼을 클릭하고 이미지를 선택하면 | SNS 공유에 적합한 이미지 파일이 다운로드된다.
  
  [이미지 내보내기 특징]
  - 모바일 화면 비율 최적화
  - 일자별 개별 이미지 생성
  - 주요 정보만 포함한 간결한 디자인
  - SNS 공유 시 미리보기 최적화
  
  [파일명 규칙]
  - PDF: 여행명_YYYYMMDD.pdf
  - 이미지: 여행명_Day1_YYYYMMDD.png
  
- S/8

---

UFR-TRIP-110: [여행목록전체보기] 여행자로서 | 나는 모든 여행을 한 눈에 관리하기 위해 | 전체 여행 목록을 조회하고 필터링/검색할 수 있기를 원한다.
- 시나리오 1: 전체 여행 목록 조회
  대시보드 추억중 섹션에서 | "전체목록 →" 링크를 클릭하면 | 모든 여행이 포함된 여행 목록 화면으로 이동한다.
  
  [목록 표시 요구사항]
  - 카드 그리드 형식으로 여행 표시
  - 여행별 정보
    - 대표 이미지
    - 여행명
    - 여행 기간
    - 여행 상태 (계획중/여행중/추억중)
    - 진행률 또는 완료 표시
  - 페이지네이션 또는 무한 스크롤
  
- 시나리오 2: 상태별 필터링
  여행 목록 화면에서 | 상단 필터에서 특정 상태를 선택하면 | 해당 상태의 여행만 필터링되어 표시된다.
  
  [필터 옵션]
  - 전체: 모든 여행 표시 (기본값)
  - 계획중: 준비 중인 여행만 표시
  - 여행중: 현재 진행 중인 여행만 표시
  - 추억중: 완료된 여행만 표시
  
- 시나리오 3: 여행 검색
  여행 목록 화면에서 | 검색창에 키워드를 입력하면 | 여행명 또는 여행지명과 일치하는 여행이 표시된다.
  
  [검색 기능]
  - 실시간 검색 (입력 즉시 결과 표시)
  - 검색 대상: 여행명, 여행지명
  - 검색 결과 없을 시 안내 메시지
  
  [정렬 옵션]
  - 최신순 (기본값)
  - 오래된순
  - 여행 시작일순
  - 이름순
  
  [여행 관리]
  - 카드 클릭: 여행 상세 일정 조회
  - 카드 선택 모드: 다중 선택 후 일괄 삭제
  - 개별 삭제: 카드별 삭제 버튼 (카드 선택 시 표시)
  
- S/13

---

3. AI 서비스
1) AI 일정 생성
UFR-AI-010: [AI일정생성] 여행자로서 | 나는 맞춤형 여행 일정을 받기 위해 | AI가 내 여행 정보와 이동수단 선호도를 기반으로 최적화된 일정을 생성하기를 원한다.
- 시나리오: AI 일정 생성 결과 확인
  여행 기본정보와 여행지를 설정하고 AI 일정 생성을 요청한 상황에서 | 5초 이내에 생성이 완료되면 | 선호 이동수단을 기반으로 한 시간대별 상세 일정이 생성되어 확인할 수 있다.
  
  [생성 결과 검증]
  - 모든 여행지에 대한 일정 존재
  - 각 일자별 시작/종료 시간 일치
  - 이동 시간이 현실적 (도보 20분, 차량 1시간 이내)
  - 선호 이동수단 기반 경로 제공
    - 대중교통 선호 시: 대중교통 중심 일정, 도보 가능 거리는 도보 안내
    - 자동차 선호 시: 자동차 중심 일정, 주차 후 도보 이동 안내
  - 근거리 이동 시 도보 우선 안내
    - 500m 이내: 도보 이동 권장 (예상 시간, 거리, 칼로리)
    - 도보 적합 판단: 날씨, 건강상태, 짐 여부 고려
  - 날씨 정보 기반 일정 조정
    - 우천 시: 실내 활동 중심, 우산/우비 준비 안내
    - 폭염/한파: 실외 활동 최소화, 휴식 시간 증가
    - 미세먼지 나쁨: 실외 활동 제한, 마스크 준비 안내
    - 날씨별 대체 장소 제안 (예: 야외 → 실내 대안)
  - 자동차 이용 시 주차장 정보
    - 각 목적지 인근 주차장 1-2곳 추천
    - 주차 요금 정보 (가능한 경우)
    - 주차 후 도보 이동 경로 안내
  - 멤버 건강상태 반영 확인
    - 그룹 최소 건강상태 기준 적용 (가장 제약이 많은 멤버 기준)
    - 제한(1명 이상): 하루 2-3개 장소, 휴식 3회, 도보 500m 이내
    - 주의(최소): 하루 4-5개 장소, 휴식 2회, 격렬한 활동 제외
    - 양호/우수(전원): 하루 5-7개 장소, 일반적인 일정
  - 건강상태별 이동 최적화
    - 제한 멤버 포함 시: 택시/자동차 우선, 평탄한 경로
    - 엘리베이터/에스컬레이터 있는 장소 우선 선택
    - 휴식 가능 장소(카페, 벤치) 일정에 명시
  - 건강상태 고려 일정 표시
    - 각 장소에 휴식 포인트 명시 (카페, 벤치 위치)
    - 선택적 활동 표시: "기본 코스" vs "활동적 코스"
    - 접근성 정보: 엘리베이터, 경사로, 휠체어 가능 여부
    - 시간대별 대안: 동일 시간 휴식 옵션 제공
  - 특별 요청사항 반영 확인
  
  [성능 기준]
  - 일정 생성 완료: 5초 이내
  - 동시 요청 처리: 최소 10건
  
  [오류 처리]
  - 생성 실패 시 명확한 오류 메시지
  - 재시도 옵션 제공
  
- M/34

- 기술 태스크
  - AI 서비스 API 구현
    - POST /ai/schedules/generate (일정 생성 요청)
    - GET /ai/schedules/{id}/status (진행 상태 조회)
    - GET /ai/schedules/{id} (생성된 일정 조회)
  - AI 모델 통합
    - Claude API 연동
    - 프롬프트 엔지니어링
    - 응답 파싱 및 구조화
  - 지도 API 통합
    - 국내: Kakao Maps API
      - 장소 검색 API
      - 경로 탐색 API (도보/대중교통/자동차)
      - 주차장 정보 API
    - 해외: Google Maps API
      - Places API
      - Directions API (walking/transit/driving)
      - Nearby Search (parking)
    - 지역 판별 로직 구현
  - 실시간 진행률 처리
    - WebSocket 또는 SSE 구현
    - 단계별 진행률 계산 로직
  - 데이터 처리
    - 멤버 프로파일 분석 알고리즘
      - 그룹 최소 건강상태 추출 로직
      - 건강상태별 제약사항 매핑
    - 이동수단 선호도 기반 경로 최적화
    - 근거리 도보 이동 판단 로직
    - 주차장 추천 알고리즘
    - 시간 배분 알고리즘
    - 분할 일정 생성 알고리즘
    - 날씨 기반 일정 조정 알고리즘
  - 외부 API 연동
    - 날씨 API 통합 (OpenWeatherMap)
      - 여행 기간 날씨 예보 조회 (최대 16일)
      - 실시간 날씨 업데이트
      - 미세먼지/자외선 지수 확인
      - 전 세계 도시 지원
    - 지도 경로 표시
      - 정적 지도 API (Static Maps)
      - 동적 지도 SDK (Maps JavaScript API)
      - 경로 최적화 알고리즘
      - 지도 이미지 캐싱
  - 성능 최적화
    - 응답 시간 5초 이내
    - 동시 처리 10건 이상
    - 캐싱 전략

---

2) AI 추천 정보 생성
UFR-AI-020: [AI추천정보제공] 여행자로서 | 나는 장소 상세정보를 조회할 때 | AI가 제공하는 맞춤형 추천 이유와 방문 팁을 확인하고 싶다.
- 시나리오: 장소 상세정보에서 AI 추천 정보 확인
  장소 상세정보 화면(UFR-LOC-030)에 접근한 상황에서 | AI 추천 이유 섹션을 확인하면 | 나의 여행 프로파일과 상황에 맞춤화된 추천 정보가 표시된다.
  
  [AI 추천 정보 제공]
  - 추천 이유 (사용자 프로파일 기반)
    - 멤버 구성 고려: "아이들이 좋아하는 체험 활동이 있습니다"
    - 건강상태 반영: "평탄한 길로 이동이 편합니다"
    - 이동수단 고려: "대중교통으로 10분 거리입니다"
    - 선호도 반영: "문화체험을 선호하시는 분께 추천합니다"
  - 유용한 정보/팁
    - 장소 설명: 역사적 배경, 특징 설명
    - 특별 이벤트: "매시 정각 시계탑 공연"
    - 추천 방문 시간: "오전 10시 (한적한 시간대)"
    - 예상 소요 시간: "1시간 30분"
    - 베스트 포토 스팟: "시계탑 정면, 분수대 앞"
    - 실용적 팁: "편한 신발 착용, 우천 시 우산 필수"
    - 날씨별 준비사항: "여름철 선크림, 겨울철 방한복"
    - 근처 대체 장소: 날씨나 상황 변경 시 대안
    
  [정보 품질 기준]
  - 현재 조회 중인 장소에 특화된 정보
  - 사용자 프로파일에 맞춤화된 내용
  - 실제 도움이 되는 구체적 정보
  - 일반적인 관광 정보가 아닌 개인화된 추천
  
- M/13

- 기술 태스크
  - AI 추천 정보 API
    - Location 서비스 → AI 서비스 호출
    - POST /ai/places/{placeId}/recommendations
    - 요청: 장소 ID, 사용자 프로파일, 여행 컨텍스트
    - 응답: 추천 이유, 유용한 정보/팁
  - 프로파일 기반 프롬프트 생성
    - 멤버 구성, 건강상태, 이동수단, 선호도 반영
    - 여행 날짜, 날씨 정보 고려
  - 응답 구조화
    - 추천 이유 / 유용한 정보 구분
    - 다국어 지원 고려

---

4. Location
1) 주변 장소 검색
UFR-LOC-010: [주변장소검색] 여행자로서 | 나는 현재 위치나 특정 출발지 주변의 장소를 찾기 위해 | 다양한 필터를 활용하여 검색하고 싶다.
- 시나리오 1: 기본 검색
  주변장소검색 화면에 접근한 상황에서 | 출발지와 이동수단, 시간 범위를 설정하면 | 조건에 맞는 장소 목록이 표시된다.
  
  [검색 조건 설정]
  - 출발지
    - 기본값: 현재 위치 (Munich Central Station 등)
    - 직접 입력 가능
    - 📍 버튼: 현재 위치로 재설정
  - 이동수단 선택 (택 1)
    - 대중교통: 기본 선택
    - 차량: 자동차 이용
    - 도보: 걷기
  - 시간 범위 (택 1)
    - 10분내
    - 30분내
    - 60분내
  
  [검색 결과]
  - 찾은 장소 개수 표시
  - 정렬 옵션: 시간순(기본)/평점순/이름순/리뷰순
  - 무한 스크롤: 스크롤 시 자동으로 추가 결과 로드
  - 로딩 중 표시: 추가 데이터 로드 시 로딩 인디케이터
  - 결과 없을 시 안내 메시지
  
- 시나리오 2: 카테고리 필터링
  검색 결과가 표시된 상황에서 | 특정 카테고리를 선택하면 | 해당 카테고리의 장소만 필터링되어 표시된다.
  
  [카테고리 필터]
  - 전체: 모든 장소 표시 (기본)
  - 관광지: 명소, 박물관, 공원 등
  - 맛집: 레스토랑, 카페 등
  - 빨래방: 세탁소, 코인세탁방
  - 카테고리 중복 선택 불가 (라디오 버튼 방식)
  
- 시나리오 3: 키워드 검색
  검색창에 | 특정 키워드를 입력하면 | 장소명이나 카테고리와 일치하는 결과가 표시된다.
  
  [키워드 검색]
  - 검색창 플레이스홀더: "✨ 찾을 장소 종류/이름 입력"
  - 실시간 검색 결과 업데이트
  - 검색어 하이라이트 표시
  
- S/13

---

UFR-LOC-020: [장소카드표시] 여행자로서 | 나는 검색된 장소의 핵심 정보를 빠르게 파악하기 위해 | 카드 형태로 정리된 정보를 확인하고 싶다.
- 시나리오: 장소 정보 카드 확인
  장소 검색 결과가 표시된 상황에서 | 각 장소 카드를 확인하면 | 필수 정보와 액션 버튼이 표시된다.
  
  [카드 정보 구성]
  - 상단 영역
    - 장소명 (굵은 글씨)
    - 이동 시간 (우측 상단, 강조 표시)
  - 중간 영역
    - 평점: 별점 시각화 (★★★★☆)
    - 리뷰 수: 예) 4.3 (5,234개 리뷰)
  - 하단 영역
    - 주소: 전체 주소 표시
  
  [액션 버튼]
  - 상세정보: 장소 상세 화면으로 이동
  - 길찾기: 네비게이션 앱 연동
    - 국내: 카카오맵
    - 해외: 구글맵
  
  [카드 디자인]
  - 그림자 효과로 카드 구분
  - 충분한 여백으로 가독성 확보
  - 터치 영역 최소 48px
  
- S/5

---

UFR-LOC-030: [장소상세정보] 여행자로서 | 나는 선택한 장소의 상세 정보를 확인하기 위해 | 위치, 운영, AI 추천 정보를 종합적으로 보고 싶다.
- 시나리오: 장소 상세정보 조회
  장소 카드에서 상세정보 버튼을 클릭한 상황에서 | 장소 상세 화면으로 이동하면 | 상단 이미지와 함께 모든 정보가 섹션별로 표시된다.
  
  [상단 영역]
  - 대표 이미지 (히어로 이미지)
  - 우측 상단 액션 버튼
    - 📤 공유: SNS/메시지 공유
    - 🧭 길찾기: 지도 앱 연동
  - 장소명 (대제목)
  - 평점 및 리뷰 수
    - 별점 시각화 (★★★★☆)
    - 평점 숫자 및 리뷰 개수
  
  [📍 위치 정보]
  - 주소: 전체 주소 텍스트
  - 장소 찾기: 지도 검색용 키워드 (예: Marienplatz, Munich)
  - 주차장 찾기: 인근 주차장 검색어 (예: Parkhaus Marienplatz)
  
  [⏰ 운영 정보]
  - 현재 상태: 🟢 영업중 / 🔴 휴무
  - 영업 시간: 요일별 또는 24시간 개방
  
  [🤖 AI 추천 이유]
  - 추천 이유 
  - 유용한 정보/팁 
    - 장소 설명: 역사적 배경, 특징 설명
    - 특별 이벤트: 시계탑 공연 시간 등
    - 추천 방문 시간: 최적 방문 시간대
    - 소요 시간: 예상 체류 시간
    - 베스트 포토 스팟: 사진 촬영 포인트
    - 유용한 팁: 준비물, 주의사항 등
  
  [⭐ 리뷰 및 평점]
  - 전체 평점 요약 (평균 점수, 별점, 총 리뷰 수)
  - 최신 리뷰 5개 표시
    - 작성자 이름 (authorName)
    - 상대 시간 표시 (예: 1주일 전)
    - 개별 별점 (1-5)
    - 리뷰 내용
  - 안내 문구: "구글 리뷰 기준 (최대 5개까지 표시)"
  - "구글맵에서 더 많은 리뷰 보기" 버튼 (새 탭에서 구글맵 열기)
  
- S/21

- 기술 태스크
  - 장소 정보 API 통합
    - 국내 장소
      - 카카오 로컬 API: 기본 정보, 평점, 주소, 카테고리 (리뷰 미제공)
      - 구글 Places API: 리뷰 조회 (최대 5개, Atmosphere SKU 비용 발생)
      - 리뷰 응답 형식: authorName, rating, text, time(Unix timestamp), relativeTimeDescription
    - 해외 장소
      - 구글 Places API: 전체 정보 (평점, 리뷰, 운영시간 등)
      - 리뷰는 최대 5개까지 표시 (비용 최적화)
    - 공통 사항
      - "구글맵에서 더 많은 리뷰 보기" 버튼으로 외부 연결
      - 영업시간은 별도 API(/locations/{placeId}/business-hours)로 실시간 조회
  - AI 추천 정보 연동
    - AI 서비스 API 호출
      - POST /ai/places/{placeId}/recommendations
      - 사용자 프로필 및 여행 컨텍스트 전달
    - 추천 정보 캐싱 (24시간)
  - 이미지 처리
    - 장소 대표 이미지 캐싱
    - 이미지 로딩 최적화
  - 공유 기능
    - SNS 공유 API 연동
    - 딥링크 생성

---

## 기술 검토 결과 
**[마이크로서비스별 검토]**  
1) User 서비스
모든 유저스토리 **✅ 실현 가능**
- 표준적인 인증/인가 패턴
- JWT 토큰, Redis 캐싱 등 검증된 기술 활용

2) Trip 서비스
대부분 **✅ 실현 가능**, 일부 주의 필요

**주요 검토 사항:**
- UFR-TRIP-050: **⚠️ AI 응답 시간 5초 제약**
  - SSE/WebSocket으로 진행 상태 전달
  - 비동기 처리 고려 필요
- UFR-TRIP-060: **⚠️ 복잡한 UI 구현**
  - 드래그앤드롭, 날씨 정보, 경로 표시 등
  - 컴포넌트 분리와 상태관리 중요
- UFR-TRIP-080: **⚠️ 지도 성능 최적화**
  - 모바일 환경 고려한 최적화 필요
  - 정적/동적 지도 선택적 사용

3) AI 서비스
**⚠️ 가장 높은 기술적 복잡도**

- UFR-AI-010: **주요 리스크 포인트**
  - Claude API 응답 시간 관리
  - 다중 외부 API 병렬 처리
  - 프롬프트 엔지니어링 최적화
  - **해결방안**: 캐싱, 병렬 처리, 스트리밍 응답

4) Location 서비스
대부분 **✅ 실현 가능**

- UFR-LOC-030: **⚠️ API 통합 복잡도**
  - 국내: 카카오 기본정보 + 구글 리뷰 (카카오맵 리뷰 API 미제공)
  - 해외: 구글 API만 사용
  - AI 추천 정보 연동
  - 실시간 정보(영업시간, 날씨)는 별도 API로 분리

**[주요 기술 스택 권장사항]**   

**백엔드:**
- Node.js/Spring Boot (마이크로서비스)
- Redis (캐싱, 세션)
- PostgreSQL/MongoDB
- RabbitMQ/Kafka (비동기 처리)

**프론트엔드:**
- React/Next.js
- TypeScript
- Zustand/Redux (상태관리)
- React Query (API 상태관리)
- react-beautiful-dnd (드래그앤드롭)

**인프라:**
- Docker/Kubernetes
- API Gateway
- Circuit Breaker
- 로드 밸런서

**[주요 기술적 리스크 및 해결방안]**   

**1. AI 응답 시간 (5초 제약)**
- 리스크: Claude API 응답이 5초를 초과할 수 있음
- 해결방안:
  - 프롬프트 최적화로 응답 시간 단축
  - 비동기 처리 + 폴링 방식 고려
  - 부분 응답 스트리밍 검토

**2. 다중 외부 API 의존성**
- 리스크: API 장애 시 서비스 중단
- 해결방안:
  - 각 API별 폴백 전략 수립
  - 캐싱 적극 활용
  - 써킷 브레이커 패턴 적용

**3. 복잡한 UI 상태 관리**
- 리스크: 일정 조회 화면의 복잡도
- 해결방안:
  - 상태관리 라이브러리 (Redux/Zustand) 활용
  - 컴포넌트 세분화
  - 메모이제이션 적극 활용

**4. 모바일 성능**
- 리스크: 지도, 드래그앤드롭 등 무거운 기능
- 해결방안:
  - 지연 로딩
  - 가상 스크롤
  - 웹 워커 활용