Skip to content

fix(mindrecord): 데일리질문 imageUrl 이 서버 계약에 없어 이미지 저장·조회 불가 — content HTML img 태그로 전환 #549

Closed

Description

@OnlyReadOneBook

📜 Overview (Required)

데일리질문의 imageUrl 이 서버 계약에 존재하지 않아, 첨부한 이미지가 저장되지도 조회되지도 않는다.

실서버 실측 (2026-07-28, QA 계정) — imageUrl 을 포함해 PATCH 를 보냈으나 응답에도 재조회에도 반영되지 않는다.

PATCH /api/v1/daily-questions/16  {"content":"…","isDraft":true,"imageUrl":"https://example.com/probe.png"}
→ 200 {"userDailyQuestionId":16,"content":"…","isDraft":true,"receivers":[]}

GET /api/v1/daily-questions?draftOnly=true
→ {"userDailyQuestionId":16,"title":"…","content":"…","createdAt":"2026.07.27 월","isDraft":true,"receivers":[]}

Swagger 전체에서 이미지 필드는 UserResponse.profileImageUrl·MusicSearchItemDto.albumImageUrl 뿐이고, 데일리질문·일기의 요청/응답 스키마 어디에도 imageUrl 이 없다. 대신 content 필드 설명에 본문 이미지 경로가 명시돼 있다.

본문 HTML 조각(UTF-8) … 허용 태그 예: h1~h3, p, div, em/i, u, s/del, strong/b, span, br, a[href], img[src|alt|width|height|style]

즉 서버 설계는 본문 이미지를 content HTML 의 img 태그로 담는 것이고, 별도 imageUrl 필드는 없다.

현재 클라 상태

  • DailyQuestionCreateRequestDto / DailyQuestionUpdateRequestDto 가 imageUrl 을 전송 → 서버가 무시
  • DailyQuestionListItemDto.imageUrl 로 응답을 읽음 → 항상 null
  • DailyQuestionWriteViewModel 의 uploadImage() 는 실제로 업로드까지 수행하고 KDoc 에 "첫 업로드 이미지는 등록 payload 의 imageUrl(목록 카드 썸네일) 로도 쓴다" 고 적혀 있으나, 그 URL 이 서버에 남지 않는다

결과적으로 작성 화면에서 이미지를 첨부해도 저장 후 사라지고, 목록 카드 썸네일도 뜨지 않는다.

수정 방향

업로드한 URL 을 content HTML 에 <img src="…"> 로 삽입하는 방식으로 전환한다. 목록 카드 썸네일이 필요하면 content 에서 첫 img[src] 를 추출하거나, 서버에 썸네일 필드 신설을 요청한다 (후자는 BE 협의 선행).

📌 Child Issue(Optional)

No response

📍 Note (Optional)

Activity

  1. OnlyReadOneBook commented on Aug 24, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    일기도 같은 구조임을 BE 실코드로 확정했다

    이 이슈 Note 의 «일기(DiaryCreateRequest)도 동일하게 imageUrl 이 없고 content 설명은 같다 — 같은 구조라면 함께 봐야 한다» 를 서버 코드로 확인했다. PR #1007 리뷰 중 대조한 결과다.

    로컬 BE 체크아웃 (main, 0fb9e0b):

    // diary/dto/DiaryCreateRequest.java
    public record DiaryCreateRequest(String title, String content, Boolean isDraft,
                                     TodayMood todayMood, List<Long> receiverIds) {}
    
    // diary/dto/DiaryUpdateRequest.java
    public record DiaryUpdateRequest(String title, String content, Boolean isDraft,
                                     TodayMood todayMood, List<Long> receiverIds) {}

    요청 양쪽 모두 imageUrl 이 없다 — 데일리질문과 같다. 여기까지는 이 이슈가 예고한 대로다.

    여기에 더해 서버가 받을 자리 자체가 없다는 것까지 확인됐다.

    // diary/model/Diary.java
    public void update(String title, String content, Boolean isDraft, TodayMood todayMood) { … }
    //                 ← imageUrl 파라미터 없음
    
    @Column(name = "image_url", length = 1000)
    private String imageUrl;        // 필드는 선언돼 있지만

    grep -rn "imageUrl" src/main/java | grep -i diary 결과가 위 선언 한 줄뿐이다 — BE 전체에서 Diary.imageUrl 에 값을 넣는 코드가 없다. DiaryService.createDiary·updateDiary 어느 쪽도 건드리지 않는다. 컬럼만 남은 상태다.

    응답 쪽도 같다 — DiaryResponse·DiaryListResponse 에 imageUrl 필드가 없다. 그래서 FE DiaryListItemDto.imageUrl 은 항상 null 이다.

    정리하면 일기 쪽 현재 상태

    상태
    DiaryCreateRequestDto.imageUrl 전송 서버가 받지 않음 (record 에 없음)
    DiaryUpdateRequestDto.imageUrl 전송 서버가 받지 않음
    Diary.imageUrl 컬럼 BE 전체에서 대입 0곳
    DiaryResponse / DiaryListResponse 필드 없음 → FE 는 항상 null

    데일리질문에 대해 이 이슈가 진단한 것과 완전히 같다. 수정 방향(«업로드한 URL 을 content HTML 에 <img src> 로 삽입, 썸네일이 필요하면 content 에서 첫 img[src] 추출») 도 그대로 적용된다 — content 필드 설명이 양쪽 다 같은 MindRecordHtmlSchema.CONTENT 를 쓰고 img[src|alt|width|height|style] 를 허용 태그로 명시한다.

    제안 — 별도 이슈로 떼지 않고 여기서 함께

    Note 가 이미 «같은 구조라면 함께 봐야 한다» 로 열어 둔 범위이고, 고치는 방식이 문자 그대로 같아서 두 이슈로 나누면 같은 판단을 두 번 하게 된다. 이 이슈 범위를 데일리질문 + 일기로 확정하는 편이 낫다고 본다. 담당도 같다.

    다르게 보는 지점이 있으면 말해 달라 — 그 경우 일기 몫만 후속 이슈로 떼겠다.

    관련

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