정본 이관 → https://github.com/Afternote/Afternote-FE/blob/develop/docs/qa/round-1.md

Afternote QA 리포트 — 2026-07-19

테스트 환경

항목 내용
기기 Android Emulator Medium_Phone (arm64, Android 17 / targetSdk 36)
빌드 develop 브랜치 78551075 기준 debug 빌드 (:app:installDebug), versionName 1.0
서버 https://afternote.kro.kr/api/v1/ (라이브 서버)
계정 [email protected] (이메일 로그인)
테스트 방식 에뮬레이터 수동 시나리오 QA + logcat(OkHttp) 네트워크 로그 + 소스코드 교차 확인

발견 사항

# 구분 발생 경로 문제 현상 기대 동작 원인 / 비고
1 서버 노트 탭 → 애프터노트 작성(갤러리 및 파일) → 전체 입력 → 등록 POST /api/v1/afternotes → 500 Field 'created_at' doesn't have a default value — 애프터노트 등록이 서버에서 항상 실패 등록 성공 서버 DB afternote.created_at 컬럼 기본값/INSERT 누락
2 클라 #1과 동일 경로 등록이 500으로 실패해도 토스트·팝업 등 어떤 안내도 없이 무반응. 사용자는 등록된 것으로 오인 가능 실패 안내 표시 + 재시도 유도 AfternoteRepository가 에러를 로그만 남기고 UI 전달 안 함
3 클라 노트 탭 → 작성 → 종류=소셜네트워크 → 입력 후 등록 "수신자를 한 명 이상 선택해 주세요" 검증에 걸리지만 화면에 수신자 지정 UI가 아예 없어 등록이 원천 불가 갤러리/추모처럼 수신자 지정 섹션 노출 SocialNetworkEditorContent.kt가 recipientSection 파라미터를 받고도 렌더링하지 않음 (갤러리·추모는 RecipientDesignationSection렌더링)
4 클라+서버 타임레터 탭 → 목록 항목 ⋯ → 삭제 클라는 POST /time-letters/delete 호출, 서버는 500 "Request method 'POST' is not supported" → 삭제 불가. 삭제 확인 팝업·실패 안내도 없음 삭제 성공(또는 실패 안내), 삭제 전 확인 팝업 클라-서버 HTTP 메서드 계약 불일치 (서버는 DELETE 기대 추정)
5 클라 로그인 → 올바른 이메일 + 틀린 비밀번호 → 로그인 서버가 401 "아이디 또는 비밀번호가 일치하지 않습니다"를 반환해도 화면 무변화, 에러 문구 없음 실패 사유 표시 로그인 실패 상태가 UI에 반영되지 않음
6 클라 애프터노트/타임레터 작성 중 → 백 키 또는 ← 버튼 경고 없이 화면 종료, 작성 내용 전부 소실. 백 키가 어떤 때는 키보드만 닫히고 어떤 때는 화면이 닫히는 비일관 동작도 확인 "작성 중인 내용이 사라집니다" 확인 팝업 이탈 가드 미구현
7 클라 기록 탭 → 데일리 질문 → + → 작성 → 임시저장 임시저장은 서버 저장 성공(200, draft:true)하지만 목록에 안 보이고, 재진입 시 이어쓰기도 안 됨 → 사실상 접근 불가/유실 임시저장 글 목록 표시 또는 재진입 시 이어쓰기 제안 /daily-questions/today 응답의 draft:true를 클라가 무시
8 클라 데일리질문·일기 저장 → 목록 복귀 저장 직후 목록이 갱신되지 않음(빈 화면 유지). 서브탭 전환 후에야 표시됨. 홈의 일기 TOTAL·수신인 지정 배지도 실시간 미갱신(앱 재시작 시에만 갱신) 저장/복귀 시 목록·홈 데이터 재조회 화면 복귀 시 refetch 누락
9 클라 홈 탭 → TODAY'S QUESTION 카드 날짜가 항상 "2026.04.10", 질문도 실제 오늘의 질문("휴식…")이 아닌 기본 문구("고마웠나요?") 고정 표시 실제 오늘 날짜·질문 표시 TodayQuestionCard.kt:37 기본값 하드코딩, HomeTabMindRecordLazyItems.kt:41에서 실데이터 미전달
10 클라 홈 탭 → "수신인 지정 미완료" 칩 탭 클릭 가능한 UI인데 탭해도 아무 동작 없음 수신자 등록 화면으로 이동 클릭 핸들러 미연결
11 클라 설정 → 상단 바로가기(고객센터/공지사항/수신자목록) 3개 아이콘 모두 탭 무반응 (하단 리스트의 동일 메뉴는 정상 동작) 각 화면으로 이동 클릭 핸들러 미연결
12 클라 타임레터 탭 → 우상단 프로필(👤)/설정(⚙) 아이콘 둘 다 탭 무반응 (홈 탭의 동일 설정 아이콘은 정상) 설정/프로필 이동 타임레터 헤더에만 핸들러 미연결
13 클라 노트 탭 → 작성 → 남기실 말씀 카드의 "등록" 버튼 카드별 "등록" 버튼이 아무 동작 없음 정의된 동작 수행(또는 버튼 제거) AfternoteEditorContent.kt:268,300onMessageRegisterClick = {} 빈 람다
14 클라 노트 탭 → 작성 → 종류=추억 노트 → 추억 플레이리스트 카드에는 "현재 16개의 노래가 담겨 있습니다"인데 진입하면 "총 0곡" 빈 목록. 플레이리스트 화면엔 곡 추가 버튼도 없음 실제 곡 수 표시, 곡 추가 진입점 제공 EditorFormState.kt:49playlistSongCount: Int = 16 하드코딩 기본값
15 클라 기록 탭 → 주간리포트 상단 카운트는 데일리질문 1·일기 1인데 본문은 "이준혁님은 0일의 마음을 기록하셨네요" — 수치 불일치 기록 일수 정확 표시 기록일수 집계 로직/필드 불일치
16 클라 타임레터 목록 → 항목 탭(상세) 상세 헤더의 제목·수신인·발송예정일이 밝은 배경 위 흰색 텍스트로 거의 안 보임 대비 확보(어두운 텍스트 또는 배경 딤 처리) 헤더 배경 이미지 없을 때의 대비 미처리 추정
17 클라 설정 → 수신자 목록 / 타임레터 작성 → 수신인 선택 검색창 placeholder가 리터럴 "Text Field" 로 노출 한국어 안내 문구 (예: "이름으로 검색") placeholder 미지정/컴포넌트 기본값 노출
18 클라 기록 탭 → 데일리 질문(데이터 없음) / 설정 → 공지사항(데이터 없음) 빈 목록일 때 안내 문구 없이 완전 빈 화면 빈 상태 안내 표시 빈 상태 UI 누락 (일기 탭·타임레터에는 있음)
19 클라 기록 탭 → 일기(데이터 없음) 빈 상태 문구가 "아직 등록된 답변이 없어요. 답변을 등록해 자신을 알아 보아요." — 노트 탭 문구 재사용으로 일기 맥락과 불일치 일기 맥락 문구 문구 재사용

서버 보안 관련

# 심각도 발생 경로 문제 현상 기대 동작
S1 중간 애프터노트 등록 실패 응답 (#1) 500 응답 message에 SQL문·컬럼명 등 내부 정보가 그대로 노출 (insert into afternote (category_type, ...)) 내부 오류는 일반화된 메시지로 치환, 상세는 서버 로그로만

기획 의도 확인 필요

# 발생 경로 내용
O1 설정 → 수신자 등록 완료 / 수신자 선택 완료 성공 시 토스트 등 피드백 없이 조용히 이전 화면 복귀
O2 노트 작성(갤러리) → 수신자 추가 설정에 등록해 둔 수신자(QA Tester)를 선택하는 방식이 아니라 이름/관계/전화번호를 새로 입력받는 다이얼로그. 등록된 수신자 재사용이 안 되는 게 의도인지 확인 필요
O3 설정 → 패스키 관리 → 비밀번호로 인증하기 숫자 4자리 키패드가 뜨는데 계정 비밀번호는 영문+특수문자라 어떤 비밀번호를 요구하는지 불명확 (앱 잠금 PIN 미설정 상태의 동작 포함 확인 필요)
O4 타임레터 작성 → 발송 시간 미선택 → 등록 시간 없이 등록 가능하며 00:00(오전 12:00)으로 저장됨. 시간이 필수인지 확인 필요
O5 타임레터 4건째 등록 → 무료 플랜 팝업 → "구독 후 기록하기" 팝업만 닫힘. 코드상 TODO(구독 화면 미구현) — 알려진 상태
O6 Welcome → 전달 받은 기록 확인하기 받은 기록함 빈 상태 문구가 "수신자를 등록하여" — 수신자 입장에서는 발신자 등록이므로 용어 확인 필요. 발신자 목록의 "마지막 확인: " 뒤 빈 값 노출