mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 19:36:23 +00:00
1047 lines
44 KiB
Markdown
1047 lines
44 KiB
Markdown
# 여행 상세 일정 생성 서비스 - 유저스토리
|
|
|
|
- [여행 상세 일정 생성 서비스 - 유저스토리](#여행-상세-일정-생성-서비스---유저스토리)
|
|
- [마이크로서비스 구성](#마이크로서비스-구성)
|
|
- [유저스토리](#유저스토리)
|
|
- [기술 검토 결과](#기술-검토-결과)
|
|
|
|
---
|
|
|
|
## 마이크로서비스 구성
|
|
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. 모바일 성능**
|
|
- 리스크: 지도, 드래그앤드롭 등 무거운 기능
|
|
- 해결방안:
|
|
- 지연 로딩
|
|
- 가상 스크롤
|
|
- 웹 워커 활용
|