fix(flutter): 첨부만 있는 메일의 읽기 화면과 쓰기 · 검색 입력칸을 고친다 (앱 1.0.1) #27

Merged
ttipo merged 6 commits from fix/post-deploy-1112 into main 2026-11-12 09:51:41 +09:00
Owner

무엇을 · 왜

11월 12일 0시 운영 배포 뒤 받은 의견 둘을 앱에서 고치고, 앱 판을 1.0.1 로 올립니다. 서버 코드는 바뀌지 않아 다시 배포하지 않아도 됩니다(합친 뒤 APK 만 새로 올립니다).

  1. 앱 읽기 화면 — 본문 없이 첨부만 있는 메일 (94ec659)
    • 머리(제목 · 보낸 사람 · 안내 · 첨부)가 남은 높이의 절반까지만 쓰고 나머지는 본문 WebView 였습니다. 그래서 본문이 비면 아래 절반이 빈 칸으로 남고, 첨부가 많으면 위 절반 안에서 잘렸습니다.
    • 정화한 본문에 보이는 것이 없으면 본문 칸을 두지 않고, 머리가 화면 전체를 한 스크롤로 씁니다.
      • 보이는 것: 공백 · 보이지 않는 글자가 아닌 글자, 주소가 남은 그림, hr · li · details · q
      • 꾸밈(style · bgcolor · border)만 있는 것은 보이는 것으로 치지 않습니다.
    • 아래 막대가 없는 예약 메일은 머리 스크롤에 시스템 아래 여백을 더합니다. 본문이 있는 메일은 그대로입니다.
    • 웹은 빈 본문이 0px 이라 이 문제가 없습니다.
  2. 앱 쓰기 · 검색 입력칸 (bd916cc)
    • InputDecoration.collapsed 가 테마의 테두리를 물려받았습니다. 그래서 받는 사람 · 제목 · 본문 · 검색 칸에 글자를 감싼 둥근 테두리가 그려지고, 초점이면 청록 테두리가 칸 줄의 아래 선과 겹쳤습니다.
    • 여섯 테두리를 모두 없앤 borderlessInputDecoration 으로 바꿨습니다. lib/ 에 InputDecoration.collapsed( 가 다시 들어오면 시험이 실패합니다.
    • 확정 보드 App1Compose 와 다르던 칸 줄도 맞췄습니다.
      • 칸 이름 15 · 간격 6 · 오른쪽 여백 4
      • 칩이 여러 줄이면 칸 이름과 [참조 펼치기]를 첫 칩 줄에
      • 안내 글 · 칩 ✕ 색
      • 본문 칸 최소 높이: 원본 메일이 있으면 150, 없으면 서명이 있어도 240
  3. 앱 판 1.0.1+2 (198ac8f) — 최소 판(app-config 1.0.0)은 그대로라 1.0.0 을 쓰는 휴대폰도 막지 않습니다.
  4. 문서 (37ffcfc · 487760b · b644e8b)
    • 로드맵에 11-12 운영 배포를 적었습니다.
    • APK 크기(65MB 안팎 — 1.0.0 은 64.4MB)와 apksigner 를 돌리기 전에 Java 를 잡는 법을 적었습니다.
    • 위 두 규칙을 앱 디자인 README · flutter 스킬에 적었습니다.

확인 방법

  • cd flutter && flutter analyze — 문제 0
  • flutter test — 1,139 통과(1,114 에서 +25)
  • 고치기 전 · 후 쓰기 화면을 휴대폰 크기 그림(360×800 · 412×915, Pretendard)으로 그려, 테두리와 칸 줄을 보드와 견줬습니다.
  • 리뷰: 높음 · 중간 없음. 낮음 1(예약 메일의 아래 여백)과 참고는 반영했습니다.
  • 합친 뒤에는 release APK 1.0.1 을 만들어 운영 도구 「휴대폰 앱 올리기」로 올립니다. 그다음 실기기에서 첨부만 있는 메일과 쓰기 화면을 봅니다(앱 디자인 README 실기기 목록).

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라 — 문서만 고쳤습니다(docker 스킬 · mail/README 의 APK 크기)
  • 규칙 문서(.claude/) — flutter · docker 스킬

공유 계약(에러 코드 · 응답 포맷 · 페이지네이션 · API 규약)은 바꾸지 않았습니다.

체크리스트

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

🤖 Generated with Claude Code

## 무엇을 · 왜 11월 12일 0시 운영 배포 뒤 받은 의견 둘을 앱에서 고치고, 앱 판을 1.0.1 로 올립니다. 서버 코드는 바뀌지 않아 다시 배포하지 않아도 됩니다(합친 뒤 APK 만 새로 올립니다). 1. **앱 읽기 화면 — 본문 없이 첨부만 있는 메일** (94ec659) - 머리(제목 · 보낸 사람 · 안내 · 첨부)가 남은 높이의 절반까지만 쓰고 나머지는 본문 WebView 였습니다. 그래서 본문이 비면 아래 절반이 빈 칸으로 남고, 첨부가 많으면 위 절반 안에서 잘렸습니다. - 정화한 본문에 보이는 것이 없으면 본문 칸을 두지 않고, 머리가 화면 전체를 한 스크롤로 씁니다. - 보이는 것: 공백 · 보이지 않는 글자가 아닌 글자, 주소가 남은 그림, `hr` · `li` · `details` · `q` - 꾸밈(style · bgcolor · border)만 있는 것은 보이는 것으로 치지 않습니다. - 아래 막대가 없는 예약 메일은 머리 스크롤에 시스템 아래 여백을 더합니다. 본문이 있는 메일은 그대로입니다. - 웹은 빈 본문이 0px 이라 이 문제가 없습니다. 2. **앱 쓰기 · 검색 입력칸** (bd916cc) - `InputDecoration.collapsed` 가 테마의 테두리를 물려받았습니다. 그래서 받는 사람 · 제목 · 본문 · 검색 칸에 글자를 감싼 둥근 테두리가 그려지고, 초점이면 청록 테두리가 칸 줄의 아래 선과 겹쳤습니다. - 여섯 테두리를 모두 없앤 `borderlessInputDecoration` 으로 바꿨습니다. `lib/` 에 `InputDecoration.collapsed(` 가 다시 들어오면 시험이 실패합니다. - 확정 보드 App1Compose 와 다르던 칸 줄도 맞췄습니다. - 칸 이름 15 · 간격 6 · 오른쪽 여백 4 - 칩이 여러 줄이면 칸 이름과 [참조 펼치기]를 첫 칩 줄에 - 안내 글 · 칩 ✕ 색 - 본문 칸 최소 높이: 원본 메일이 있으면 150, 없으면 서명이 있어도 240 3. **앱 판 1.0.1+2** (198ac8f) — 최소 판(app-config 1.0.0)은 그대로라 1.0.0 을 쓰는 휴대폰도 막지 않습니다. 4. **문서** (37ffcfc · 487760b · b644e8b) - 로드맵에 11-12 운영 배포를 적었습니다. - APK 크기(65MB 안팎 — 1.0.0 은 64.4MB)와 apksigner 를 돌리기 전에 Java 를 잡는 법을 적었습니다. - 위 두 규칙을 앱 디자인 README · flutter 스킬에 적었습니다. ## 확인 방법 - `cd flutter && flutter analyze` — 문제 0 - `flutter test` — 1,139 통과(1,114 에서 +25) - 고치기 전 · 후 쓰기 화면을 휴대폰 크기 그림(360×800 · 412×915, Pretendard)으로 그려, 테두리와 칸 줄을 보드와 견줬습니다. - 리뷰: 높음 · 중간 없음. 낮음 1(예약 메일의 아래 여백)과 참고는 반영했습니다. - 합친 뒤에는 release APK 1.0.1 을 만들어 운영 도구 「휴대폰 앱 올리기」로 올립니다. 그다음 실기기에서 첨부만 있는 메일과 쓰기 화면을 봅니다(앱 디자인 README 실기기 목록). ## 영향 범위 - [ ] backend - [ ] frontend - [x] flutter - [ ] docker / 인프라 — 문서만 고쳤습니다(docker 스킬 · mail/README 의 APK 크기) - [x] 규칙 문서(.claude/) — flutter · docker 스킬 공유 계약(에러 코드 · 응답 포맷 · 페이지네이션 · API 규약)은 바꾸지 않았습니다. ## 체크리스트 - [x] 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 - [x] 주석 한국어, 매직 넘버·하드코딩 문자열 없음 - [x] 사용자 노출 실패는 모두 에러 코드와 함께 처리 — 새 실패 경로 없음 - [x] 에러 코드를 바꿨다면 `npm run sync:error-codes` 실행 후 생성 파일까지 커밋 — 바꾸지 않음 - [x] 민감정보 미커밋 (`*.example` 값은 placeholder) - [x] 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 — 로그를 더하지 않음 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ttipo added 6 commits 2026-11-12 08:15:31 +09:00
14 · 15 · 16단계 · 앱 서버 · 업데이트 내역을 11-12 0시에 운영에 올렸고
휴대폰 앱 1.0.0 을 나눠 주기 시작했다. 배포 뒤 받은 의견(앱 읽기 화면 ·
쓰기 화면 입력칸)은 앱 1.0.1 로 고치는 중이다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
첫 release APK(1.0.0)는 기기 종류 셋(ABI)이 한 파일에 들어 64.4MB 였다 —
문서의 "판마다 30MB 남짓"을 고친다. 개발 PC 에 java 가 PATH 에 없으면
apksigner 가 결과 없이 끝나 서명 확인을 놓치므로 Android Studio 의 Java 를
먼저 잡는 줄을 flutter/README 사내 배포에 더한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
읽기 화면은 머리(제목 · 보낸 사람 · 안내 · 첨부)가 남은 높이의 절반까지만 쓰고
나머지는 본문 WebView 였다. 본문이 비면 아래 절반이 빈 칸으로 남고 첨부가 많으면
위 절반 안에서 잘렸다(11-12 배포 뒤 사용자 보고).

정화한 본문에 보이는 것(글자 · 주소가 남은 그림 · hr · li · details · q)이 없으면
상태 bodyEmpty 로 본문 칸을 두지 않고 머리가 화면 전체를 한 스크롤로 쓴다.
판정은 정화와 같은 길에서 내고(큰 본문은 isolate), 아래 막대가 없는 예약 메일은
머리 스크롤에 시스템 아래 여백을 더한다. 본문이 있는 메일은 그대로다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
InputDecoration.collapsed 는 enabledBorder · focusedBorder 를 비워 두어 TextField 가
앱 테마의 둥근 테두리로 채운다. 그래서 받는 사람 · 제목 · 본문 · 검색 칸에 글자를
감싼 테두리가 그려지고 초점이면 칸 줄의 아래 선과 청록 테두리가 겹쳤다
(11-12 배포 뒤 사용자 보고). 여섯 테두리를 모두 없앤 borderlessInputDecoration 으로
바꾸고, lib 에 InputDecoration.collapsed 가 다시 들어오면 시험이 실패하게 한다.

함께 칸 줄을 보드 App1Compose 에 맞췄다: 칸 이름 15 · 간격 6 · 오른쪽 여백 4,
칩이 여러 줄이면 칸 이름과 [참조 펼치기]를 첫 칩 줄에, 안내 글 색 · 칩 ✕ 색,
본문 칸 최소 높이(원본 메일이 있으면 150 · 없으면 서명이 있어도 240).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(flutter): 앱 판을 1.0.1 로 올린다
CI (Flutter) / Flutter (analyze · test) (pull_request) Successful in 22m14s
CI / Backend (lint · type-check · test · e2e · build) (pull_request) Successful in 13m2s
CI / Frontend (lint · type-check · test · build) (pull_request) Successful in 13m25s
CI / Infra (compose · Dockerfile · nginx · 운영 스크립트) (pull_request) Successful in 2m6s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m25s
CI / Infra (compose · Dockerfile · nginx · 운영 스크립트) (push) Waiting to run
CI / 에러 코드 SSOT 동기화 검사 (push) Waiting to run
CI (Flutter) / Flutter (analyze · test) (push) Successful in 22m26s
CI / Backend (lint · type-check · test · e2e · build) (push) Successful in 13m44s
CI / Frontend (lint · type-check · test · build) (push) Has started running
198ac8f4f2
읽기 화면의 빈 본문과 쓰기 · 검색 입력칸 고침을 직원 휴대폰에 내보낼 판이다.
최소 판(app-config 1.0.0)은 그대로라 1.0.0 을 쓰는 휴대폰도 막지 않는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo merged commit 198ac8f4f2 into main 2026-11-12 09:51:41 +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/arasystem#27