Skip to content

fix(setting): 프로필 사진 변경이 통째로 미구현 — 플러스 배지 무동작·서버 이미지 미표시·profileImageUrl null 하드코딩 #1438

Closed

Description

@OnlyReadOneBook

작업 유형

bug — 버그·오동작

주 담당 모듈

setting — 설정

개요

프로필 수정 화면의 프로필 사진 영역이 완전한 정적 장식이다. 아바타와 "추가" 플러스 배지가 시안대로 그려져 있지만 어떤 탭에도 반응하지 않고, 저장 요청은 사진 필드를 항상 null 로 보낸다.

실측

ProfileEditScreen.kt:131-151. 134dp 아바타(ic_default_profile) 위에 48dp 자리의 플러스 배지(ic_plus, contentDescription = "추가")를 얹었는데:

  • clickable·onClick 이 없다. 배지는 Image 두 개를 겹친 Box 일 뿐이다.
  • 선택된 이미지 URI 를 담을 상태가 ProfileEditUiState.Success 에 없다(name·phone·email·isUpdating 뿐).
  • 아바타는 항상 로컬 기본 이미지를 그린다. 서버가 내려준 user.profileImageUrl 을 표시하지도 않는다.
  • ProfileEditViewModel.updateProfile:55 이 profileImageUrl = null 하드코딩이라, 설령 값이 생겨도 전송 경로가 없다.

즉 조회·선택·전송 세 축이 전부 비어 있고, 화면에는 "누르면 될 것 같은" 배지만 있다.

참고할 선례가 이미 있다

온보딩에 갤러리 피커 경로가 구현돼 있다(#1113·#1115 에서 취소 처리까지 고쳐진 흐름). 업로드는 presigned URL 방식이고 contentLength 필수 함정은 #950 에서 해소됐다. 서버 계약도 열려 있다. PATCH /users/me 의 profileImageUrl 은 S3 키를 받아 s3Service.promoteMediaKey("profiles", userId, key) 로 승격한다(Afternote-BE UserService.updateMyProfile).

작업 범위

완료 기준

  • 배지를 눌러 사진을 고르면 저장 후 프로필에 반영되고, 재진입 시 그 사진이 보인다.
  • 선택 취소가 기존 사진을 지우지 않는다.
  • 관련 unit test 추가.

자식 이슈

No response

참고

실기동 화면

에뮬레이터 Pixel 7(API 34) 실기동, QA823 계정, 실서버 afternote.kro.kr. 프로필 설정에서 플러스 배지를 눌렀을 때다. 현행은 탭 전후 프레임이 픽셀 단위로 같아 아무 일도 일어나지 않고, 구현분은 미디어 선택 시트가 열린다. 이메일 칸은 가렸다.

프로필 사진 배지 동작 전후

구조 선행

#2179 / PR #2180의 ProfileEdit MVI·UiState 신호 계약을 소비한다. 사진 선택·업로드는 그 위의 Intent와 reducer event로 추가하며, 기존 StateFlow·Channel 배선을 별도로 확장하지 않는다. 현재 PR #2152의 실제 base는 #2147이고 Nav3 entry에서 화면과 ViewModel 수명이 관리된다. 위 실기동 첨부의 선택 시트는 과거 닫힌 구현이며 현재 갤러리 경로의 검증 증거로 사용하지 않는다.

Activity

  1. github-actions commented on Aug 29, 2026

    @github-actions
    Contributor

    bug 이슈는 사이드바 Fields > Priority 로 심각도를 지정해야 합니다. 판정 기준:

    • Urgent: 치명 — 크래시·데이터 소실·보안 무력화·핵심 경로 차단·가짜 성공
    • High: 심각 — 실패·틀린 값의 정상 위장, 핵심 기능 무동작
    • Medium: 불편 — 우회로가 있는 오동작·틀린 표시, 핵심 흐름은 유지
    • Low: 경미 — 문구·정렬·마감 품질 흠, 기능 영향 없음

    등록 후 24시간이 지나도 비어 있으면 자동으로 닫습니다. 닫힌 뒤에는 값을 지정하고 다시 열어 주세요.

  2. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Sep 13, 2026
  3. github-actions commented on Sep 13, 2026

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #2044 다 (base handoff/1920-setting-1hyok).

    base 가 기본 브랜치(develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에
    아무것도 표시하지 않는다. 본문에 Closes #N 이 있어도 마찬가지다 — 그 링크는 기본 브랜치를
    target 하는 PR 에서만 만들어진다.

    PR 이 닫히거나 머지되면 이 이슈의 pr-open 라벨은 다음 리컨사일에서 떨어진다.

  4. 5 remaining items

  5. OnlyReadOneBook commented on Sep 23, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    blocked_by #1920 을 풀었습니다.

    이 관계는 닫힌 설정 사슬 스택(#1930 계열)에서 PR 순서를 표현하려고 걸었던 것이고, 기능상 선행이 아닙니다. 현재 설정 화면은 Nav2 라 SettingNavGraph 의 composable<SettingRoute.ProfileEditRoute> 가 진입할 때마다 ViewModel 을 새로 만들고 init 에서 프로필을 다시 조회합니다. 그래서 "재진입 시 그 사진이 보인다"는 완료 조건은 #1920 없이 충족됩니다.

    구현은 #2152 입니다(스택 #2123 → #2124 → #2128 → #2147 → #2152). #1920 이 나중에 재진입 갱신을 넣을 때는 이 화면의 저장 전 선택(selectedImageUri)을 조회 응답으로 지우지 않아야 합니다. #1920 완료 조건의 "저장하지 않은 입력·선택이 사라지지 않는다"와 같은 내용입니다.

  6. github-actions commented on Sep 27, 2026

    @github-actions
    Contributor

    이 이슈는 필수 메타데이터를 판정할 수 없어 자동으로 닫았습니다.

    • 작업 유형이 없거나 허용된 값이 아닙니다.
    • 주 담당 모듈이 없거나 허용된 값이 아닙니다.

    이슈 등록 양식에 맞게 본문을 보완한 뒤 다시 열어 주세요.

  7. removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Oct 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:setting설정 기능 영역bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions