Skip to content

fix(mindrecord): 주간리포트 감정 이모지 미표시 — 서버 emotion 이 한글("기쁨")로 오는데 클라 enum 은 HAPPY/SOSO/SAD #591

Closed

Description

@OnlyReadOneBook

📜 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)은 기본값이 없어 파싱 예외로 목록이 통째로 죽는, 반대 방향의 파급이다.

시안 — 감정 이모지가 붙는 자리:

Image

📌 Child Issue(Optional)

No response

📍 Note (Optional)

Activity

  1. OnlyReadOneBook commented on Aug 3, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    같은 TodayMoodDto 값 불일치를 다른 지점에서 잡은 이슈가 올라왔습니다 — #699 (일기 목록).

    여기서 실측한 "등록 직후 HAPPY → 수 분 뒤 기쁨" 이 #699 가 미확인으로 남긴 부분을 메워서, 그쪽에 근거로 옮겨 두었습니다. 한쪽에서 enum 수용 방식(한글 값 매핑을 둘지, 서버에 영문 통일을 요청할지)을 정하면 두 화면이 같이 풀립니다.

  2. Sadturtleman commented on Aug 23, 2026

    @Sadturtleman
    Collaborator

    재현되지 않습니다 — 서버 값이 영문으로 돌아왔습니다

    할당 이슈를 정리하면서 2026-08-23 실서버(afternote.kro.kr)로 재확인했습니다. 이슈가 보고한 한글 값("기쁨")이 더 이상 오지 않습니다.

    POST /api/v1/diary  {"todayMood":"HAPPY", ...}
    → 등록 직후   GET /api/v1/mind-record?date=2026-08-23
       "week":[{"diaryId":9736,"day":23,"type":"DIARY","emotion":"HAPPY"}]
    → 20초 뒤 (이슈가 값이 바뀐다고 보고한 구간)
       "week":[{"diaryId":9736,"day":23,"type":"DIARY","emotion":"HAPPY"}]   ← 그대로
    
    POST /api/v1/diary  {"todayMood":"SAD", ...}
       "week":[{"diaryId":9737,"day":23,"type":"DIARY","emotion":"SAD"}]
    

    이슈 본문의 "등록 직후에는 HAPPY, 수 분 뒤에는 기쁨" 이 재현되지 않습니다.

    앱 화면에서도 이모지가 뜹니다

    에뮬레이터(Medium_Phone / API 36) debug 빌드, 실계정 주간리포트 캘린더:

    월 | 17 | 화 | 18 | 수 | 19 | 목 | 20 | 금 | 21 | 토 | 22 | 일 | 😊
    

    23일 칸에 😊(U+1F60A)가 표시됩니다. 이슈가 지목한 WeeklyReportViewModel 의 emotion?.toEmoji() 가 정상 통과합니다.

    그래서 클라 수정은 넣지 않았습니다

    남는 위험은 이미 테스트로 고정돼 있습니다

    서버가 다시 한글로 바뀌어도 목록이 죽지는 않는다는 것은 WeeklyReportContractTest 가 이미 단언합니다.

    // WeeklyReportContractTest.kt:95
    fun `클라가 모르는 기분 값은 그 원소의 기분만 비운다`() {
        val week = decodeWeek("""[{ "diaryId": 1, "day": 1, "type": "DIARY", "emotion": "슬픔" }]""")

    다만 이슈가 지적한 "실패가 화면에 드러나지 않는다" 는 성질은 그대로입니다 — 값이 어긋나면 이모지만 조용히 사라집니다. 이걸 드러내는 처리가 필요하다고 보시면 별도 이슈로 잡는 편이 낫겠습니다(그때는 "무엇을 보여줄지" 시안 확정이 선행입니다).

    판단 부탁드립니다 — 이대로 닫아도 될지, 아니면 한글 값 방어 매핑을 넣어 둘지 알려주시면 그대로 진행하겠습니다.

  3. Sadturtleman commented on Aug 25, 2026

    @Sadturtleman
    Collaborator

    오늘 기준 실측 — 한글 값이 재현되지 않습니다. 화면에도 이모지가 뜹니다

    GET /api/v1/mind-record?date=2026-08-24 응답의 week[].emotion 이 영문 enum 으로 옵니다.

    "week":[{"diaryId":41541,"day":24,"type":"DIARY","emotion":"HAPPY"},
            {"diaryId":41545,"day":25,"type":"DIARY","emotion":"SOSO"}]
    "emotionAnalysis":{"total":7,"succeeded":4,"pending":3,"failed":0}

    이슈가 «수 분 뒤 한글로 바뀐다» 고 적은 부분을 확인하려고 20초 간격 6회 재조회했는데 값이 변하지 않았습니다 (pending 3건이 남아 있는 동안에도 HAPPY·SOSO 유지).

    에뮬레이터에서도 캘린더 월·화 칸에 이모지가 정상 표시됩니다.

    다만 이 화면은 다른 이유로 안 열리고 있었습니다

    확인이 늦어진 이유이기도 한데, mind-record 응답이 16.9 · 20.2 · 25.9초(실기기에서는 52초)라 클라 read timeout 10초에 매번 걸려 주간리포트 탭이 항상 실패 화면이었습니다. 그래서 «이모지가 안 보인다» 를 화면에서 확인할 방법 자체가 없었습니다.

    제안

    지금 상태에서는 이 이슈의 증상이 재현되지 않습니다. 다만 «한글로 오는 경로가 있는가» 는 서버 구현에 달려 있어, 이슈에 적힌 #699(TodayMoodDto 수용 방식) 결정이 나기 전에 닫기는 이릅니다.

    닫기 전 확인하면 좋을 것: 감정 분석이 완료(pending: 0)된 주에서도 영문으로 오는지. 지금 계정은 pending: 3 이 남아 있어 그 조건을 못 만들었습니다. 분석이 끝난 계정이 있으면 그 응답만 확인해 주시면 판단이 끝납니다.

  4. OnlyReadOneBook commented on Aug 25, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    제목의 전제가 지금은 성립하지 않습니다 — week[].emotion 은 영문 enum 입니다

    #1122 실측 중 같은 응답을 직접 받아 확인했습니다. QA823 계정에 todayMood 를 각각 HAPPY·SAD·SOSO 로 일기 3건을 저장하고 조회한 원문입니다 (2026-08-25 17:00 KST, https://afternote.kro.kr).

    "week": [{"diaryId": 41551, "day": 25, "type": "DIARY", "emotion": "SOSO"}]
    "emotions": [{"keyword":"평온","percentage":33},{"keyword":"불안","percentage":33},{"keyword":"감사","percentage":33}]

    한글은 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개만 남기는 서버 사양입니다.

  5. Sadturtleman commented on Aug 27, 2026

    @Sadturtleman
    Collaborator

    재실측 (2026-08-27) — 증상이 해소됐습니다

    이슈의 전제는 「서버가 week[].emotion 을 한글로 내려준다」인데, 지금은 영문 enum 입니다.

    GET /api/v1/mind-record?date=2026-08-24
    "week": [
      {"diaryId":41541,"day":24,"type":"DIARY","emotion":"HAPPY"},
      {"diaryId":41547,"day":25,"type":"DIARY","emotion":"HAPPY"},
      {"diaryId":52,"day":26,"type":"DAILY_QUESTION","emotion":null}
    ]
    

    8/24 데이터인데 사흘이 지난 지금도 "HAPPY" 입니다 — 이슈가 관측한 「수 분 뒤 "기쁨" 으로 바뀐다」는 재현되지 않습니다. Swagger 의 WeekRecordItem.emotion 도 영문 enum 으로 문서화돼 있습니다.

    캘린더에 이모지가 뜹니다 (실기 확인)

    에뮬레이터에서 8월 4주차 리포트를 열어 uiautomator 노드로 확인했습니다.

    text="😊"  bounds=[104,1279][169,1343]   ← 24일 칸
    text="😊"  bounds=[239,1279][304,1343]   ← 25일 칸
    text="26" text="27" … (숫자로 표시)
    

    U+1F60A(😊)가 24·25일 칸에 렌더됩니다. 서버가 HAPPY 를 준 바로 그 두 날입니다. 26일은 DAILY_QUESTION 이라 emotion: null 이고 숫자로 남습니다 — 의도한 대로입니다.

    그 사이 FE 도 이미 맞춰져 있었습니다

    경로도 온전합니다: DTO → WeeklyReportMapper → WeeklyReport.week[].emotion: TodayMood? → WeeklyReportViewModel.toEmoji().

    닫습니다 — 다만 남는 사각이 하나 있습니다

    서버가 다시 한글로 바뀌면 이모지가 조용히 사라집니다. 모르는 값이 null 로 접히고 아무 신호도 남지 않아서, 이 이슈가 원래 지적한 「실패가 화면에 드러나지 않는다」가 그대로입니다.

    그 값을 접을 때 텔레메트리에 남기는 것은 #928(ErrorReporter 채택 범위 정리) 범위라 그쪽에 근거로 옮겨 두겠습니다. 이 이슈에서 다시 손대면 두 곳에서 같은 결정을 하게 됩니다 — #699 와 경계를 갈랐던 것과 같은 이유입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions