Repository navigation
fix(mindrecord): 주간리포트 감정 이모지 미표시 — 서버 emotion 이 한글("기쁨")로 오는데 클라 enum 은 HAPPY/SOSO/SAD #591
Description
📜 Overview (Required)
주간리포트 캘린더의 감정 이모지가 표시되지 않는다. 서버 week[].emotion 이 한글 문자열로 내려오는데 클라 enum 에는 그 값이 없어 조용히 null 로 치환되기 때문이다.
서버 응답 실측 (2026-07-29 12:1x, dev 서버). 같은 diaryId 인데 등록 직후와 이후의 값이 다르다.
POST /api/v1/diary {"todayMood":"HAPPY", ...}
→ 등록 직후 GET /api/v1/mind-record?date=2026-07-27
"week":[{"diaryId":7,"day":29,"isDiary":true,"emotion":"HAPPY"}]
→ 수 분 뒤 (재조회 2회 모두 동일)
"week":[{"diaryId":7,"day":29,"isDiary":true,"emotion":"기쁨"}]
클라 계약 — WeeklyReportDayDto.emotion: TodayMoodDto? 이고 TodayMoodDto 는 HAPPY / SOSO / SAD 세 값뿐이다(DiaryDto.kt:7-16). "기쁨" 은 정의에 없다.
결과 — 크래시는 나지 않는다. NetworkModule.kt:35 의 coerceInputValues = true 때문에 정의에 없는 enum 값은 "없는 값" 으로 처리되어 기본값으로 치환되고, 이 프로퍼티는 기본값이 null 이라 emotion = null 이 된다. 그 결과 WeeklyReportViewModel.kt:125 의 apiDay?.emotion?.toEmoji() 가 항상 null 이 되어 캘린더에 감정 이모지가 한 개도 뜨지 않는다.
근거: kotlinx.serialization
coerceInputValues— "Property type is an enum type, but JSON value contains an unknown enum member" 인 경우 coerce 대상이며, "Coerced values are treated as missing; they are replaced either with a default property value if it exists"
https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-json/kotlinx.serialization.json/-json-builder/coerce-input-values.html
시안에는 감정 이모지가 요일 칸에 표시된다 — 주간리포트 시안 (목·금·일 칸).
enum 수용 방식은 #699 에서 정한다. 서버가 todayMood 는 영문 enum 으로 받으면서 한글 값을 내려주는 것이 의도인지 확인하고, 클라가 한글 값을 받는 매핑을 둘지 서버에 영문 통일을 요청할지 고르는 판단은 같은 TodayMoodDto 를 다루는 #699 와 하나다. 두 이슈에서 따로 정하면 갈라지므로 이 이슈는 그 결정을 따르고, 결정이 적용된 뒤에도 캘린더에 이모지가 뜨지 않는 부분만 범위로 둔다.
이 이슈의 고유 범위는 week[].emotion 경로다 — WeeklyReportDayDto.emotion 이 nullable 이라 값이 어긋나도 예외 없이 null 로 접히고, WeeklyReportViewModel.kt:125 의 apiDay?.emotion?.toEmoji() 가 그대로 통과해 실패가 화면에 드러나지 않는다. #699 쪽(DiaryListItemDto.todayMood)은 기본값이 없어 파싱 예외로 목록이 통째로 죽는, 반대 방향의 파급이다.
시안 — 감정 이모지가 붙는 자리:
📌 Child Issue(Optional)
No response
📍 Note (Optional)
- PR fix(mindrecord): 주간리포트 기록일수 집계 보정 — 데일리질문 기록일 누락 (closes 521) #524 관련 서버 대조(fix(mindrecord): 주간리포트 상단 카운트와 요약 기록일수 불일치 — diaryAmount 는 1인데 week[] 에 미포함 #590) 중 발견. 그 대조의 주제(
diaryAmount↔week[]불일치)와는 별개 사안이라 분리한다. - 등록 직후에는
"HAPPY", 이후에는"기쁨"이라는 점에서 서버가 저장 후 어느 시점에 값을 바꾸는 것으로 보인다. 그 시점·주체는 미확인이다. emotions(주간 감정 키워드 목록) 는 별도 필드이고String이라 이 건과 무관하다.- 담당은 git 기록 기준 — 대상 파일 주 작성자 Sadturtleman.
- fix(mindrecord): 일기 목록 응답 파싱·날짜 해석 정정 — date/createdAt 분리, 오늘 폴백 제거, 임시저장 제외 #699 와의 경계 (2026-08-03 정리) — 같은
TodayMoodDto값 불일치를 두 이슈가 서로 다른 지점에서 잡고 있어, 결정이 중복 지시되지 않도록 갈랐다. enum 수용 방식은 fix(mindrecord): 일기 목록 응답 파싱·날짜 해석 정정 — date/createdAt 분리, 오늘 폴백 제거, 임시저장 제외 #699 가 정하고, 이 이슈는 그 결정이week[].emotion경로에 적용되어 캘린더에 이모지가 뜨는 것까지를 확인 범위로 둔다. 위 서버 실측(HAPPY→기쁨)은 fix(mindrecord): 일기 목록 응답 파싱·날짜 해석 정정 — date/createdAt 분리, 오늘 폴백 제거, 임시저장 제외 #699 가 미확인으로 남긴 부분이라 그쪽에도 근거로 옮겼다.
Activity
OnlyReadOneBook commentedon Aug 3, 2026
같은
TodayMoodDto값 불일치를 다른 지점에서 잡은 이슈가 올라왔습니다 — #699 (일기 목록).week[].emotion은TodayMoodDto?라coerceInputValues가null로 치환, 이모지가 조용히 안 뜸DiaryListItemDto.todayMood는 기본값이 없어 coerce 가 동작하지 못하고MissingFieldException으로 그 달 목록이 통째로 소실여기서 실측한 "등록 직후
HAPPY→ 수 분 뒤기쁨" 이 #699 가 미확인으로 남긴 부분을 메워서, 그쪽에 근거로 옮겨 두었습니다. 한쪽에서 enum 수용 방식(한글 값 매핑을 둘지, 서버에 영문 통일을 요청할지)을 정하면 두 화면이 같이 풀립니다.Sadturtleman commentedon Aug 23, 2026
재현되지 않습니다 — 서버 값이 영문으로 돌아왔습니다
할당 이슈를 정리하면서 2026-08-23 실서버(
afternote.kro.kr)로 재확인했습니다. 이슈가 보고한 한글 값("기쁨")이 더 이상 오지 않습니다.이슈 본문의 "등록 직후에는
HAPPY, 수 분 뒤에는기쁨" 이 재현되지 않습니다.앱 화면에서도 이모지가 뜹니다
에뮬레이터(Medium_Phone / API 36) debug 빌드, 실계정 주간리포트 캘린더:
23일 칸에
😊(U+1F60A)가 표시됩니다. 이슈가 지목한WeeklyReportViewModel의emotion?.toEmoji()가 정상 통과합니다.그래서 클라 수정은 넣지 않았습니다
coerceInputValues를 유지했습니다.week[].emotion경로에 그 결정이 적용돼 이모지가 뜨는 것)는 위 실측으로 충족됩니다.남는 위험은 이미 테스트로 고정돼 있습니다
서버가 다시 한글로 바뀌어도 목록이 죽지는 않는다는 것은
WeeklyReportContractTest가 이미 단언합니다.다만 이슈가 지적한 "실패가 화면에 드러나지 않는다" 는 성질은 그대로입니다 — 값이 어긋나면 이모지만 조용히 사라집니다. 이걸 드러내는 처리가 필요하다고 보시면 별도 이슈로 잡는 편이 낫겠습니다(그때는 "무엇을 보여줄지" 시안 확정이 선행입니다).
판단 부탁드립니다 — 이대로 닫아도 될지, 아니면 한글 값 방어 매핑을 넣어 둘지 알려주시면 그대로 진행하겠습니다.
Sadturtleman commentedon Aug 25, 2026
오늘 기준 실측 — 한글 값이 재현되지 않습니다. 화면에도 이모지가 뜹니다
GET /api/v1/mind-record?date=2026-08-24응답의week[].emotion이 영문 enum 으로 옵니다.이슈가 «수 분 뒤 한글로 바뀐다» 고 적은 부분을 확인하려고 20초 간격 6회 재조회했는데 값이 변하지 않았습니다 (
pending3건이 남아 있는 동안에도HAPPY·SOSO유지).에뮬레이터에서도 캘린더 월·화 칸에 이모지가 정상 표시됩니다.
다만 이 화면은 다른 이유로 안 열리고 있었습니다
확인이 늦어진 이유이기도 한데,
mind-record응답이 16.9 · 20.2 · 25.9초(실기기에서는 52초)라 클라 read timeout 10초에 매번 걸려 주간리포트 탭이 항상 실패 화면이었습니다. 그래서 «이모지가 안 보인다» 를 화면에서 확인할 방법 자체가 없었습니다.제안
지금 상태에서는 이 이슈의 증상이 재현되지 않습니다. 다만 «한글로 오는 경로가 있는가» 는 서버 구현에 달려 있어, 이슈에 적힌
#699(TodayMoodDto 수용 방식) 결정이 나기 전에 닫기는 이릅니다.닫기 전 확인하면 좋을 것: 감정 분석이 완료(
pending: 0)된 주에서도 영문으로 오는지. 지금 계정은pending: 3이 남아 있어 그 조건을 못 만들었습니다. 분석이 끝난 계정이 있으면 그 응답만 확인해 주시면 판단이 끝납니다.OnlyReadOneBook commentedon Aug 25, 2026
제목의 전제가 지금은 성립하지 않습니다 —
week[].emotion은 영문 enum 입니다#1122 실측 중 같은 응답을 직접 받아 확인했습니다. QA823 계정에
todayMood를 각각 HAPPY·SAD·SOSO 로 일기 3건을 저장하고 조회한 원문입니다 (2026-08-25 17:00 KST,https://afternote.kro.kr).한글은
emotions[].keyword쪽이고, 캘린더용week[].emotion과는 다른 필드입니다. 서버 코드에서도 분리돼 있습니다 —WeeklyMindRecordService.buildWeekItems는d.getTodayMood().name()(HAPPY/SOSO/SAD)을 넣고, 한글 키워드는buildTopEmotions가 Gemini 감정 분석 결과에서 만듭니다. 주석에도 «week[] 캘린더는 일기 todayMood 이모지용. Gemini 감정분석(emotions[])과 분리한다»고 적혀 있습니다.이슈 등록 시점에 한글이 왔던 것이라면 그 사이 서버가 바뀐 것이고, 필드를 혼동한 것이라면 원인 자체를 다시 잡아야 합니다. 어느 쪽이든 지금 코드에 한글→enum 매핑을 넣는 방향은 맞지 않아 보입니다.
다만 이모지가 실제로 표시되는지는 여전히 확인 못 했습니다 — 이 화면이 #1122(서버 응답 23~60초 vs 앱 read timeout 10초, BE #154 로 blocked) 때문에 실기기에서 안 열립니다.
참고로 같은 날 일기를 3건 저장해도
week[]에는 1건만 옵니다. 날짜당 최신 일기 1개만 남기는 서버 사양입니다.Sadturtleman commentedon Aug 27, 2026
재실측 (2026-08-27) — 증상이 해소됐습니다
이슈의 전제는 「서버가
week[].emotion을 한글로 내려준다」인데, 지금은 영문 enum 입니다.8/24 데이터인데 사흘이 지난 지금도
"HAPPY"입니다 — 이슈가 관측한 「수 분 뒤"기쁨"으로 바뀐다」는 재현되지 않습니다. Swagger 의WeekRecordItem.emotion도 영문 enum 으로 문서화돼 있습니다.캘린더에 이모지가 뜹니다 (실기 확인)
에뮬레이터에서 8월 4주차 리포트를 열어
uiautomator노드로 확인했습니다.U+1F60A(😊)가 24·25일 칸에 렌더됩니다. 서버가HAPPY를 준 바로 그 두 날입니다. 26일은DAILY_QUESTION이라emotion: null이고 숫자로 남습니다 — 의도한 대로입니다.그 사이 FE 도 이미 맞춰져 있었습니다
WeeklyReportDayDto가type: String으로 갱신됐습니다. 서버가isDiary→type(DIARY/DAILY_QUESTION/DEEP_THOUGHT)으로 바꾼 것을 따라간 것입니다.emotion은NullableTodayMoodSerializer를 씁니다 — 키 누락은 실패, 모르는 값은 그 칸만 비움. 이 이슈가 근거로 남은 판단입니다(그 KDoc 이 fix(mindrecord): 주간리포트 감정 이모지 미표시 — 서버 emotion 이 한글("기쁨")로 오는데 클라 enum 은 HAPPY/SOSO/SAD #591 을 인용합니다).경로도 온전합니다: DTO →
WeeklyReportMapper→WeeklyReport.week[].emotion: TodayMood?→WeeklyReportViewModel.toEmoji().닫습니다 — 다만 남는 사각이 하나 있습니다
서버가 다시 한글로 바뀌면 이모지가 조용히 사라집니다. 모르는 값이
null로 접히고 아무 신호도 남지 않아서, 이 이슈가 원래 지적한 「실패가 화면에 드러나지 않는다」가 그대로입니다.그 값을 접을 때 텔레메트리에 남기는 것은 #928(ErrorReporter 채택 범위 정리) 범위라 그쪽에 근거로 옮겨 두겠습니다. 이 이슈에서 다시 손대면 두 곳에서 같은 결정을 하게 됩니다 — #699 와 경계를 갈랐던 것과 같은 이유입니다.