feat(flutter): 앱 뼈대·첫 실행·홈 축제·행사 화면과 앱 패키지 ID·글꼴 #2

Merged
ttipo merged 3 commits from feat/flutter-browse into main 2026-11-04 15:59:48 +09:00
Owner

무엇을 · 왜

데이터 기반(장소·행사 조회 API, #1)이 생겨 Flutter 앱 화면을 붙이기 시작한다.
디자인 캔버스의 1~7번(시작·둘러보기) 화면 중, 지금 있는 API 로 바로 되는 것부터 만들었다.

  • 앱 뼈대
    • 디자인 캔버스의 색·글자 크기·선 아이콘을 옮긴 테마
    • go_router 하단 탭(홈·지도·내 코스·내 정보). 지도·내 코스·내 정보는 아직 자리만 있다.
    • 한/영 문구(arb). 4개 언어까지 늘릴 수 있게 설계했다.
  • 첫 실행
    • 현재 위치를 쓰거나 대구 동네(도심·수성못·앞산 카페거리)를 고른다.
    • 위치를 못 쓰면 대구 도심을 기준으로 시작하고 그렇다고 알린다. 좌표는 저장하지 않는다.
  • 홈 '이번 주말 축제·행사': 기준 위치 반경 120km 거리순. 비면 다가오는 30일로 바꿔 보인다(2026-11-03 합의).
  • 행사 전체 목록·상세: 목록은 커서 페이지로 끝까지 받는다. 상세는 시간·요금·예매·전화·소개와 출처를 보인다.
  • 표시 규칙
    • 한국어 문단은 단어 단위로 줄바꿈한다(keepAll). Flutter 기본은 글자 단위로 끊는다.
    • 공공누리 Type3 사진은 자르지 않는다.
    • 꼬리말에 관광공사·KOPIS·문화포털 출처를 적는다.
  • 앱 패키지 ID net.wandergo.app: 스토어 등록과 네이버 지도 Client ID 등록에 쓰이고, 출시 후에는 바꿀 수 없다.
  • Pretendard 글꼴
    • 공식 저장소 v1.3.9 의 정적 OTF 중 400·500·600·700 만 넣었다.
    • SIL OFL 원문을 함께 넣고 라이선스 화면에 등록했다.
  • CI 러너: compose 프로젝트 이름을 러너 이름으로 고정했다. 같은 PC 의 다른 저장소 러너를 덮어쓰지 않게 하려는 것이다.

아직 없는 것

  • 홈의 검색창·배너·카테고리·AI·추천 코스·반려동물 장소 칸과 로그인 버튼. 각 기능을 만들 때 붙인다.
  • 스플래시 화면
  • 영어 화면의 행사 이름·지역. 원본 데이터라 아직 한국어로 나온다.

확인 방법

cd flutter
cp .env.example .env   # API_URL = http://10.0.2.2:<BACKEND_PORT>/api (에뮬레이터)
flutter pub get        # 한/영 문구 생성 포함
flutter analyze && flutter test
flutter run
  • flutter analyze 문제 0건
  • flutter test 28개 통과
    • 순수 함수: 거리·기간 표기, 주말 계산(한국 날짜 기준), keepAll
    • 모델 파싱
    • 앱 흐름: 첫 실행 → 동네 선택 → 홈, 위치 거부 시 도심 대체, 주말이 비면 다가오는 30일, 상세, 언어 전환
  • 실제 개발 백엔드 응답(목록 10건, 관광공사·KOPIS 상세)을 앱 모델이 문제없이 읽는 것을 확인했다.
  • 폰 크기(390×844) 화면을 그림으로 찍어 디자인 캔버스와 비교했다. 실기기·에뮬레이터 실행은 아직이다.

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라 (CI 러너 compose 프로젝트 이름)
  • 규칙 문서(.claude/) — flutter 스킬에 화면 이동·테마·한/영 문구·한국어 줄바꿈 골격 추가

공유 계약 변경 없음. 앱은 기존 응답 포맷({success,data}·{items,pageInfo})과 에러 사전을 그대로 쓴다.

체크리스트

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

🤖 Generated with Claude Code

## 무엇을 · 왜 데이터 기반(장소·행사 조회 API, #1)이 생겨 Flutter 앱 화면을 붙이기 시작한다. 디자인 캔버스의 1~7번(시작·둘러보기) 화면 중, 지금 있는 API 로 바로 되는 것부터 만들었다. - **앱 뼈대** - 디자인 캔버스의 색·글자 크기·선 아이콘을 옮긴 테마 - go_router 하단 탭(홈·지도·내 코스·내 정보). 지도·내 코스·내 정보는 아직 자리만 있다. - 한/영 문구(arb). 4개 언어까지 늘릴 수 있게 설계했다. - **첫 실행** - 현재 위치를 쓰거나 대구 동네(도심·수성못·앞산 카페거리)를 고른다. - 위치를 못 쓰면 대구 도심을 기준으로 시작하고 그렇다고 알린다. 좌표는 저장하지 않는다. - **홈 '이번 주말 축제·행사'**: 기준 위치 반경 120km 거리순. 비면 다가오는 30일로 바꿔 보인다(2026-11-03 합의). - **행사 전체 목록·상세**: 목록은 커서 페이지로 끝까지 받는다. 상세는 시간·요금·예매·전화·소개와 출처를 보인다. - **표시 규칙** - 한국어 문단은 단어 단위로 줄바꿈한다(`keepAll`). Flutter 기본은 글자 단위로 끊는다. - 공공누리 Type3 사진은 자르지 않는다. - 꼬리말에 관광공사·KOPIS·문화포털 출처를 적는다. - **앱 패키지 ID `net.wandergo.app`**: 스토어 등록과 네이버 지도 Client ID 등록에 쓰이고, 출시 후에는 바꿀 수 없다. - **Pretendard 글꼴** - 공식 저장소 v1.3.9 의 정적 OTF 중 400·500·600·700 만 넣었다. - SIL OFL 원문을 함께 넣고 라이선스 화면에 등록했다. - **CI 러너**: compose 프로젝트 이름을 러너 이름으로 고정했다. 같은 PC 의 다른 저장소 러너를 덮어쓰지 않게 하려는 것이다. 아직 없는 것 - 홈의 검색창·배너·카테고리·AI·추천 코스·반려동물 장소 칸과 로그인 버튼. 각 기능을 만들 때 붙인다. - 스플래시 화면 - 영어 화면의 행사 이름·지역. 원본 데이터라 아직 한국어로 나온다. ## 확인 방법 ```bash cd flutter cp .env.example .env # API_URL = http://10.0.2.2:<BACKEND_PORT>/api (에뮬레이터) flutter pub get # 한/영 문구 생성 포함 flutter analyze && flutter test flutter run ``` - `flutter analyze` 문제 0건 - `flutter test` 28개 통과 - 순수 함수: 거리·기간 표기, 주말 계산(한국 날짜 기준), keepAll - 모델 파싱 - 앱 흐름: 첫 실행 → 동네 선택 → 홈, 위치 거부 시 도심 대체, 주말이 비면 다가오는 30일, 상세, 언어 전환 - 실제 개발 백엔드 응답(목록 10건, 관광공사·KOPIS 상세)을 앱 모델이 문제없이 읽는 것을 확인했다. - 폰 크기(390×844) 화면을 그림으로 찍어 디자인 캔버스와 비교했다. 실기기·에뮬레이터 실행은 아직이다. ## 영향 범위 - [ ] backend - [ ] frontend - [x] flutter - [x] docker / 인프라 (CI 러너 compose 프로젝트 이름) - [x] 규칙 문서(.claude/) — flutter 스킬에 화면 이동·테마·한/영 문구·한국어 줄바꿈 골격 추가 > 공유 계약 변경 없음. 앱은 기존 응답 포맷(`{success,data}`·`{items,pageInfo}`)과 에러 사전을 그대로 쓴다. ## 체크리스트 - [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 3 commits 2026-11-04 14:59:22 +09:00
데이터 기반(장소·행사 조회 API)이 생겨 앱 화면을 붙이기 시작한다.
디자인 캔버스의 1~7번(시작·둘러보기) 중 지금 API 로 바로 되는 것부터 만들었다.

- 앱 뼈대: 디자인 캔버스의 색·글자 크기·선 아이콘을 옮긴 테마, go_router 하단 탭
  (홈·지도·내 코스·내 정보 — 지도·내 코스·내 정보는 자리만), 한/영 문구(arb, 4개 언어 전제)
- 첫 실행: 현재 위치를 쓰거나 대구 동네(도심·수성못·앞산 카페거리)를 고른다.
  위치를 못 쓰면 대구 도심을 기준으로 시작하고 알린다. 좌표는 저장하지 않는다
- 홈 '이번 주말 축제·행사': 기준 위치 반경 120km 거리순, 비면 다가오는 30일 (2026-11-03 합의)
- 행사 전체 목록(커서 페이지)·상세(시간·요금·예매·전화·소개·출처)
- 한국어 문단은 단어 단위 줄바꿈(keepAll) — Flutter 기본은 글자 단위로 끊는다
- 공공누리 Type3 사진은 자르지 않고, 꼬리말에 관광공사·KOPIS·문화포털 출처를 적는다
- 한/영 생성물(lib/l10n/generated)은 flutter pub get 이 만들므로 git 에서 뺀다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
패키지 ID 는 스토어 등록·네이버 지도 Client ID 등록에 쓰이고 출시 후 바꿀 수 없어
템플릿 값(com.example.tma_app)을 보유 도메인(wandergo.net) 기준으로 정했다(2026-11-04 사용자 결정).
Android applicationId·namespace·MainActivity 경로, iOS 번들 ID 를 바꾸고
출시 대상이 아닌 macOS·Linux·웹은 식별자·이름만 맞췄다.

디자인 캔버스의 Pretendard 는 woff2 라 Flutter 가 읽지 못해, 공식 저장소
(github.com/orioncactus/pretendard v1.3.9)의 정적 OTF 중 디자인이 쓰는 400·500·600·700 만 넣었다.
SIL OFL 1.1 원문을 함께 두고 라이선스 화면에 등록했다(고지 조건).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(ci): 러너 compose 프로젝트 이름을 러너 이름으로 고정
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m21s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m58s
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 22m22s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 11m22s
CI / Backend (lint · test · e2e · build) (push) Has been cancelled
CI / Frontend (lint · type-check · test) (push) Has been cancelled
CI / 에러 코드 SSOT 동기화 검사 (push) Has been cancelled
CI (Flutter) / Flutter (analyze · test) (push) Has been cancelled
b6abc3d118
프로젝트 이름을 지정하지 않으면 폴더 이름(ci)이 되어, 같은 PC 에서 다른 저장소의
ci/ 러너와 이름이 겹쳐 그 러너를 덮어쓸 수 있다(2026-11-04 arasystem 러너와 같은 PC 에서 확인).
compose 파일에 name: ${RUNNER_NAME} 을 두어 -p 없이도 겹치지 않게 하고, README 에 이름을 다르게 지으라고 적었다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo merged commit b6abc3d118 into main 2026-11-04 15:59:48 +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#2