Repository navigation
refactor(afternote): 현재 JSON 계약을 유지하며 FE 상세 모델 표현을 정리한다 #1958
Copy link
Copy link
Closed
Labels
area:afternote애프터노트 기능 영역애프터노트 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
Description
작업 유형
refactor — 동작 변경 없는 구조·책임·경계 개선
주 담당 모듈
afternote — 애프터노트
개요
현재 JSON 계약을 유지하는 FE 상세 모델의 명명·타입·도메인 표현 정리만 담당한다. BE #288의 계약 반영과 최종 통합 검증은 #1959로 분리했다. 이 이슈는 BE #288 또는 #1959의 완료를 기다리지 않고 독립적으로 착수·검증·완료할 수 있다.
서버 playlist에 붙인 FE memorial 이름과 상세 모델의 표현을 정리하되, 현재 서버 필드·중첩·종류별 미작성 허용 및 발행 필수값 계약을 유지한다. 아래 BE·FE 책임 판정은 완료된 근거로 보존한다.
판정 결과 — 2026-09-08
| 구분 | 확인된 코드 | 책임·결론 |
|---|---|---|
| 추억 노트의 전용 데이터 중첩 | BE는 playlist 객체 안에 songs·memorialPhotoUrl·memorialVideo·memorialAudioUrl 등을 둔다. | 중첩 구조의 출처는 BE다. JSON 구조를 바꾸는 작업은 BE 계약 변경이다. |
| 발행 추억 노트의 별도 응답 타입 | BE는 Draft / Published / PublishedPlaylist로 나누고, 발행 PLAYLIST에서는 playlist 및 최소 1곡을 검사한다. | 종류별 응답 타입이 비대칭인 것은 BE 설계다. 별도 타입에는 발행 필수값을 표현하는 실제 근거가 있다. |
| 다른 종류의 중첩 데이터 | SOCIAL·BUSINESS도 credentials 객체를 사용한다. | «추억 노트만 중첩 객체가 있다»는 최초 전제는 잘못됐다. 중첩 자체를 결함으로 취급하지 않는다. |
| FE의 memorial 이름 | AfternoteDetailDto는 @SerialName("playlist") val memorial: AfternotePlaylistDto?로 받는다. | 서버 JSON 키는 playlist이며 memorial이라는 프로퍼티 이름은 FE의 선택이다. 이름만 바꾸는 정리는 FE 책임이다. |
| FE의 단일 상세 DTO | FE develop의 AfternoteDetailDto는 category와 nullable credentials·memorial 등을 한 클래스에 둔다. | BE 응답 변형을 하나의 nullable DTO로 표현하는 것은 FE 선택이다. FE 타입 분리는 JSON 구조 변경 없이도 가능하다. |
| 도메인의 MemorialDetail 래퍼 | #1746이 DetailContent.Memorial의 래퍼 제거를 별도로 추적한다. | 도메인 표현 정리는 FE 책임이며, 서버 중첩 구조와 별개다. |
결론: 종류별 상세 응답의 구조를 일관되게 바꾸려는 개선은 BE 계약 설계가 중심이다. FE는 JSON 변경의 반영을 담당하고, FE 내부 이름·타입·도메인 래퍼는 독립적으로 정리할 수 있다. 현재 중첩이 있다는 사실만으로 런타임 결함이나 BE 버그가 입증된 것은 아니다.
위 결과는 아래 커밋의 응답 선언·생성 분기·직렬화 이름을 직접 대조한 것이다. 배포 서버의 응답을 호출해 검증한 결과는 아니다. 최초 중첩 도입자의 의도까지 확인했다는 뜻도 아니다.
이 이슈의 작업 범위
- 현재 JSON playlist, FE 종류명 Memorial, 곡·미디어 데이터 묶음의 의미를 구분해 DTO·매퍼·도메인에서 혼동되는 명명과 불필요한 래퍼를 정리한다.
- 현재 계약 안에서 종류별 데이터 조합과 소비처를 명확하게 표현한다. BE #288의 미래 JSON을 가정하지 않는다.
- #1746과 feat(afternote): 임시저장 조회·도메인·요청 payload 계약을 분리한다 #1762 / PR #1763의 최신 반영 상태를 확인하고, 이미 구현되거나 진행 중인 동일 범위를 중복 작업하지 않는다. 겹치는 변경을 필수 선행으로 만들지 않고 이 이슈의 잔여 범위를 좁힌다.
- 이 FE 변경에 대한 상세 매핑·에디터 프리필 회귀만 검증한다.
완료 조건
- BE·FE 책임과 현재 중첩 구조의 근거를 확인했다.
- BE 결과를 기다리는 계약 반영·통합 검증을 #1959로 옮겼다.
- 현재 계약을 보존하는 FE 내부 정리 중 기존 이슈와 중복되지 않는 잔여 범위를 확정하고 구현한다.
- 관련 상세 매핑·에디터 프리필 회귀와 적절한 컴파일·정적 검증이 통과한다. JSON 직렬화 이름·구조와 기존 종류별·상태별 동작이 유지됨을 확인한다.
- 중복 제외 후 잔여 변경이 없다면 해당 근거를 기록하고 이 이슈를 완료한다. BE build: 공용 debug keystore 도입 (신규 팀원 OAuth 동작 단순화) #288 및 #1959를 기다리지 않는다.
분리된 범위
- refactor(afternote): BE #288 확정 상세 계약과 FE 호환성을 확인한다 #1959: BE #288의 최종 계약 반영 및 통합 검증. 이슈의 실제 blocked_by를 BE #288에 설정한다.
- [refactor] 애프터노트 상세의 종류별 전용 데이터·필수값 계약을 일관되게 표현한다 Afternote-BE#288: 서버 상세 타입·OpenAPI 계약 개선.
- 이 두 이슈의 결과는 이 이슈의 완료 조건이 아니다. #1959는 관련 후속 이슈이며, 이 이슈를 전체 완료 추적용 부모로 두지 않는다.
참고
직접 확인한 코드:
- BE 상세 응답: Draft / Published / PublishedPlaylist 및 필수값 검증
- BE 발행 playlist 데이터
- FE 상세 DTO 및 playlist 직렬화 이름
관련: #1746(도메인 래퍼 제거), #1762 / PR #1763(임시저장·발행 상세), #1956(생성 payload sealed 모델링; 상세 응답과 별개).
BE 계약 반영 후속: #1959. 그 선행 구현은 Afternote/Afternote-BE#288이다.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:afternote애프터노트 기능 영역애프터노트 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
Activity
[-]refactor(afternote): 상세 memorial 중첩 구조의 근거와 BE·FE 수정 책임을 판정한다[/-][+]refactor(afternote): BE 상세 응답의 종류별 비대칭과 FE 표현을 책임별로 정리한다[/+][-]refactor(afternote): BE 상세 응답의 종류별 비대칭과 FE 표현을 책임별로 정리한다[/-][+]refactor(afternote): 현재 JSON 계약을 유지하며 FE 상세 모델 표현을 정리한다[/+]github-actions commentedon Sep 8, 2026
이 이슈를 맡은 PR 은 #1960 다 (base
refactor/1746-memorial-content-flatten).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.merge: #1958 상세 명명 정리 위에 임시저장 조회를 연결 (#1762)
merge: 최신 상세 모델 기반을 playlist 명명 정리에 반영 (#1958)
refactor(afternote): 상세 DTO의 playlist 이름을 서버 계약에 맞춘다 (#1958)