Skip to content

Conversation

@doyeonk429
Copy link
Contributor

๐Ÿš€ PR ๊ฐœ์š”

์ „์ฒด ๋ฆฌ๋ทฐ ํ™”๋ฉด ๋ฆฌ๋””์ž์ธ UI ์ ์šฉ ๋ฐ ๋นˆํ‹ฐ์ง€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

๐Ÿ’ก PR ์œ ํ˜•

  • โœจ Feature (๊ธฐ๋Šฅ ์ถ”๊ฐ€)
  • ๐Ÿž Bugfix (๋ฒ„๊ทธ ์ˆ˜์ •)
  • ๐Ÿ”ฅ Hotfix (๊ธด๊ธ‰ ์ˆ˜์ •)
  • ๐Ÿ”ง Refactor (์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง)
  • โš™๏ธ Chore (ํ™˜๊ฒฝ ์„ค์ •)
  • ๐Ÿ“ Docs (๋ฌธ์„œ ์ž‘์„ฑ ๋ฐ ์ˆ˜์ •)

โœ๏ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ

  • ex) ๋กœ๊ทธ์ธ API ์—ฐ๊ฒฐ
  • ๋“œ๋กญ๋‹ค์šด UI ์ˆ˜์ •
  • ์ „์ฒด๋ฆฌ๋ทฐ ์ƒ๋‹จ ์˜์—ญ UI ๋ฐ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •
  • ๋นˆํ‹ฐ์ง€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  • ์ƒ๋ช…์ฃผ๊ธฐ ์กฐ์ •

๐Ÿ”— ๊ด€๋ จ ์ด์Šˆ

๐Ÿงช ํ…Œ์ŠคํŠธ ๋‚ด์—ญ

  • ๋ธŒ๋ผ์šฐ์ €/๊ธฐ๊ธฐ์—์„œ ๋™์ž‘ ํ™•์ธ
  • ์—ฃ์ง€ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  • ๊ธฐ์กด ๊ธฐ๋Šฅ ์˜ํ–ฅ ์—†์Œ

๐ŸŽจ ์Šคํฌ๋ฆฐ์ƒท ๋˜๋Š” ์‹œ์—ฐ ์˜์ƒ (์„ ํƒ)

Simulator Screenshot - iPhone 16 - 2025-08-31 at 02 08 38 Simulator Screenshot - iPhone 16 - 2025-08-31 at 02 08 44

โœ… PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค
  • Merge ๋Œ€์ƒ Branch๊ฐ€ develop์ž…๋‹ˆ๋‹ค
  • PR ์ œ๋ชฉ์ด ์ปจ๋ฒค์…˜์— ๋งž์Šต๋‹ˆ๋‹ค
  • ๊ด€๋ จ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค
  • ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
  • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค

๐Ÿ’ฌ ์ถ”๊ฐ€ ์„ค๋ช… or ๋ฆฌ๋ทฐ ํฌ์ธํŠธ (์„ ํƒ)

๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ค‘์ ์ ์œผ๋กœ ๋ด์•ผ ํ•  ๋ถ€๋ถ„์ด๋‚˜ ์„ค๋ช…์ด ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

@doyeonk429 doyeonk429 self-assigned this Aug 30, 2025
@doyeonk429
Copy link
Contributor Author

@CodeRabbit review

@coderabbitai
Copy link

coderabbitai bot commented Aug 30, 2025

โœ… Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link

coderabbitai bot commented Aug 30, 2025

๐Ÿ“ Walkthrough

Summary by CodeRabbit

  • ์‹ ๊ธฐ๋Šฅ

    • ์ œ๋ชฉ ์ปดํฌ๋„ŒํŠธ์— ์ œ๋ชฉ/๋ถ€์ œ ์ƒ‰์ƒ ์„ค์ • ๊ธฐ๋Šฅ ์ถ”๊ฐ€.
    • ๋ฆฌ๋ทฐ ํ™”๋ฉด ์ œ๋ชฉ์— ๋นˆํ‹ฐ์ง€ ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•จ๊ป˜ ํ‘œ์‹œ.
    • ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋’ค๋กœ๊ฐ€๊ธฐ ๋™์ž‘์„ ๋ฒ„ํŠผ ์•ก์…˜์œผ๋กœ ๋ช…ํ™•ํžˆ ์ง€์›.
  • ์Šคํƒ€์ผ

    • ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ์‹œ๊ฐ ๊ฐœ์„ : ๋ชจ์„œ๋ฆฌ, ๊ทธ๋ฆผ์ž, ์ •๋ ฌ/์—ฌ๋ฐฑ ์กฐ์ •์œผ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ.
    • ๋ฆฌ๋ทฐ ๋ชฉ๋ก ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ ๋ฐ ์Šคํฌ๋กค ์ธ๋””์ผ€์ดํ„ฐ ์„ค์ • ์กฐ์ •.
    • ๋ฆฌ๋ทฐ ์…€ ํ‰์  ํ‘œ์‹œ๋ฅผ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ์‹œ์Šคํ…œ์œผ๋กœ ํ†ต์ผํ•ด ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ์ผ๊ด€์„ฑ ๊ฐ•ํ™”.
    • ์ œ๋ชฉ/์ปจํ…์ธ  ์—ฌ๋ฐฑ๊ณผ ์ •๋ ฌ์„ ๋‹ค๋“ฌ์–ด ์ „๋ฐ˜์  ํ™”๋ฉด ๊ท ํ˜• ๊ฐœ์„ .

Summary by CodeRabbit

  • New Features
    • ์ œ๋ชฉ/๋ถ€์ œ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋กœ ํ™”๋ฉด ํ…Œ๋งˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ง€์›
    • ๋ฆฌ๋ทฐ ํ™”๋ฉด์— ๋นˆํ‹ฐ์ง€ ํ‘œ๊ธฐ ๋ฐ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์•ก์…˜ ์ถ”๊ฐ€
  • Improvements
    • ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๋ชจ์„œ๋ฆฌ, ๊ทธ๋ฆผ์ž, ๊ฐ„๊ฒฉ, ๊ธ€๊ผด/์ •๋ ฌ ์กฐ์ •์œผ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
    • ๋ฆฌ๋ทฐ ๋ชฉ๋ก ์˜์—ญ ์—ฌ๋ฐฑยท๊ฐ„๊ฒฉ ์žฌ์กฐ์ • ๋ฐ ์Šคํฌ๋กค ์ธ๋””์ผ€์ดํ„ฐ ์„ค์ • ์ตœ์ ํ™”
    • ๋ฆฌ๋ทฐ ํ™”๋ฉด ํƒ€์ดํ‹€ ์Šคํƒ€์ผยท๋ฐฐ์น˜ ๊ฐœ์„  ๋ฐ ์ดˆ๊ธฐ ๋กœ๋”ฉ ํƒ€์ด๋ฐ ์กฐ์ •์œผ๋กœ ํ‘œ์‹œ ๊ฒฝํ—˜ ํ–ฅ์ƒ

Walkthrough

๋“œ๋กญ๋‹ค์šด๊ณผ ์ผ๋ถ€ ํƒ€์ดํ‹€/์ปฌ๋ ‰์…˜๋ทฐ ๋ ˆ์ด์•„์›ƒ ๋ฐ ์‹œ๊ฐ ์Šคํƒ€์ผ์ด ๋ณ€๊ฒฝ๋˜๊ณ , Title*View์— ์ปฌ๋Ÿฌ ์„ค์ • API๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ EntireReviewViewController์— vintage ํ•„๋“œ ๋ฐ API ํ˜ธ์ถœ ํƒ€์ด๋ฐ(โ†’viewDidAppear)๊ณผ ๋’ค๋กœ๊ฐ€๊ธฐ ์•ก์…˜์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Changes

Cohort / File(s) Summary
Dropdown UI ์Šคํƒ€์ผ ์กฐ์ •
DE/DE/Sources/Core/CommonUI/View/CustomDropdownView.swift
cornerRadius, shadowColor, shadowOffset, shadowRadius ๋ณ€๊ฒฝ; ๋ฉ”๋‰ด ์ˆ˜ํ‰ ์ œ์•ฝ โ†’ trailing ๊ณ ์ •; ์˜ต์…˜ ๋ผ๋ฒจ ํฐํŠธ .semiBold(12)๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ขŒ/์šฐ inset(12)์œผ๋กœ ์ •๋ ฌ.
ํƒ€์ดํ‹€ ์ปฌ๋Ÿฌ ์„ค์ • API ์ถ”๊ฐ€
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift, DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift
public ๋ฉ”์„œ๋“œ setTitleColor(_:), setSubTitleColor(_:) ์ถ”๊ฐ€(๊ธฐ๋ณธ AppColor.black).
EntireReviewView ๋ ˆ์ด์•„์›ƒ ๋ฏธ์„ธ์กฐ์ •
DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift
์ปฌ๋ ‰์…˜๋ทฐ ์Šคํฌ๋กค ์ธ๋””์ผ€์ดํ„ฐ ์„ค์ • ๋ณ€๊ฒฝ, addSubviews ์‚ฌ์šฉ์œผ๋กœ ์„œ๋ธŒ๋ทฐ ์ถ”๊ฐ€ ๋ฐฉ์‹ ํ†ต์ผ, ํƒ€์ดํ‹€ leading inset 24๋กœ ๋ณ€๊ฒฝ, ์ปฌ๋ ‰์…˜๋ทฐ top 16์œผ๋กœ ์กฐ์ •.
EntireReviewViewController ํ๋ฆ„ยท์Šคํƒ€์ผ ๋ณ€๊ฒฝ
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift
var vintage: Int? ์ถ”๊ฐ€; title ๋ผ๋ฒจ ํ…์ŠคํŠธ์— vintage ํฌํ•จ ๋กœ์ง; largeTitleLabel ์ดˆ๊ธฐํ™” ๋ฐฉ์‹ ๋ณ€๊ฒฝ; back ๋ฒ„ํŠผ ์•ก์…˜ prevVC() ์ถ”๊ฐ€; API ํ˜ธ์ถœ์„ viewDidAppear๋กœ ์ด๋™ ๋ฐ callEntireReviewAPI(... vintage:)์— vintage ์ „๋‹ฌ; ๋ธ”๋กœํ‚น ๋ทฐ ํ‘œ์‹œ/ํ•ด์ œ ์œ„์น˜ ์กฐ์ •.
๋ฆฌ๋ทฐ ์…€ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ์ด๋™
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift
score UILabel ์ดˆ๊ธฐ ์Šคํƒ€์ผ ์ œ๊ฑฐ โ†’ AppTextStyle ์ ์šฉ ๋ฐฉ์‹์œผ๋กœ ํ…์ŠคํŠธ/์ƒ‰์ƒ ์ ์šฉ ๋ณ€๊ฒฝ.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User as ์‚ฌ์šฉ์ž
  participant VC as EntireReviewViewController
  participant API as ReviewService

  Note over VC: ํ™”๋ฉด ํ‘œ์‹œ (viewDidAppear)
  VC->>VC: showBlockingView()
  VC->>API: callEntireReviewAPI(wineId, sortType, page, vintage?)
  alt ์„ฑ๊ณต
    API-->>VC: reviews
    VC->>VC: update UI (collectionView reload ๋“ฑ)
    VC->>VC: hideBlockingView()
  else ์‹คํŒจ
    API-->>VC: error
    VC->>VC: hideBlockingView()
    VC->>VC: errorHandler.report(error)
  end

  Note over VC,User: ๋’ค๋กœ๊ฐ€๊ธฐ ์ฒ˜๋ฆฌ
  User->>VC: back ๋ฒ„ํŠผ ํƒญ
  VC->>VC: prevVC() โ†’ navigationController.popViewController(animated:)
Loading

Estimated code review effort

๐ŸŽฏ 4 (Complex) | โฑ๏ธ ~45 minutes

Assessment against linked issues

Objective Addressed Explanation
์™€์ธ ์ด๋ฆ„ ๋ผ๋ฒจ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ [#170] โœ…

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
API ํ˜ธ์ถœ ์‹œ์ ์„ viewDidAppear๋กœ ์ด๋™ ๋ฐ ๋ธ”๋กœํ‚น ๋ทฐ ํ๋ฆ„ ์žฌ์กฐ์ • (.../EntireReviewViewController.swift) ์ด์Šˆ #170์€ ๋ผ๋ฒจ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์— ์ดˆ์ , ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ ํƒ€์ด๋ฐ ๋ณ€๊ฒฝ์€ ๋ช…์‹œ์  ๋ชฉํ‘œ๊ฐ€ ์•„๋‹˜.
๋’ค๋กœ๊ฐ€๊ธฐ ์•ก์…˜(prevVC) ์ถ”๊ฐ€ ๋ฐ navigation ์ฒ˜๋ฆฌ (.../EntireReviewViewController.swift) ๋””์ž์ธ ์ด์Šˆ์˜ ๋ฒ”์œ„(๋ผ๋ฒจ/์…€ UI)์™€ ์ง์ ‘ ์—ฐ๊ด€๋˜์ง€ ์•Š์Œ.
๋“œ๋กญ๋‹ค์šด ์„€๋„์šฐยท์ œ์•ฝยทํฐํŠธ ๋ณ€๊ฒฝ (.../CustomDropdownView.swift) ์ด์Šˆ #170์— ๋“œ๋กญ๋‹ค์šด ๊ด€๋ จ ์š”๊ตฌ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Œ.

Possibly related PRs

Suggested reviewers

  • yeseonglee
  • dlguszoo

Poem

ํ•œ ์ž”์˜ ๋นˆํ‹ฐ์ง€, ๋ผ๋ฒจ์— ์‚ดํฌ์‹œ ๋”ํ•ด์ง€๊ณ  ๐Ÿท
๋“œ๋กญ๋‹ค์šด์€ ๋ชจ์„œ๋ฆฌ๋งŒ ์‚ด์ง ๋‹ค๋“ฌ๊ณ , ๊ทธ๋ฆผ์ž๋„ ๋‚ฎ์ถฐ์„œ
๋’ค๋กœ๊ฐ€๊ธฐ๋กœ ํ•œ ๋ฐœ ๋ฌผ๋Ÿฌ์„œ๋ฉด ๋กœ๋”ฉ์ด ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ ธ์š”
์ƒ‰์„ ๊ณ ๋ฅด๋Š” ์ž‘์€ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋กœ ํฐํŠธ๊ฐ€ ์›ƒ๊ณ 
ํ™”๋ฉด์ด ํ•œ๊ฒฐ ์ฐจ๋ถ„ํ•ด์ง„ ๋ฐค, ๋ฆฌ๋ทฐ๊ฐ€ ์†์‚ญ์ž…๋‹ˆ๋‹ค.

โœจ Finishing Touches
  • ๐Ÿ“ Generate Docstrings
๐Ÿงช Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch design/issue-170

๐Ÿชง Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@doyeonk429
Copy link
Contributor Author

@CodeRabbit review plz

@coderabbitai
Copy link

coderabbitai bot commented Aug 30, 2025

@doyeonk429 ๋„ค, PR #177์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฆฌ๋ทฐ ํ™”๋ฉด ๋ฆฌ๋””์ž์ธ ๋ฐ ๋นˆํ‹ฐ์ง€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์ž‘์—…์„ ๊ฒ€ํ† ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿง  Learnings used
Learnt from: doyeonk429
PR: Drink-Easy/DE_iOS#0
File: :0-0
Timestamp: 2025-08-30T13:14:55.580Z
Learning: ์‚ฌ์šฉ์ž doyeonk429๋Š” ํ•œ๊ตญ์–ด๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ธฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
โœ… Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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: 3

Caution

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

โš ๏ธ Outside diff range comments (1)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (1)

121-127: vintage ํŒŒ๋ผ๋ฏธํ„ฐ ๋ˆ„๋ฝ + UI ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ณด์žฅ(์˜ต์…˜ ์„ ํƒ ์‹œ)

API ํ˜ธ์ถœ์—๋„ vintage ์ „๋‹ฌ์ด ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. UI ๋ณ€๊ฒฝ์€ MainActor์—์„œ ์ฒ˜๋ฆฌํ•˜์„ธ์š”.

์˜ˆ์‹œ diff:

- try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: 0)
+ try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: 0, vintage: self.vintage)
  DispatchQueue.main.async {
    self.entireReviewView.reviewCollectionView.setContentOffset(.zero, animated: true)
  }
- self.view.hideBlockingView()
+ await MainActor.run { self.view.hideBlockingView() }
๐Ÿงน Nitpick comments (13)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)

59-66: ๋„ค์ด๋ฐ ์ผ๊ด€์„ฑ(nit): SubTitle โ†’ Subtitle

ํŒ€ ๋‚ด ์ปจ๋ฒค์…˜์ด ์—†๋‹ค๋ฉด subtitle์„ ํ•œ ๋‹จ์–ด๋กœ ํ†ต์ผํ•˜๋Š” ๊ฑธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํŒŒ์ผ๊ณผ TitleWithoutBarView ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜์˜ ํ•„์š”.

DE/DE/Sources/Core/CommonUI/View/CustomDropdownView.swift (3)

76-80: ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์˜ ํญ/๋†’์ด ์ œ์•ฝ ๋ณด๊ฐ• ํ•„์š”

ํ˜„์žฌ trailing๋งŒ ๊ณ ์ •๋˜๊ณ  ํญ ์ œ์•ฝ์ด ์—†์–ด ์ฝ˜ํ…์ธ  ๊ธธ์ด์— ๋”ฐ๋ผ ๋ฉ”๋‰ด ํญ์ด ๋“ค์ญ‰๋‚ ์ญ‰ํ•˜๊ฑฐ๋‚˜ ํ™”๋ฉด์„ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์ด ๋งŽ์„ ๋•Œ ๊ณ ์ • ๋†’์ด(35*count)๋กœ ํ™”๋ฉด์„ ์ดˆ๊ณผํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ๋ฒ„ํŠผ ํญ ์ด์ƒ, ํ™”๋ฉด ๋น„์œจ ์ดํ•˜๋กœ ์ œํ•œํ•ด ์ฃผ์„ธ์š”.

์˜ˆ์‹œ diff:

 dropdownMenu.snp.makeConstraints {
   $0.top.equalTo(dropdownButton.snp.bottom).offset(8)
   $0.trailing.equalTo(dropdownButton.snp.trailing).inset(16)
-  $0.height.equalTo(35 * options.count)
+  $0.width.greaterThanOrEqualTo(dropdownButton.snp.width)
+  $0.height.equalTo(35 * options.count)
+  $0.height.lessThanOrEqualTo(UIScreen.main.bounds.height * 0.4)
 }
 
 // ๊ฐ ์˜ต์…˜ ๋ผ๋ฒจ ์ œ์•ฝ์€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค

Also applies to: 97-99


67-71: ๋””์ž์ธ ํ† ํฐ ์‚ฌ์šฉ ๊ถŒ์žฅ(nit): shadowColor ํ•˜๋“œ์ฝ”๋”ฉ

UIColor(hex: "111111") ๋Œ€์‹  DesignSystem์˜ ์ปฌ๋Ÿฌ ํ† ํฐ(AppColor ํ˜น์€ shadow ์ „์šฉ ํ† ํฐ)์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. hex ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ๊ทธ๋ฆผ์ž๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ ๋„ ๊ฐ์•ˆ.


110-125: ์™ธ๋ถ€ ํ„ฐ์น˜๋กœ ๋‹ซ๊ธฐ UX(์˜ต์…˜)

ํ˜„์žฌ๋Š” ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ์•ผ ๋‹ซํž™๋‹ˆ๋‹ค. ๋ฐ”๊นฅ ์˜์—ญ ํƒญ ์‹œ ๋‹ซํžˆ๋„๋ก ์˜ค๋ฒ„๋ ˆ์ด(ํˆฌ๋ช… ๋ทฐ)๋‚˜ window ๋ ˆ๋ฒจ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ๋ถ€๋ชจ๊ฐ€ clipsToBounds = true์ธ ๊ฒฝ์šฐ๋„ ๋Œ€๋น„๋ฉ๋‹ˆ๋‹ค.

DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)

41-48: ๋„ค์ด๋ฐ ์ผ๊ด€์„ฑ(nit): SubTitle โ†’ Subtitle

๋™์ผํ•˜๊ฒŒ subtitle๋กœ ํ†ต์ผ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (8)

17-18: ๋ถˆํ•„์š”ํ•œ nil ์ดˆ๊ธฐํ™” ์ œ๊ฑฐ(nit)

์˜ต์…”๋„์€ ๊ธฐ๋ณธ๊ฐ’์ด nil์ด๋ผ = nil์„ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์ ์šฉ diff:

-var vintage: Int? = nil
+var vintage: Int?

106-114: ๋“œ๋กญ๋‹ค์šด ํƒญ ๋กœ๊น… ์œ„์น˜ ์กฐ์ •(nit)

setupDropdownAction() ์ง„์ž… ์‹œ์ ์— ๋กœ๊น…๋˜์–ด ์‹ค์ œ ํƒญ ์ด๋ฒคํŠธ์™€ ์‹œ์ ์ด ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์ด ์„ ํƒ๋  ๋•Œ(ํ˜น์€ ๋ฒ„ํŠผ ํ† ๊ธ€ ์‹œ) ๋กœ๊น…ํ•˜์„ธ์š”.

์˜ˆ์‹œ diff:

- logButtonClick(screenName: screenName, buttonName: Tracking.ButtonEvent.dropdownBtnTapped, fileName: #file)
 entireReviewView.dropdownView.onOptionSelected = { [weak self] selectedOption in
   guard let self = self else { return }
+  self.logButtonClick(screenName: self.screenName, buttonName: Tracking.ButtonEvent.dropdownBtnTapped, fileName: #file)
   if selectedOption == "์ตœ์‹  ์ˆœ" {

100-102: safeArea ์ •๋ ฌ ๊ถŒ์žฅ(์˜ต์…˜)

๊ฐ€๋กœ ์—์ง€ ์ œ์•ฝ์€ safeArea ๊ธฐ์ค€์ด ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ iPad, ๊ฐ€๋กœ๋ชจ๋“œ).

- $0.horizontalEdges.equalToSuperview()
+ $0.horizontalEdges.equalTo(view.safeAreaLayoutGuide)

81-91: ํƒ€์ดํ‹€ ์ค„๋ฐ”๊ฟˆ ๋ฐฉ์‹(nit)

ํ•œ๊ธ€์€ byWordWrapping์ด ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ์— ๋งž๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

- largeTitleLabel.lineBreakMode = .byCharWrapping
+ largeTitleLabel.lineBreakMode = .byWordWrapping

234-246: ๋ฌดํ•œ ์Šคํฌ๋กค Task์˜ self ์บก์ฒ˜์™€ UI ์Šค๋ ˆ๋“œ ๋ณด์žฅ

ํ™”๋ฉด ์ดํƒˆ ์‹œ์—๋„ Task๊ฐ€ self๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์žก์•„๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [weak self]๋กœ ์บก์ฒ˜ํ•˜๊ณ  UI๋Š” MainActor์—์„œ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ์ค‘๋ณต reload๋„ ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ๋ณ„๋„ ์ฝ”๋ฉ˜ํŠธ ์ฐธ๊ณ ).

์˜ˆ์‹œ diff:

- Task {
+ Task { [weak self] in
-  do {
-    try await callEntireReviewAPI(wineId: self.wineId, sortType: currentType, page: currentPage + 1)
-    self.view.hideBlockingView()
+  guard let self = self else { return }
+  do {
+    try await self.callEntireReviewAPI(wineId: self.wineId, sortType: self.currentType, page: self.currentPage + 1, vintage: self.vintage)
+    await MainActor.run { self.view.hideBlockingView() }
   } catch {
-    self.view.hideBlockingView()
+    await MainActor.run { self.view.hideBlockingView() }
     errorHandler.handleNetworkError(error, in: self)
   }
-  DispatchQueue.main.async {
-    self.entireReviewView.reviewCollectionView.reloadData()
-  }
   isLoading = false
 }

242-244: reloadData ์ค‘๋ณต ํ˜ธ์ถœ ์ œ๊ฑฐ

callEntireReviewAPI ๋‚ด๋ถ€์—์„œ ์ด๋ฏธ reload๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๋ผ์ธ 166-167). ์—ฌ๊ธฐ์„œ ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ ˆ์ด์•„์›ƒ ์ฝ”์ŠคํŠธ๋งŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

-DispatchQueue.main.async {
-  self.entireReviewView.reviewCollectionView.reloadData()
-}

106-118: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ •๋ ฌ ๋ฌธ์ž์—ด ๋งคํ•‘ ๊ฐœ์„ (์˜ต์…˜)

๋ฌธ์ž์—ด ๋น„๊ต ์ฒด์ธ ๋Œ€์‹  enum ๋˜๋Š” ๋งคํ•‘ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํƒ€/๋กœ์ผ€์ผ ๋ณ€๊ฒฝ์— ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•œ๋‹ค๋ฉด enum ๊ธฐ๋ฐ˜์œผ๋กœ ์น˜ํ™˜ ์ฝ”๋“œ ์ƒ์„ฑํ•ด ๋“œ๋ฆด๊ฒŒ์š”.


41-44: indicator ๊ด€๋ฆฌ ์œ„์น˜ ์ผ๊ด€ํ™”(์˜ต์…˜)

viewWillAppear์—์„œ ๋งค๋ฒˆ view.addSubview(indicator) ํ˜ธ์ถœ ์‹œ ์ค‘๋ณต ์ถ”๊ฐ€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. indicator ์ถ”๊ฐ€/์ œ๊ฑฐ๋ฅผ showBlockingView/hideBlockingView ๋‚ด๋ถ€๋กœ ์บก์Аํ™”ํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ’ก Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 7af7550 and 82396ba.

๐Ÿ“’ Files selected for processing (5)
  • DE/DE/Sources/Core/CommonUI/View/CustomDropdownView.swift (2 hunks)
  • DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift (3 hunks)
  • DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1 hunks)
  • DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1 hunks)
  • DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (3 hunks)
๐Ÿงฐ Additional context used
๐Ÿง  Learnings (1)
๐Ÿ““ Common learnings
Learnt from: doyeonk429
PR: Drink-Easy/DE_iOS#0
File: :0-0
Timestamp: 2025-08-30T13:14:55.580Z
Learning: ์‚ฌ์šฉ์ž doyeonk429๋Š” ํ•œ๊ตญ์–ด๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ธฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
๐Ÿงฌ Code graph analysis (4)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)
DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (2)
  • setTitleColor (42-44)
  • setSubTitleColor (46-48)
DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (2)
  • setTitleColor (60-62)
  • setSubTitleColor (64-66)
DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift (1)
DE/DE/Sources/Core/Extensions/UIView+Extensions.swift (1)
  • addSubviews (78-80)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (2)
DE/DE/Sources/Core/Extensions/UIView+Extensions.swift (3)
  • showColorBlockingView (24-39)
  • hideBlockingView (41-53)
  • addSubviews (78-80)
DE/DE/Sources/DesignSystem/Font/TextStyle.swift (1)
  • apply (68-70)
๐Ÿช› SwiftLint (0.57.0)
DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift

[Warning] 17-17: Initializing an optional variable with nil is redundant

(redundant_optional_initialization)

๐Ÿ”‡ Additional comments (6)
DE/DE/Sources/Core/CommonUI/View/TitleWithBarView.swift (1)

59-66: ํƒ€์ดํ‹€/์„œ๋ธŒํƒ€์ดํ‹€ ์ƒ‰์ƒ ์„ธํ„ฐ ์ถ”๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค

๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ API๋กœ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

DE/DE/Sources/Core/CommonUI/View/TitleWithoutBarView.swift (1)

41-48: ์ƒ‰์ƒ ์„ธํ„ฐ ์ถ”๊ฐ€ LGTM

TitleWithBarView์™€ API ํ˜•ํƒœ๊ฐ€ ๋งž์ถฐ์ ธ์„œ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค.

DE/DE/Sources/Core/CommonUI/View/EntireReviewView.swift (2)

24-26: ์Šคํฌ๋กค ์ธ๋””์ผ€์ดํ„ฐ ๋น„ํ‘œ์‹œ ๋ณ€๊ฒฝ OK

๋ฆฌ์ŠคํŠธ ์ง‘์ค‘๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


57-58: ์ƒ๋‹จ ๊ฐ„๊ฒฉ 16 ๋ณ€๊ฒฝ OK

๊ธฐ์กด ๋™์  ํŒจ๋”ฉ์—์„œ ๊ณ ์ •๊ฐ’์œผ๋กœ ๋‹จ์ˆœํ™”. ์Šคํฌ๋ฆฐ์ƒท ์ƒ ๋””์ž์ธ๊ณผ ๋งž๋‹ค๋ฉด ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค.

DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift (2)

136-143: API ๊ฒฐ๊ณผ ํŒŒ์‹ฑ ๊ฐ€๋“œ๋ฌธ OK, ํ•˜์ง€๋งŒ ๋นˆ ์‘๋‹ต ์‹œ ์ƒํƒœ ๋ฆฌ์…‹ ๊ณ ๋ ค(์˜ต์…˜)

response == nil ๋˜๋Š” content == nil์ผ ๋•Œ UI ์ƒํƒœ/ํ”Œ๋ž˜๊ทธ(isLoading ๋“ฑ) ๋ฆฌ์…‹ ๋กœ์ง์ด ํ˜ธ์ถœ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค ๋กœ๋”ฉ ๊ฒฝ๋กœ์—์„œ ๋นˆ ๊ฒฐ๊ณผ์ผ ๋•Œ๋„ isLoading์ด false๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ์žฌํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


119-131: showBlockingView ๊ตฌํ˜„ ํ™•์ธ๋จ
UIView+Extensions.swift์— showBlockingView()๊ฐ€ ์ •์ƒ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋‚˜ ๋Ÿฐํƒ€์ž„ ๋ฏธ๋™์ž‘ ์ด์Šˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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: 0

Caution

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

โš ๏ธ Outside diff range comments (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)

105-113: โ€˜๋”๋ณด๊ธฐโ€™ ๋…ธ์ถœ ํŒ๋‹จ ๋กœ์ง์ด ์‹ค์ œ ๋ Œ๋”๋ง ํฐํŠธ/ํญ๊ณผ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • AppTextStyle.apply๋Š” attributedText๋ฅผ ์„ธํŒ…ํ•˜๋ฏ€๋กœ review.font๊ฐ€ ์‹ค์ œ ํฐํŠธ์™€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • contentView.frame.width๋Š” layout ์ „์—” 0์ด์–ด์„œ ๊ณ„์‚ฐ์ด ๋น—๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

๋ ˆ์ด๋ธ”์˜ ์‹ค์ œ bounds ํญ๊ณผ attributedText์˜ ํฐํŠธ/paragraphStyle์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์ •ํ•˜์„ธ์š”.

-    private func isReviewTextTruncated() -> Bool {
-        guard let text = review.text else { return false }
-        
-        let labelWidth = contentView.frame.width - 30
-        let labelFont = review.font ?? UIFont.systemFont(ofSize: 16)
-        let lineSpacing = review.font.pointSize * 0.3
-        let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing)
-        return numberOfLines > 2
-    }
+    private func isReviewTextTruncated() -> Bool {
+        contentView.layoutIfNeeded()
+        guard let plain = review.text, !plain.isEmpty else { return false }
+        let width = review.bounds.width > 0
+            ? review.bounds.width
+            : max(contentView.bounds.width - 32, 0) // review ์ขŒ์šฐ inset 16*2
+        guard width > 0 else { return false }
+
+        var font = review.font ?? UIFont.systemFont(ofSize: 16)
+        var lineSpacing: CGFloat = 0
+        if let attr = review.attributedText {
+            if let f = attr.attribute(.font, at: 0, effectiveRange: nil) as? UIFont {
+                font = f
+            }
+            if let ps = attr.attribute(.paragraphStyle, at: 0, effectiveRange: nil) as? NSParagraphStyle {
+                lineSpacing = ps.lineSpacing
+            }
+        }
+        let lines = plain.numberOfLines(width: width, font: font, lineSpacing: lineSpacing)
+        return lines > 2
+    }
๐Ÿงน Nitpick comments (4)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (4)

91-92: ํ‰์  ํ‘œ๊ธฐ ํฌ๋งท ๊ณ ์ • ๋ฐ ๋กœ์ผ€์ผ ๋Œ€์‘ ์ œ์•ˆ.

String(model.rating)์€ 4.0/4.500000 ๋“ฑ ๋…ธ์ถœ์ด ๋“ค์ญ‰๋‚ ์ญ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NumberFormatter๋กœ ์ตœ๋Œ€ ์†Œ์ˆ˜ 1์ž๋ฆฌ, ๋กœ์ผ€์ผ ๋ฐ˜์˜ํ•˜์„ธ์š”.

์•„๋ž˜์ฒ˜๋Ÿผ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

-        AppTextStyle.KR.body2
-            .apply(to: score, text: "โ˜… \(String(model.rating))", color: AppColor.purple100)
+        let ratingFormatter = NumberFormatter().then {
+            $0.numberStyle = .decimal
+            $0.minimumFractionDigits = 0
+            $0.maximumFractionDigits = 1
+        }
+        let ratingText = ratingFormatter.string(from: NSNumber(value: model.rating)) ?? "\(model.rating)"
+        AppTextStyle.KR.body2
+            .apply(to: score, text: "โ˜… \(ratingText)", color: AppColor.purple100)

62-71: ๊ธด ๋‹‰๋„ค์ž„/์ ์ˆ˜/๋‚ ์งœ๊ฐ€ ํ•œ ์ค„์—์„œ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์šฐ์„ ์ˆœ์œ„ ์กฐ์ •.

๋‹‰๋„ค์ž„์ด ๊ธธ๋ฉด score๊ฐ€ ์˜ค๋ฅธ์ชฝ date์™€ ๊ฒน์น˜๊ฑฐ๋‚˜ ์ค„๋ฐ”๊ฟˆ๋  ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Hugging/Compression ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•˜์„ธ์š”.

// ์˜ˆ: init ๋˜๋Š” constraints() ๋ง๋ฏธ์— ์ถ”๊ฐ€
nickname.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
score.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
date.setContentCompressionResistancePriority(.required, for: .horizontal)

score.setContentHuggingPriority(.defaultLow, for: .horizontal)
date.setContentHuggingPriority(.required, for: .horizontal)

Also applies to: 78-81


29-35: โ€˜๋”๋ณด๊ธฐ/์ ‘๊ธฐโ€™ ๋ฌธ์ž์—ด ๋กœ์ปฌ๋ผ์ด์ฆˆ + ์ ‘๊ทผ์„ฑ ๋ผ๋ฒจ ๋ณด๊ฐ• ์ œ์•ˆ.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ๋Š” ๋‹ค๊ตญ์–ด ๋Œ€์‘์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Localizable.strings๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ํ† ๊ธ€ ์‹œ VoiceOver๊ฐ€ ์ƒํƒœ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ ‘๊ทผ์„ฑ ๋ผ๋ฒจ/ํžŒํŠธ๋„ ์„ค์ •ํ•˜์„ธ์š”.

// ํƒ€์ดํ‹€ ์„ธํŒ…
toggleButton.setTitle(NSLocalizedString("review.more", comment: "๋”๋ณด๊ธฐ"), for: .normal)
// ํ† ๊ธ€ ์‹œ
toggleButton.setTitle(isExpanded ? NSLocalizedString("review.collapse", comment: "์ ‘๊ธฐ")
                                 : NSLocalizedString("review.more", comment: "๋”๋ณด๊ธฐ"),
                      for: .normal)
// ์ ‘๊ทผ์„ฑ
toggleButton.accessibilityLabel = NSLocalizedString("review.toggle", comment: "๋ฆฌ๋ทฐ ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ")
toggleButton.accessibilityValue = isExpanded
  ? NSLocalizedString("expanded", comment: "ํŽผ์ณ์ง")
  : NSLocalizedString("collapsed", comment: "์ ‘ํž˜")

์ถ”๊ฐ€๋กœ score์—๋„ ์˜ˆ: score.accessibilityLabel = "ํ‰์  \(ratingText)์ ".

Also applies to: 47-52


36-45: ์žฌ์‚ฌ์šฉ ์‹œ ์ž”์—ฌ attributedText๋กœ ์ธํ•œ ๊นœ๋นก์ž„ ๋ฐฉ์ง€.

์…€ ์žฌ์‚ฌ์šฉ์—์„œ ์ด์ „ ๋‚ด์šฉ์ด ์ˆœ๊ฐ„ ๋ณด์˜€๋‹ค๊ฐ€ ๋ฐ”๋€Œ๋Š” ํ˜„์ƒ์„ ์ค„์ด๋ ค๋ฉด prepareForReuse()์—์„œ label์„ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”.

public override func prepareForReuse() {
    super.prepareForReuse()
    nickname.text = nil
    nickname.attributedText = nil
    score.text = nil
    score.attributedText = nil
    review.text = nil
    review.attributedText = nil
    date.text = nil
    isExpanded = false
}
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ’ก Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 82396ba and eae409e.

๐Ÿ“’ Files selected for processing (1)
  • DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (2 hunks)
๐Ÿงฐ Additional context used
๐Ÿง  Learnings (1)
๐Ÿ““ Common learnings
Learnt from: doyeonk429
PR: Drink-Easy/DE_iOS#0
File: :0-0
Timestamp: 2025-08-30T13:14:55.580Z
Learning: ์‚ฌ์šฉ์ž doyeonk429๋Š” ํ•œ๊ตญ์–ด๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ธฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
๐Ÿงฌ Code graph analysis (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)
DE/DE/Sources/DesignSystem/Font/TextStyle.swift (1)
  • apply (68-70)
๐Ÿ”‡ Additional comments (1)
DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift (1)

20-20: ์Šคํƒ€์ผ ๋ถ„๋ฆฌ ๋ฐฉํ–ฅ ์ข‹์Šต๋‹ˆ๋‹ค.

score๋Š” ์ดˆ๊ธฐํ™” ์‹œ ๊ธฐ๋ณธ UILabel๋กœ ๋‘๊ณ , configure์—์„œ AppTextStyle๋กœ๋งŒ ์Šคํƒ€์ผ๋งํ•˜๋Š” ํ๋ฆ„์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉ ์‹œ ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Design] ์™€์ธ ์ „์ฒด ๋ฆฌ๋ทฐ UI ๊ฐœํŽธ

2 participants