Skip to content

Conversation

@doyeonk429
Copy link
Member

@doyeonk429 doyeonk429 commented Oct 28, 2025

🔗 관련 이슈

📘 작업 유형

  • ✨ Feature (기능 추가)
  • 🐞 Bugfix (버그 수정)
  • 🔧 Refactor (코드 리팩토링)
  • ⚙️ Chore (환경 설정)
  • 📝 Docs (문서 작성 및 수정)
  • ✅ Test (기능 테스트)
  • 🎨 style (코드 스타일 수정)

📙 작업 내역

  • API 관련 data dto, view vo, domain entity 모두 review 항목 optional 가능하도록 수정하였습니다.
  • 기록 post, patch, get API 부분 view와 vm을 모두 수정하였습니다.
  • 감상평 조회 박스에서 감상평 유무에 다른 레이아웃 수정 처리를 하였습니다.

🧪 테스트 내역

  • 브라우저/기기에서 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

🎨 스크린샷 또는 시연 영상 (선택)

리뷰 있을 때 리뷰 없을 때
Simulator Screenshot - ReedDefaultSize - 2025-10-29 at 00 46 02 Simulator Screenshot - ReedDefaultSize - 2025-10-29 at 01 14 25

디테일 레이아웃 디버깅

AS-IS TO-BE
Simulator Screenshot - ReedDefaultSize - 2025-10-29 at 00 45 13 Simulator Screenshot - ReedDefaultSize - 2025-10-29 at 01 14 25
스크린샷 2025-10-29 오전 1 14 19

✅ PR 체크리스트

  • 커밋 메시지가 명확합니다
  • PR 제목이 컨벤션에 맞습니다
  • 관련 이슈 번호를 작성했습니다
  • 기능이 정상적으로 작동합니다
  • 불필요한 코드를 제거했습니다

💬 추가 설명 or 리뷰 포인트 (선택)

  • Data ~ View까지 전반적으로 손을 본 PR이라, 가능하시다면 구체적인 리뷰 부탁드립니다! 🙇

Summary by CodeRabbit

릴리스 노트

  • 개선 사항
    • 리뷰(감상) 입력을 선택사항으로 변경하여 리뷰 없이도 노트 생성·편집이 가능합니다.
    • 저장 동작을 완화해 빈 감상 문구가 있어도 저장할 수 있게 되었습니다.
    • 감상이 없을 경우 관련 UI를 자동으로 숨기고 레이아웃 간격을 조정해 표시를 깔끔하게 개선했습니다.

@doyeonk429 doyeonk429 self-assigned this Oct 28, 2025
@github-actions github-actions bot requested a review from clxxrlove October 28, 2025 16:23
@coderabbitai
Copy link

coderabbitai bot commented Oct 28, 2025

Walkthrough

감상평(review/appreciation) 필드를 DTO, 도메인(VO/Entity), ViewModel, View 전반에서 선택사항으로(String → String?) 변경하고, UI와 저장/조회 흐름에서 nil/빈값을 처리하도록 제어 흐름을 조정했습니다.

Changes

코호트 / 파일(s) 변경 요약
DTO 변경
src/Projects/BKData/Sources/DTO/Request/InsertRecordRequestDTO.swift, src/Projects/BKData/Sources/DTO/Response/DetailRecordResponseDTO.swift, src/Projects/BKData/Sources/DTO/Response/InsertRecordResponseDTO.swift
review 속성 타입을 StringString?로 변경하고, 초기화/디코딩 경로의 파라미터 및 할당을 Optional로 조정
도메인 / VO 변경
src/Projects/BKDomain/Sources/Entity/RecordInfo.swift, src/Projects/BKDomain/Sources/VO/RecordDetails/RecordVO.swift
review 프로퍼티 및 생성자 파라미터를 String?로 변경
Form ViewModel 변경
src/Projects/BKPresentation/Sources/MainFlow/Note/ViewModel/NoteForm.swift
appreciation 타입을 String?로 변경
NoteEdit ViewModel 액션 변경
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/ViewModel/NoteEditViewModel.swift
Action.saveButtonTapped 페이로드의 appreciationStringString?로 변경; 저장 검증에서 감상평 비어있음 체크 제거(문장만 필수)
NoteCompletion View 변경
src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift, src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/NoteCompletionView.swift
AppreciationResultView.apply 시그니처를 appreciation: String? = ""로 변경; 감상평 nil/빈 시 레이블 숨김 및 스택 간격 0 처리. NoteCompletionView는 호출 시 recordInfo.review ?? "" 사용
NoteEdit View 변경
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift
apply(recordInfo:)에서 recordInfo.review가 있을 때만 appreciationTextView에 설정하도록 변경

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant UI as Note Edit / Completion View
  participant VM as NoteEditViewModel
  participant DTO as InsertRecordRequest/Response DTOs
  participant API as Backend API

  rect rgba(200,230,255,0.4)
  note right of UI: 저장 요청 (감상평 선택사항)
  UI->>VM: saveButtonTapped(page, sentence, appreciation?)
  VM->>DTO: Create InsertRecordRequestDTO(review: appreciation?)
  DTO->>API: POST /records (review may be null)
  API-->>DTO: 201 / response (review may be null)
  DTO->>VM: toRecordInfo(review: String?)
  VM->>UI: update UI with RecordInfo (review nil or value)
  end

  rect rgba(230,255,220,0.4)
  note right of UI: 조회/완료 화면 렌더링
  UI->>DTO: fetch record
  DTO-->>UI: DetailRecordResponseDTO(review: String?)
  UI->>UI: AppreciationResultView.apply(emotion, date, appreciation: String? = "")
  note right of UI: if appreciation nil/empty -> hide label & spacing 0
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 추가 검토 포인트:
    • DTO ↔ Domain ↔ VO 변환 유닛(특히 toRecordInfo 등)에서 Optional 전파 누락 여부
    • NoteEditViewModel의 검증 완화로 인한 저장/에러 흐름 영향
    • AppreciationResultView 레이아웃 변경(레이블 숨김 및 spacing 0)으로 인한 UI 어긋남 여부
    • NoteCompletionView에서 recordInfo.review ?? "" 대체가 의도치 않은 빈 문자열 처리로 연결되는지 검증

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed 제목 "feat: 감상평 optional 관련 Side effect 작업"은 PR의 주요 변경사항을 명확하게 반영하고 있습니다. 전체 changeset의 핵심은 API DTOs, domain entities, view 계층에서 감상평(review/appreciation) 필드를 optional로 변경하고 이에 따른 모든 side effects를 처리하는 작업입니다. 제목이 이러한 핵심 목표를 간결하고 구체적으로 표현하고 있으며, 팀원이 커밋 히스토리를 훑어볼 때 변경사항의 의도를 쉽게 파악할 수 있습니다.
Linked Issues Check ✅ Passed linked issue #235의 모든 코딩 요구사항이 충족되었습니다. 감상평 없이 저장 가능하도록 InsertRecordRequestDTO를 optional로 변경하고 NoteEditViewModel의 non-empty 검증을 제거했습니다 [#235]. 감상평 없는 경우 조회 API 성공을 위해 DetailRecordResponseDTO를 optional로 변경했습니다 [#235]. 감상평 없는 경우 조회 화면 UI 처리를 위해 NoteCompletionView, NoteEditView, AppreciationResultView에서 nil/empty 상태에 대한 조건부 렌더링을 구현했습니다 [#235]. 감상평 수정 시 API 성공을 위해 AppreciationResultView의 메서드 시그니처를 optional 파라미터로 변경했습니다 [#235].
Out of Scope Changes Check ✅ Passed 모든 변경사항이 "감상평 필드를 optional로 만들고 이에 따른 side effects 처리"라는 PR의 명시된 목표와 직접 관련이 있습니다. API DTOs, domain entities, view models, UI 계층에서의 변경사항은 모두 optional review/appreciation을 지원하기 위한 필수적인 조정입니다. 무관한 기능 추가, 리팩토링, 또는 별도의 목표를 위한 변경사항은 발견되지 않습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch BOOK-379-feature/#235

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d668529 and 2854f10.

📒 Files selected for processing (2)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 163
File: src/Projects/BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift:7-9
Timestamp: 2025-08-08T16:13:31.712Z
Learning: Reed-iOS에서 서버 스펙 변경으로 DTO 필드명이 바뀔 때, doyeonk429는 코드 전반의 파라미터/시그니처 리네이밍까지 확장하지 않고, 실제 요청 직렬화 키가 맞는지(예: isbn13)만 보장하면 충분하다는 범위 최소화 방식을 선호한다. (PR: YAPP-Github/Reed-iOS#163, 파일: BKData/Sources/DTO/Request/UserBookRegisterRequestDTO.swift)
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/AuthFlow/View/LoginView.swift:43-45
Timestamp: 2025-08-08T01:39:15.620Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성 개선 작업을 별도의 전용 PR이나 이슈에서 일괄 처리하는 것을 선호한다. 개별 기능 구현 PR에서는 접근성 관련 제안을 하지 않고, 접근성 전담 작업에서 한번에 처리하는 방식을 원한다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 98
File: src/Projects/BKPresentation/Sources/AuthFlow/View/TermsView.swift:78-85
Timestamp: 2025-07-22T05:37:28.756Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 더미 데이터나 테스트 데이터의 구체적인 내용(예: URL 주소)에 대해서는 리뷰 시 지적하지 않기를 선호한다. 더미 데이터는 임시적이며 실제 기능 구현 시 교체될 예정이므로 URL의 구체적인 주소는 중요하지 않다고 본다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 157
File: src/Projects/BKPresentation/Sources/MainFlow/Home/View/HomeViewController.swift:19-24
Timestamp: 2025-08-08T01:38:59.656Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 접근성(accessibility) 관련 개선사항은 현재 작업 중인 PR에서 즉시 처리하지 않고, 접근성 전용 PR이나 이슈를 별도로 만들어 한번에 처리하는 것을 선호한다.
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 134
File: src/Projects/BKPresentation/Sources/MainFlow/Note/ViewModel/NoteViewModel.swift:66-74
Timestamp: 2025-08-01T20:35:39.806Z
Learning: clxxrlove는 NoteViewModel에서 UI 에러 처리를 추후 작업으로 계획하며, 현재 단계에서는 기본 기능 구현에 집중하는 것을 선호한다고 명시했다.
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 112
File: src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift:128-140
Timestamp: 2025-07-28T10:45:09.696Z
Learning: clxxrlove는 NoteView의 nextButtonTapped 메서드에서 폼 검증 실패 시 첫 번째 페이지로 되돌아가는 로직을 임시로 구현했으며, 추후 적절한 에러 처리 로직을 추가할 예정이라고 명시했다. 임시 화면 구현 단계에서는 기본 동작에 집중하고 에러 처리는 후속 작업으로 계획하는 것을 선호한다.
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 136
File: src/Projects/BKPresentation/Sources/MainFlow/Home/View/HomeViewController.swift:47-48
Timestamp: 2025-08-01T22:35:20.411Z
Learning: clxxrlove는 HomeViewController에서 didTapBook 케이스의 bookId 파라미터 활용을 API 구현 완료 후로 연기한다고 명시했다. API와 화면 연결 시점에 한번에 처리하는 것을 선호하는 개발 방식을 보여준다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 169
File: src/Projects/BKDomain/Sources/VO/SearchBookResult.swift:11-11
Timestamp: 2025-08-11T12:46:15.124Z
Learning: Reed-iOS 프로젝트에서 URL 타입 처리는 계층별로 다르게 접근한다: Entity 계층에서는 타입 안정성을 위해 URL 타입을 사용하고, VO/DTO 계층에서는 디코딩 안정성을 위해 String이나 URL? 타입을 사용하는 것이 안전하다. 이는 외부 데이터의 디코딩 실패를 방지하면서 도메인 모델의 타입 안정성을 유지하는 패턴이다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 68
File: src/Projects/BKDesign/PreviewApp/Sources/View/BKButtonTestViewController.swift:124-133
Timestamp: 2025-07-10T08:21:49.399Z
Learning: doyeonk429는 테스트 전용으로만 사용되는 extension이나 코드는 해당 테스트 파일에 그대로 두는 것을 선호합니다. 실제 프로덕션 코드에서 사용되지 않는 테스트 전용 코드는 별도 파일로 분리하지 않고 테스트 파일 내에 유지하는 것이 그들의 코드 구성 방식입니다.
Learnt from: doyeonk429
Repo: YAPP-Github/Reed-iOS PR: 138
File: src/Projects/BKDesign/Resources/Assets.xcassets/icons/home.imageset/Contents.json:4-14
Timestamp: 2025-08-04T15:20:43.982Z
Learning: doyeonk429는 Reed-iOS 프로젝트에서 에셋 파일명이 영어가 아닌 경우(한글, 일본어 등)에는 경고를 받고 싶어하지만, 영어 파일명의 네이밍 컨벤션(예: home.png vs home1.png)은 기능적으로 문제없다면 신경쓰지 않는 것을 선호한다.
📚 Learning: 2025-08-26T07:08:40.739Z
Learnt from: clxxrlove
Repo: YAPP-Github/Reed-iOS PR: 203
File: src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift:102-110
Timestamp: 2025-08-26T07:08:40.739Z
Learning: In the Reed-iOS codebase, BKTextView's startEditing functionality is automatically triggered through ViewModel reactive bindings (likely via Combine), so manual focus calls after appendText are not needed as the focus is handled by the viewmodel layer.

Applied to files:

  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift
🔇 Additional comments (1)
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1)

252-254: 옵셔널 처리가 올바르게 구현되었습니다.

recordInfo.review를 옵셔널로 처리하여, 감상평이 존재할 때만 텍스트를 설정하는 로직이 정확합니다. PR 목표와 일치합니다.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/Projects/BKPresentation/Sources/MainFlow/Note/ViewModel/NoteForm.swift (1)

31-36: 감상평이 없을 때 NoteForm 생성 실패 문제

appreciation을 optional로 변경했지만, guard 문에서 여전히 finalAppreciation을 require하고 있습니다. 이로 인해 감상평이 없는 경우 makeNoteForm이 nil을 반환하여 기록 저장이 불가능합니다.

다음과 같이 수정하세요:

 guard let finalPage = page,
       let finalSentence = sentence,
-      let finalEmotion = emotion,
-      let finalAppreciation = appreciation else {
+      let finalEmotion = emotion else {
     return nil
 }

 return NoteForm(
     page: finalPage,
     sentence: finalSentence,
     emotion: finalEmotion,
-    appreciation: finalAppreciation
+    appreciation: appreciation
 )
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1)

273-281: appreciation 타입을 String?로 변경하고 빈 값에 nil 반환

getCurrentFormData()의 반환 타입이 NoteEditViewModel의 expectation과 일치하지 않습니다.

발견된 문제:

  • View 반환: appreciation: String (비옵셔널)
  • ViewModel 예상: appreciation: String? (옵셔널) — NoteEditViewModel.swift 26번 줄

필요한 수정:

func getCurrentFormData() -> (page: Int?, sentence: String, appreciation: String?) {
    let pageText = pageField.text.trimmingCharacters(in: .whitespacesAndNewlines)
    let sentenceText = sentenceTextView.text.trimmingCharacters(in: .whitespacesAndNewlines)
    let appreciationText = appreciationTextView.text.trimmingCharacters(in: .whitespacesAndNewlines)
    
    let page = pageText.isEmpty ? nil : Int(pageText)
    let appreciation = appreciationText.isEmpty ? nil : appreciationText
    
    return (page: page, sentence: sentenceText, appreciation: appreciation)
}

page 필드와 동일하게, 빈 appreciation은 nil로 반환해야 합니다.

🧹 Nitpick comments (3)
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1)

252-256: 불필요한 else 블록 제거

빈 else 블록은 불필요합니다. optional binding만으로 충분합니다.

다음과 같이 간소화하세요:

-
-if let review = recordInfo.review {
+if let review = recordInfo.review {
     appreciationTextView.setText(review)
-} else {
-    
 }
src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/NoteCompletionView.swift (1)

46-50: nil-coalescing 대신 optional 직접 전달 고려

recordInfo.review ?? ""로 빈 문자열을 전달하는 대신, AppreciationResultView.apply가 optional을 직접 받도록 하는 것이 더 명확할 수 있습니다. 빈 문자열과 nil을 구분하여 UI를 다르게 렌더링해야 할 수 있습니다.

AppreciationResultView.apply의 시그니처를 확인하고, appreciation 파라미터가 optional을 받을 수 있다면 다음과 같이 수정을 고려하세요:

 appreciationResultView.apply(
     emotion: EmotionIcon.from(emotion: recordInfo.emotionTags.first ?? .joy),
     creationDate: recordInfo.createdAt,
-    appreciation: recordInfo.review ?? ""
+    appreciation: recordInfo.review
 )
src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift (1)

142-142: 기본 파라미터 값이 혼란스러울 수 있습니다.

옵셔널 타입에 빈 문자열("")을 기본값으로 설정하는 것은 API 의도를 불명확하게 만듭니다. 호출자가 명시적으로 nil 또는 실제 값을 전달하도록 기본값을 제거하는 것을 권장합니다.

     func apply(
         emotion: EmotionIcon,
         creationDate: Date,
-        appreciation: String? = ""
+        appreciation: String?
     ) {
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5838da7 and 6481c0d.

📒 Files selected for processing (10)
  • src/Projects/BKData/Sources/DTO/Request/InsertRecordRequestDTO.swift (1 hunks)
  • src/Projects/BKData/Sources/DTO/Response/DetailRecordResponseDTO.swift (1 hunks)
  • src/Projects/BKData/Sources/DTO/Response/InsertRecordResponseDTO.swift (1 hunks)
  • src/Projects/BKDomain/Sources/Entity/RecordInfo.swift (2 hunks)
  • src/Projects/BKDomain/Sources/VO/RecordDetails/RecordVO.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/Note/ViewModel/NoteForm.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift (2 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/NoteCompletionView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1 hunks)
  • src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/ViewModel/NoteEditViewModel.swift (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/ViewModel/NoteEditViewModel.swift (1)
src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift (1)
  • saveButtonTapped (130-132)
src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift (1)
src/Projects/BKPresentation/Sources/Common/Extension/Date+.swift (1)
  • toKoreanDateString (14-16)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (7)
src/Projects/BKData/Sources/DTO/Response/InsertRecordResponseDTO.swift (1)

11-11: LGTM!

review 필드를 optional로 변경한 것이 적절합니다. Decodable 프로토콜은 자동으로 nil 값을 처리합니다.

src/Projects/BKDomain/Sources/VO/RecordDetails/RecordVO.swift (1)

8-8: LGTM!

RecordVOreview 필드와 이니셜라이저 파라미터를 optional로 일관되게 변경했습니다.

Also applies to: 14-14

src/Projects/BKDomain/Sources/Entity/RecordInfo.swift (1)

10-10: LGTM!

도메인 엔티티의 review 필드를 optional로 변경한 것이 적절합니다. DecodableEquatable 프로토콜 모두 optional 값을 올바르게 처리합니다.

Also applies to: 24-24

src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/ViewModel/NoteEditViewModel.swift (1)

95-110: 감상평 optional 처리 로직 확인

ViewModel에서 appreciation을 optional로 처리하는 것은 올바르지만, NoteForm 생성 로직이 이를 올바르게 처리하는지 확인해야 합니다. NoteForm.makeNoteForm에서 appreciation이 nil일 때도 성공적으로 생성되어야 합니다.

NoteForm.swiftmakeNoteForm 메서드에서 guard 문이 optional appreciation을 올바르게 처리하는지 확인하세요.

src/Projects/BKData/Sources/DTO/Response/DetailRecordResponseDTO.swift (1)

11-11: LGTM!

응답 DTO의 review 필드를 optional로 변경하여 API에서 nil 값을 받을 수 있도록 했습니다.

src/Projects/BKData/Sources/DTO/Request/InsertRecordRequestDTO.swift (1)

6-32: 변경사항이 올바르게 적용되었습니다.

review 필드를 옵셔널로 변경한 것이 일관성 있게 적용되었습니다. 프로퍼티 선언, 생성자 파라미터, 그리고 RecordVO로부터의 초기화 로직이 모두 정확합니다.

src/Projects/BKPresentation/Sources/MainFlow/NoteCompletion/View/AppreciationResultView.swift (1)

47-53: lazy var로의 변경이 적절합니다.

rootStacklazy var로 변경한 것은 spacing과 arranged subviews를 동적으로 변경하기 위해 필요한 수정입니다.

@doyeonk429 doyeonk429 merged commit 4704c87 into develop Oct 31, 2025
3 checks passed
@doyeonk429 doyeonk429 deleted the BOOK-379-feature/#235 branch October 31, 2025 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BOOK-379/feat] 감상평 없을 때 API Success 체크

3 participants