feat(flutter): 장소 검색·상세 화면과 홈 검색창·카테고리·반려동물 장소 칸 #3

Merged
ttipo merged 4 commits from feat/flutter-places into main 2026-11-04 20:25:40 +09:00
Owner

무엇을 · 왜

장소 조회 API(#1) 위에 디자인 캔버스 4(검색)·6·7(장소 상세) 화면을 붙이고, 홈에 검색창·카테고리·반려동물 장소 칸을 더했다.
지금 있는 데이터로 되는 것만 만들었다.

  • 검색(4)
    • 검색어(입력을 멈추고 0.35초 뒤)와 분류 탭 6개, '반려견 동반' 조건으로 찾는다.
    • 기준 위치에서 가까운 순이고, 커서 페이지로 끝까지 받는다.
    • 결과가 없으면 조건을 줄이도록 안내한다('반려견 동반 빼고 보기').
  • 장소 상세(6·7)
    • 사진 출처(공공누리 유형)와 기준 위치에서의 도보 시간·거리를 보인다.
    • 한눈에 보기에는 반려견·주차·무료·상시 개방 중 원문으로 확실한 것만 올린다.
    • 반려동물 조건은 항목으로 나누고, 불가 항목은 빨간 표시로 보인다.
    • 이용 안내에서 주소 복사·전화·홈페이지를 쓸 수 있다.
    • 소개(긴 글은 더 보기), 근처 5km 축제·행사, 함께 가기 좋은 곳, 출처 표기를 보인다.
    • 영업시간을 모르는 곳은 "영업시간 미확인 · 방문 전 확인"으로 보인다.
    • 영어 화면에만 1330 관광통역안내를 보인다(2026-10-29 합의).
  • 홈
    • 검색창을 누르면 검색 화면이 열리고 바로 입력할 수 있다.
    • 카테고리 7개를 누르면 해당 조건의 검색이 열린다. 축제만 행사 목록(30일)으로 간다.
    • '가까운 반려동물 동반 장소' 칸에 가까운 3곳을 보인다.
  • 정한 것
    • 검색 반경은 20km(백엔드 최대)로 대구 도심에서 대구 전역이 들어온다. 도보 시간은 시속 4km로 어림하고, 2km를 넘으면 거리만 보인다.
    • '함께 가기 좋은 곳'에는 관광공사·운영자 확인 장소만 넣는다. 확인 안 된 상가정보 매장을 추천처럼 보이지 않으려는 것이다(2026-11-02 합의).
  • 홈 축제·행사 반경을 120km → 50km
    • 120km 는 관광공사 행사뿐이던 때 정한 값이다.
    • KOPIS·문화포털이 들어온 뒤에는 대구 안에서도 충분히 찬다(도심 기준 이번 주말 50km 32건 · 120km 42건).
    • 120km 면 영덕·영주처럼 차로 2시간 거리까지 나왔다.
  • 실기기에서 찾은 문제 수정
    • Android 15부터 앱이 화면 끝까지 그려져 장소 상세·행사 상세·행사 목록의 마지막 줄이 내비게이션 바에 가렸다. 아래 시스템 여백을 더했다.
    • 장소 상세는 사진 위에서 상태 표시줄 글자를 흰색으로 바꾸고, 사진을 지나면 흰 제목 줄(뒤로 · 이름)을 깐다.
  • 공용으로 분리: 공공누리 사진 위젯(PublicImage)과 출처 모델. 행사·장소가 같은 규칙(Type3 은 자르지 않음)을 쓰게 하려는 것이다.

아직 없는 것

  • 검색의 '축제' 탭. 행사 API 에 검색어 조건이 없다.
  • '실내'·'무료'·'주차'·'이번 주말' 조건과 날씨 안내. 실내 조건이 맞는 운영자 확인 장소가 아직 0곳이고, 날씨 API 도 아직 없다.
  • 홈 '데이트' 카테고리. 큐레이션이 쌓인 뒤에 붙인다.
  • 길찾기·코스에 추가·저장·공유·지도 미리보기·정보 정정 요청·AI 코스 만들기. 지도·코스·로그인과 함께 만든다.
  • 문화포털 전시 사진. 이용 권리를 확인하기 전이라 저장하지 않는다(자리 표시로 보인다).

확인 방법

cd flutter
flutter pub get
flutter analyze && flutter test
flutter run
  • flutter analyze 문제 0건
  • flutter test 52개 통과
    • 순수 함수: 직선 거리·도보 시간, 출처 기준 시점 표기, 원문 해석(주차·무료·조건 나누기·금지 조건)
    • 모델 파싱: 빈 문자열·모르는 코드값
    • 앱 흐름: 홈 반려동물 칸 → 검색 → 상세, 검색어·분류 탭이 보내는 조건, 결과 없음 → 반려견 동반 빼기, 영업시간 미확인·상가정보 출처, 영어 1330
  • 실제 개발 백엔드 응답(목록 4종, 상세 57건, 근처 장소·행사)을 앱 모델이 문제없이 읽는 것을 확인했다.
  • 실기기 확인(갤럭시 S23, Android 16, 디버그 빌드)
    • 홈 → 검색(칩·탭·결과 없음) → 장소 상세(한/영) → 행사 상세를 실제 데이터와 사진으로 확인했다.
    • 공공누리 제3유형 사진은 자르지 않고 보이는 것을 확인했다.
    • 영어 1330 줄의 일본어·중국어 글자가 시스템 글꼴로 제대로 나오는 것을 확인했다.
    • 휴대폰에서 개발 백엔드에 붙이려면 flutter/.env 의 API_URL=http://localhost:<BACKEND_PORT>/api 로 두고 adb reverse tcp:<BACKEND_PORT> tcp:<BACKEND_PORT> 를 실행한다. USB 연결이 끊기면 다시 실행해야 한다.

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라
  • 규칙 문서(.claude/) — flutter 스킬에 공공데이터 사진 위젯 골격 추가

공유 계약 변경 없음. 앱은 기존 장소·행사 조회 API 와 응답 포맷({success,data} · {items,pageInfo})을 그대로 쓴다.
설계 문서 docs/design/place-db.md 에 홈 축제 반경 변경(120km → 50km)과 이유를 적었다.

체크리스트

  • 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과
  • 주석 한국어, 매직 넘버·하드코딩 문자열 없음 (화면 문구는 arb 에만)
  • 사용자 노출 실패는 모두 에러 코드와 함께 처리 (errorMessageOf 가 에러 사전에서 문구를 가져온다)
  • 에러 코드를 바꿨다면 npm run sync:error-codes 실행 후 생성 파일까지 커밋 — 해당 없음
  • 민감정보 미커밋 (flutter/.env 는 git 무시)
  • 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음

🤖 Generated with Claude Code

## 무엇을 · 왜 장소 조회 API(#1) 위에 디자인 캔버스 4(검색)·6·7(장소 상세) 화면을 붙이고, 홈에 검색창·카테고리·반려동물 장소 칸을 더했다. 지금 있는 데이터로 되는 것만 만들었다. - **검색(4)** - 검색어(입력을 멈추고 0.35초 뒤)와 분류 탭 6개, '반려견 동반' 조건으로 찾는다. - 기준 위치에서 가까운 순이고, 커서 페이지로 끝까지 받는다. - 결과가 없으면 조건을 줄이도록 안내한다('반려견 동반 빼고 보기'). - **장소 상세(6·7)** - 사진 출처(공공누리 유형)와 기준 위치에서의 도보 시간·거리를 보인다. - 한눈에 보기에는 반려견·주차·무료·상시 개방 중 원문으로 확실한 것만 올린다. - 반려동물 조건은 항목으로 나누고, 불가 항목은 빨간 표시로 보인다. - 이용 안내에서 주소 복사·전화·홈페이지를 쓸 수 있다. - 소개(긴 글은 더 보기), 근처 5km 축제·행사, 함께 가기 좋은 곳, 출처 표기를 보인다. - 영업시간을 모르는 곳은 "영업시간 미확인 · 방문 전 확인"으로 보인다. - 영어 화면에만 1330 관광통역안내를 보인다(2026-10-29 합의). - **홈** - 검색창을 누르면 검색 화면이 열리고 바로 입력할 수 있다. - 카테고리 7개를 누르면 해당 조건의 검색이 열린다. 축제만 행사 목록(30일)으로 간다. - '가까운 반려동물 동반 장소' 칸에 가까운 3곳을 보인다. - **정한 것** - 검색 반경은 20km(백엔드 최대)로 대구 도심에서 대구 전역이 들어온다. 도보 시간은 시속 4km로 어림하고, 2km를 넘으면 거리만 보인다. - '함께 가기 좋은 곳'에는 관광공사·운영자 확인 장소만 넣는다. 확인 안 된 상가정보 매장을 추천처럼 보이지 않으려는 것이다(2026-11-02 합의). - **홈 축제·행사 반경을 120km → 50km** - 120km 는 관광공사 행사뿐이던 때 정한 값이다. - KOPIS·문화포털이 들어온 뒤에는 대구 안에서도 충분히 찬다(도심 기준 이번 주말 50km 32건 · 120km 42건). - 120km 면 영덕·영주처럼 차로 2시간 거리까지 나왔다. - **실기기에서 찾은 문제 수정** - Android 15부터 앱이 화면 끝까지 그려져 장소 상세·행사 상세·행사 목록의 마지막 줄이 내비게이션 바에 가렸다. 아래 시스템 여백을 더했다. - 장소 상세는 사진 위에서 상태 표시줄 글자를 흰색으로 바꾸고, 사진을 지나면 흰 제목 줄(뒤로 · 이름)을 깐다. - **공용으로 분리**: 공공누리 사진 위젯(`PublicImage`)과 출처 모델. 행사·장소가 같은 규칙(Type3 은 자르지 않음)을 쓰게 하려는 것이다. 아직 없는 것 - 검색의 '축제' 탭. 행사 API 에 검색어 조건이 없다. - '실내'·'무료'·'주차'·'이번 주말' 조건과 날씨 안내. 실내 조건이 맞는 운영자 확인 장소가 아직 0곳이고, 날씨 API 도 아직 없다. - 홈 '데이트' 카테고리. 큐레이션이 쌓인 뒤에 붙인다. - 길찾기·코스에 추가·저장·공유·지도 미리보기·정보 정정 요청·AI 코스 만들기. 지도·코스·로그인과 함께 만든다. - 문화포털 전시 사진. 이용 권리를 확인하기 전이라 저장하지 않는다(자리 표시로 보인다). ## 확인 방법 ```bash cd flutter flutter pub get flutter analyze && flutter test flutter run ``` - `flutter analyze` 문제 0건 - `flutter test` 52개 통과 - 순수 함수: 직선 거리·도보 시간, 출처 기준 시점 표기, 원문 해석(주차·무료·조건 나누기·금지 조건) - 모델 파싱: 빈 문자열·모르는 코드값 - 앱 흐름: 홈 반려동물 칸 → 검색 → 상세, 검색어·분류 탭이 보내는 조건, 결과 없음 → 반려견 동반 빼기, 영업시간 미확인·상가정보 출처, 영어 1330 - 실제 개발 백엔드 응답(목록 4종, 상세 57건, 근처 장소·행사)을 앱 모델이 문제없이 읽는 것을 확인했다. - 실기기 확인(갤럭시 S23, Android 16, 디버그 빌드) - 홈 → 검색(칩·탭·결과 없음) → 장소 상세(한/영) → 행사 상세를 실제 데이터와 사진으로 확인했다. - 공공누리 제3유형 사진은 자르지 않고 보이는 것을 확인했다. - 영어 1330 줄의 일본어·중국어 글자가 시스템 글꼴로 제대로 나오는 것을 확인했다. - 휴대폰에서 개발 백엔드에 붙이려면 `flutter/.env` 의 `API_URL=http://localhost:<BACKEND_PORT>/api` 로 두고 `adb reverse tcp:<BACKEND_PORT> tcp:<BACKEND_PORT>` 를 실행한다. USB 연결이 끊기면 다시 실행해야 한다. ## 영향 범위 - [ ] backend - [ ] frontend - [x] flutter - [ ] docker / 인프라 - [x] 규칙 문서(.claude/) — flutter 스킬에 공공데이터 사진 위젯 골격 추가 > 공유 계약 변경 없음. 앱은 기존 장소·행사 조회 API 와 응답 포맷(`{success,data}` · `{items,pageInfo}`)을 그대로 쓴다. > 설계 문서 `docs/design/place-db.md` 에 홈 축제 반경 변경(120km → 50km)과 이유를 적었다. ## 체크리스트 - [x] 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 - [x] 주석 한국어, 매직 넘버·하드코딩 문자열 없음 (화면 문구는 arb 에만) - [x] 사용자 노출 실패는 모두 에러 코드와 함께 처리 (`errorMessageOf` 가 에러 사전에서 문구를 가져온다) - [x] 에러 코드를 바꿨다면 `npm run sync:error-codes` 실행 후 생성 파일까지 커밋 — 해당 없음 - [x] 민감정보 미커밋 (`flutter/.env` 는 git 무시) - [x] 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ttipo added 2 commits 2026-11-04 16:47:29 +09:00
장소 화면도 공공누리 사진과 출처 표기를 써야 해서, 행사 쪽에 있던 것을
shared 로 옮겼다. Type3 사진을 자르지 않는 규칙이 한 위젯(PublicImage)에만 있게 한다.
event_models 는 출처 모델을 다시 내보내 기존 import 는 그대로 동작한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(flutter): 장소 검색·상세 화면과 홈 검색창·카테고리·반려동물 장소 칸
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 21m21s
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m16s
CI / Frontend (lint · type-check · test) (pull_request) Has been cancelled
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Has been cancelled
4bd142a9b7
디자인 캔버스 4(검색)·6·7(장소 상세) 중 지금 장소 API 로 되는 부분을 붙였다.

- 검색은 반경 20km(백엔드 최대) 거리순. 대구 도심에서 대구 전역이 들어온다.
- 영업시간을 모르는 곳은 "영업시간 미확인 · 방문 전 확인"으로 보인다.
- 한눈에 보기는 공공데이터 원문으로 확실한 것만 올린다(주차 '인근 공영주차장' 같은 애매한 값은 빼기).
- 함께 가기 좋은 곳에는 확인 안 된 상가정보 매장을 넣지 않는다(2026-11-02 합의).
- 1330 관광통역안내는 영어 화면에만(2026-10-29 합의).

검색의 '축제' 탭과 실내·무료·주차·이번 주말 조건은 데이터가 없어 넣지 않았다
(행사 API 검색어 조건 · 운영자 확인 장소 · 날씨).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo added 2 commits 2026-11-04 17:29:35 +09:00
실기기(Android 16)에서 확인했다. Android 15 부터 앱이 화면 끝까지 그려지는데,
목록에 여백을 직접 준 화면은 시스템 여백이 빠져 마지막 출처 줄이 내비게이션 바에 가렸다
(장소 상세 · 행사 상세 · 행사 목록).

장소 상세는 사진 위에서 상태 표시줄 글자가 검은색이라 잘 안 보였고, 내리면 본문 제목이
상태 표시줄과 겹쳤다. 사진 위에서는 흰 글자와 위쪽 그늘을 두고, 사진을 지나면 흰 제목 줄
(뒤로 · 장소 이름)을 깐다. 상단 바가 없는 화면의 기본값(검은 글자)은 앱 뿌리에서 정한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(flutter): 홈 축제·행사 반경을 120km 에서 50km 로 줄임
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 11m11s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 10m27s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 10m44s
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 20m26s
CI / Backend (lint · test · e2e · build) (push) Successful in 11m56s
CI (Flutter) / Flutter (analyze · test) (push) Successful in 20m16s
CI / Frontend (lint · type-check · test) (push) Successful in 10m49s
CI / 에러 코드 SSOT 동기화 검사 (push) Successful in 10m29s
377181eade
120km 는 관광공사 행사뿐이던 2026-11-03 에 대구 행사가 너무 적어 경북까지 넓힌 값이다.
KOPIS·문화포털이 들어온 뒤로는 대구 안에서도 충분히 차고(도심 기준 이번 주말 50km 32건 ·
120km 42건), 120km 면 영덕·영주처럼 차로 2시간 거리까지 나왔다.
50km 는 군위를 포함한 대구 전역과 경산·칠곡까지다(2026-11-04 결정).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo changed title from refactor(flutter): 공공데이터 사진 위젯과 출처 모델을 공용으로 분리 to feat(flutter): 장소 검색·상세 화면과 홈 검색창·카테고리·반려동물 장소 칸 2026-11-04 17:30:06 +09:00
ttipo merged commit 377181eade into main 2026-11-04 20:25:40 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ttipo/wandergo#3