You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
origin/develop62d5935c와 이준혁 담당의 열린 PR #719·#720을 기준으로 feature/mindrecord의 DTO 기본 파라미터와 전 계층 nullable을 전수 확인했다.
현재 release API가 항상 채우는 값까지 false·0·""·emptyList()로 보정하거나 nullable로 낮춘 지점이 있다. 이 상태에서는 응답 키 누락과 계약 변경이 파싱 실패로 드러나지 않고 정상적인 빈 값으로 바뀐다. 특히 isDraft=false는 임시저장 노출, 수치 0은 잘못된 리포트, 빈 날짜·nullable 날짜는 기록 누락으로 이어질 수 있다.
확인된 대상
DTO의 불필요한 기본 파라미터 제거
DailyQuestionDto.kt: 요청 DTO는 매퍼가 모든 인자를 전달하는데 기본값이 있고, 응답의 isDraft·isAnswered는 서버가 항상 보내는데 false로 누락을 숨긴다.
DiaryDto.kt: 요청 DTO 기본값과 목록 래퍼의 emptyList()·0·null 기본값을 제거한다. PR #720이 추가한 title/content/createdAt/isDraft 등의 기본값도 같은 대상이다.
MindRecordDto.kt: 수신 목록 래퍼와 일기 응답의 isDraft/date/createdAt/updatedAt 기본값을 제거한다.
WeeklyReportDto.kt: 카운트·요약·목록·일자·질문·감정 비율의 기본값을 제거한다. emotion처럼 값 자체가 조건부인 필드는 nullable을 유지하되, 서버가 키를 명시적으로 보내므로 생성자 기본값은 두지 않는다.
응답 계약에 존재하지 않는 imageUrl은 기본값만 떼어 파싱을 깨지 말고, 해당 기능 계약 이슈에서 필드 자체를 정리한다.
ReceiverDiaryItemDto.todayMood: 같은 일기 응답 계약을 사용하므로 non-null로 맞춘다.
DiaryCreatePayload.receiverIds와 DiaryCreateRequestDto.receiverIds: 작성 UI는 항상 목록을 갖고 있고, 생성 API에서 null과 빈 목록은 모두 수신자 없음으로 정규화된다. List<Long>으로 좁혀 빈 목록을 그대로 전달한다.
유지할 nullable
imageUrl, 주간 최빈 기분 없음, 비일기 기록의 emotion, 선택적 조회 필터, 로딩 전 ID·오류 메시지 등 null이 실제 상태 또는 API 의미인 값은 유지한다.
PATCH 요청의 선택 필드는 wire DTO에서 nullable을 유지하되, 모든 생성 인자를 명시해 생략과 명시적 null을 코드에서 구분한다.
완료 기준
위 네 DTO 파일의 기본 파라미터를 필드별 계약과 생성 호출부 기준으로 제거한다.
서버가 항상 보내는 응답 키가 빠지면 false·0·빈 문자열·빈 목록으로 성공하지 않고 계약 테스트가 실패한다.
day, 일기 date/todayMood, 일기 생성 receiverIds가 DTO부터 domain·호출부까지 non-null로 이어진다.
실제 nullable 필드의 명시적 null은 정상 역직렬화되고, 해당 사유를 테스트로 고정한다.
즉 #932 는 이 PR 이 만들어 낸 상태를 근거로 이 PR 을 되돌리자고 말하는 구조였습니다. #932 에서 nullable·기본값 처방을 삭제했으므로 이 이슈·PR 의 방향(기본값 제거 = 엄격화)은 유지됩니다.
2. mindrecord DTO 가 참조 구현으로 남았습니다.#932 에 남은 범위는 "DTO 에 어느 엔드포인트의 응답인지 ·
그 판정 근거가 무엇인지 주석이 없다" 인데, 응답 DTO 15개 중 표기가 없는 8개에 mindrecord 는 한 건도 없습니다.
네 파일 전부 Swagger 스키마명 · 실측일 · 판단 근거까지 달려 있어서, #932 는 양식으로 DiaryDto.kt
를 따르도록 적어 뒀습니다. 매퍼 배치도 data/mapper/ 표준 명명이라 정리 대상이 아니고요. #932 의 Sadturtleman 몫은 0건입니다.
실제로 볼 만한 것은 receivers(5곳) · yearMonth · emotion · updatedAt 입니다.
PR #933 본문의 실서버 실측표에도 GET /diary 응답 키로 yearMonth·receivers·emotion·updatedAt 이, GET /daily-questions/today 에 receivers 가 찍혀 있습니다 — 서버가 보내는데 ignoreUnknownKeys 로 조용히 버려지는 중입니다.
이 PR 에서 기본값을 걷으며 어차피 필드별로 실서버를 확인하시니, 그때 누락 키도 같이 판정하시면 됩니다. receivers 를 실제로 화면에서 쓸지는 별개 제품 판단이라, 안 쓸 거면 "안 받는다" 로 결론 내고 KDoc 에 남겨 주시면 충분합니다.
클래스명이 달라 필드 유사도로 매칭한 쌍이라(예: DiaryListItemDto ↔ DiaryResponse) 대응 관계부터 확인해 주세요.
DailyQuestionAnswerResponseDto.content·isDraft — #573 이 #933 뒤에 머지되며 들어온 보정형 기본값입니다. #972 가 들이는 ResponseDtoContractKonsistTest 의 KNOWN_COERCING_DEFAULTS 에 #789 — mindrecord (2건) 으로
등재해 뒀습니다.
계약은 확인해 뒀습니다 — BE DailyQuestionAnswerResponse record 에 두 키가 다 있고 Jackson NON_NULL 설정이
없어 키가 항상 나가며, UserDailyQuestion.content 컬럼이 nullable = false · isDraft 는 primitive boolean 이라 값도 항상 옵니다 (Afternote-BEmain0fb9e0b 실코드).
Activity
fix(mindrecord): 재조회가 방금 고른 이미지를 되돌리지 않게 하고 day 를 non-null 로 되돌린다
fix(mindrecord): 재조회가 방금 고른 이미지를 되돌리지 않게 하고 day 를 non-null 로 되돌린다
docs(qa): #789 기분 enum 모르는 값 처리 판단을 기록한다
OnlyReadOneBook commentedon Aug 23, 2026
#932 가 이 이슈와 반대 방향이었던 문제를 정리했습니다. PR #933 은 그대로 진행하시면 됩니다.
#932("Response DTO 60% 가 파싱 실패 위험 — nullable 전환")를 실측 대조했더니 두 가지가 나왔습니다.
1. #932 의 근거 수치가 PR #933 브랜치 기준이었습니다. develop 이 기준이라고 적혀 있었지만,
같은 스크립트를 세 리비전에 돌리면
refactor/789-dto-defaults에서만 14개 파일 전부와 총계가 일치합니다.6123a68a(develop)refactor/789-dto-defaults즉 #932 는 이 PR 이 만들어 낸 상태를 근거로 이 PR 을 되돌리자고 말하는 구조였습니다.
#932 에서 nullable·기본값 처방을 삭제했으므로 이 이슈·PR 의 방향(기본값 제거 = 엄격화)은 유지됩니다.
2. mindrecord DTO 가 참조 구현으로 남았습니다. #932 에 남은 범위는 "DTO 에 어느 엔드포인트의 응답인지 ·
그 판정 근거가 무엇인지 주석이 없다" 인데, 응답 DTO 15개 중 표기가 없는 8개에 mindrecord 는 한 건도 없습니다.
네 파일 전부 Swagger 스키마명 · 실측일 · 판단 근거까지 달려 있어서, #932 는 양식으로
DiaryDto.kt를 따르도록 적어 뒀습니다. 매퍼 배치도
data/mapper/표준 명명이라 정리 대상이 아니고요.#932 의 Sadturtleman 몫은 0건입니다.
OnlyReadOneBook commentedon Aug 23, 2026
#676 을 BE 실코드 대조로 재정의하면서 mindrecord 몫 16건이 나왔습니다. 이 이슈 범위와 같은 파일들입니다.
BE
Afternote-BE0fb9e0b의 응답 record 와 FE 와이어 키(@SerialName·@JsonNames반영)를 대조한 결과입니다.DiaryListDtoDiaryListResponseyearMonthDiaryListItemDtoDiaryResponseimageUrlemotionreceiversupdatedAtReceiverDiaryItemDtoDiaryResponseimageUrlemotionreceiversDailyQuestionListItemDtoDailyQuestionListResponseimageUrlreceiversReceiverDailyQuestionItemDtoDailyQuestionListResponseimageUrlisDraftreceiversTodayDailyQuestionDtoDailyQuestionTodayResponsereceiversWeeklyReportDtoWeeklyMindRecordResponsedeepThoughtAmountemotionAnalysis이미 판정됐거나 의도적인 항목이 섞여 있습니다 — 전부 고칠 대상이 아닙니다.
imageUrl유령 4건 —DiaryDto.ktKDoc 이 "SwaggerDiaryResponse에 없는 필드 — 서버가 주기 시작하면 쓰이고, 아니면 계속 null" 로 이미 의도를 밝혔습니다. fix(mindrecord): 데일리질문 이미지를 본문 img 로 저장한다 — 계약에 없는 imageUrl 제거 #954 가 데일리질문 쪽을 본문img로 옮기는 중이고요.deepThoughtAmount— 깊은 생각 기능이 FE 에서 제거됐으니(cb44232a) 안 받는 게 맞습니다.emotionAnalysis— feat(mindrecord): 감정 분석 하위 상태를 화면까지 전달한다 — 대기·실패를 0건으로 확정하지 않는다 #947 이 진행 중입니다.실제로 볼 만한 것은
receivers(5곳) ·yearMonth·emotion·updatedAt입니다.PR #933 본문의 실서버 실측표에도
GET /diary응답 키로yearMonth·receivers·emotion·updatedAt이,GET /daily-questions/today에receivers가 찍혀 있습니다 — 서버가 보내는데ignoreUnknownKeys로 조용히 버려지는 중입니다.이 PR 에서 기본값을 걷으며 어차피 필드별로 실서버를 확인하시니, 그때 누락 키도 같이 판정하시면 됩니다.
receivers를 실제로 화면에서 쓸지는 별개 제품 판단이라, 안 쓸 거면 "안 받는다" 로 결론 내고 KDoc 에 남겨 주시면 충분합니다.refactor(konsist): 해소된 예외 항목은 실패가 아니라 경고로 알린다
refactor(konsist): mindrecord 잔여 2건은 고치지 말고 목록에 등재한다
OnlyReadOneBook commentedon Aug 24, 2026
#933 이 26건을 해소했지만 잔여 2건이 남아 다시 엽니다.
DailyQuestionAnswerResponseDto.content·isDraft— #573 이 #933 뒤에 머지되며 들어온 보정형 기본값입니다.#972 가 들이는
ResponseDtoContractKonsistTest의KNOWN_COERCING_DEFAULTS에#789 — mindrecord (2건)으로등재해 뒀습니다.
계약은 확인해 뒀습니다 — BE
DailyQuestionAnswerResponserecord 에 두 키가 다 있고 JacksonNON_NULL설정이없어 키가 항상 나가며,
UserDailyQuestion.content컬럼이nullable = false·isDraft는 primitiveboolean이라 값도 항상 옵니다 (Afternote-BEmain0fb9e0b실코드).= ""·= false를 걷어내고 목록에서 두 줄을 빼면 닫힙니다.Merge origin/fix/722-write-interactions (#994·#1006 스택 전파)
Merge pull request #1156 from Afternote/refactor/789-response-dto-def…