Skip to content

Conversation

@leeseokchan00
Copy link
Contributor

@leeseokchan00 leeseokchan00 commented Nov 20, 2025

๐Ÿ“Œ PR ์š”์•ฝ

๐ŸŒฑ ์ž‘์—…ํ•œ ๋‚ด์šฉ

  • ๋‚จ์€๊ฑด api ๊ณ ์น˜๋ฉด ํ• ๊ฒŒ์š”

๐ŸŒฑ PR ํฌ์ธํŠธ

๐Ÿ“ธ ์Šคํฌ๋ฆฐ์ƒท

์Šคํฌ๋ฆฐ์ƒท
ํŒŒ์ผ์ฒจ๋ถ€๋ฐ”๋žŒ

๐Ÿ“ฎ ๊ด€๋ จ ์ด์Šˆ

Summary by CodeRabbit

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

  • ์ƒˆ ๊ธฐ๋Šฅ

    • ํ•˜๋‹จ ์‹œํŠธ์— ๋“œ๋ž˜๊ทธ ํ•ธ๋“ค ์ถ”๊ฐ€
    • ๋“ฑ๋ก ์ด๋ฏธ์ง€ ์„ ํƒ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • ์ฝ”์Šค๋ช…/์„ค๋ช… ํŽธ์ง‘ ์‹œ ๊ธ€์ž์ˆ˜ ํ‘œ์‹œ ์ถ”๊ฐ€ (18์ž/20์ž)
  • UI ๊ฐœ์„ 

    • ์ƒ๋‹จ ์—ฌ๋ฐฑ ์ผ๊ด€์„ฑ ์กฐ์ •(์—ฌ๋Ÿฌ ํ™”๋ฉด์— ์ƒ๋‹จ ํŒจ๋”ฉ ์ ์šฉ)
    • ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์Šคํƒ€์ผ ๋ฐ ๋ฒ„ํŠผ/์•„์ด์ฝ˜ ํฌ๊ธฐ ์กฐ์ •
    • ์ผ๋ถ€ ํŒ์—…/์Šค๋‚ต๋ฐ” ํ‘œ์‹œ ๋ฐฉ์‹ ๊ฐœ์„ 
  • ์„ฑ๋Šฅ

    • ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋™์‹œ ์‹คํ–‰ ์ฒ˜๋ฆฌ(๋ณ‘๋ ฌํ™”)

โœ๏ธ Tip: You can customize this high-level summary in your review settings.

@leeseokchan00 leeseokchan00 self-assigned this Nov 20, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 20, 2025

Walkthrough

UI ์ „๋ฐ˜์˜ ๋ ˆ์ด์•„์›ƒ/ํŒจ๋”ฉ ์กฐ์ •(์—ฌ๋Ÿฌ ํ™”๋ฉด์— top = 50.dp ์ ์šฉ ๋ฐ ๊ฐ„๊ฒฉ ๋ณ€๊ฒฝ), ์ผ๋ถ€ ๋ฒ„ํŠผ์˜ ํด๋ฆญ ๊ฐ€๋“œ ์ œ๊ฑฐ, Dialogโ†’Popup ์ „ํ™˜, ์ด๋ฏธ์ง€ ์„ ํƒ ๋ฆฌ์…‹(intent/์ฝœ๋ฐฑ ์ถ”๊ฐ€), ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ํ•„๋“œ๋ช…/nullable ๋ณ€๊ฒฝ ๋ฐ ๋งคํ•‘/์ €์žฅ์†Œ ์—…๋ฐ์ดํŠธ, PlaceScreen ์ดˆ๊ธฐ ๋กœ๋“œ์˜ ๋ณ‘๋ ฌํ™” ๋“ฑ์ด ํฌํ•จ๋œ ๊ด‘๋ฒ”์œ„ํ•œ UIยท๋ฐ์ดํ„ฐ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

Changes

Cohort / File(s) ๋ณ€๊ฒฝ ์š”์•ฝ
๋””์ž์ธ ์‹œ์Šคํ…œ (๊ณตํ†ต UI)
core/designsystem/src/main/java/.../bottomsheet/SolplyBasicBottomSheet.kt, .../button/SolplyButton.kt, .../card/RegisterPlaceImage.kt, .../card/SolplyCourseCard.kt, .../card/SolplyPlaceCard.kt, .../header/SolplyHomeHeader.kt, .../textfield/SolplyTextField.kt, .../topbar/SolplyTopBar.kt
๋ฐ”ํ…€์‹œํŠธ์— ๋“œ๋ž˜๊ทธ ํ•ธ๋“คยทzIndexยทํฌ๊ธฐ ์กฐ์ •, ๋ฒ„ํŠผ onClick ์ „๋‹ฌ ์กฐ๊ฑด ๋ณ€๊ฒฝ(selected์ผ ๋•Œ๋งŒ), RegisterPlaceImage์— resetSelectedUris ์ฝœ๋ฐฑ ์ถ”๊ฐ€, Course/Place ์นด๋“œ ์Šคํƒ€์ผยทnullable ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ํ—ค๋”/ํ…์ŠคํŠธ ํ•„๋“œ/ํƒ‘๋ฐ”์˜ ์Šคํƒ€์ผยทํŒจ๋”ฉ ์ˆ˜์ •
๋ฐ์ดํ„ฐ ๊ณ„์ธต (Place/Town DTO ๋ฐ ๋งคํ•‘)
data/place/.../GetPlacesResponseDto.kt, data/place/.../mapper/PlaceEntityMapper.kt, data/place/.../repository/PlaceRepositoryImpl.kt, data/course/.../TownTreeResponseDto.kt, data/course/.../FavoriteTownRepositoryImpl.kt
PlaceDto: thumbnail nullable, mainTagโ†’primaryTag, townId ์ถ”๊ฐ€; Place ๋งคํ•‘ยท์ €์žฅ์†Œ์™€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๋งž์ถฐ ๋งคํ•‘ ์ˆ˜์ •; TownNodeDto ๊ตฌ์กฐ ๋ณ€๊ฒฝ(parentTownId ์ถ”๊ฐ€ยทsubTowns ์ œ๊ฑฐ) ๋ฐ getTownTree ๋กœ์ง ๋‹จ์ˆœํ™”
๋„๋ฉ”์ธ ๋ชจ๋ธ
domain/place/src/main/java/.../PlaceEntity.kt
thumbnailImageUrl nullable๋กœ ๋ณ€๊ฒฝ
์›๊ฒฉ API ๋ณ€๊ฒฝ
remote/place/.../PlaceService.kt, remote/place/.../PlaceRemoteDataSourceImpl.kt
API ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ช… ๋ณ€๊ฒฝ: subTag1Idsโ†’subTagAIdList, subTag2Idsโ†’subTagBIdList (์„œ๋ฒ„ ๊ณ„์•ฝ ํ™•์ธ ํ•„์š”)
๊ฒ€์ƒ‰ยท๋“ฑ๋ก ์ด๋ฏธ์ง€ ํ๋ฆ„
feature/search/.../RegisterPlaceContract.kt, feature/search/.../RegisterPlaceScreen.kt, feature/search/.../RegisterPlaceViewModel.kt, core/designsystem/.../RegisterPlaceImage.kt
ResetSelectedUris intent/์ฝœ๋ฐฑ ์ถ”๊ฐ€, ํ™”๋ฉด ๋ฐ ๋ทฐ๋ชจ๋ธ์—์„œ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์„ ํƒ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ ๋กœ์ง ๊ตฌํ˜„ ๋ฐ ์ „ํŒŒ
๋งต ๊ด€๋ จ ๊ธฐ๋Šฅ/๋ทฐ๋ชจ๋ธ/UI
feature/maps/.../MapsContract.kt, MapsScreen.kt, MapsViewModel.kt, component/.../EditCourseBottomSheet.kt, RenameCourseBottomSheet.kt, ReportPlaceDialog.kt, CourseItem.kt, AddCourseBottomSheet.kt, PlaceDetailBottomSheet.kt
Rename/ResetSelectedUris intent ์ถ”๊ฐ€ ๋ฐ ์ฒ˜๋ฆฌ, RenameBottomSheet์— ์ž…๋ ฅ ๊ธธ์ด ์ œํ•œยท๋ฌธ์ž์ˆ˜ ํ‘œ์‹œยทonChangeRenameCourse ๋„์ž…, ReportPlaceDialog Dialogโ†’Popup ์ „ํ™˜ ๋ฐ resetSelectedUris ์ „ํŒŒ, Map UI ์„ธํŒ…(zoom/compass ๋น„ํ™œ์„ฑํ™”) ๋ฐ ๊ด€๋ จ ์ฝœ๋ฐฑ ์—ฐ๊ฒฐ
๋ฉ”์ธ/์Šค๋‚ต๋ฐ” ๋ฐ ํŒ์—…
feature/main/src/main/java/.../MainScreen.kt
Snackbar ํ‘œ์‹œ ๋…ผ๋ฆฌ๋ฅผ derivedState๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  SnackbarHost๋ฅผ Popup์œผ๋กœ ๋ž˜ํ•‘(๋น„ํฌ์ปค์Šคยท๋น„ํ•ด์ œ ์†์„ฑ)
ํŽ˜์ด์ง•/ํ—ค๋”ยทPlace ๊ด€๋ จ
feature/place/.../PlaceScreen.kt, feature/place/.../PlaceViewModel.kt, feature/place/.../model/PlaceData.kt, feature/place/.../PlaceOptionFilterSheet.kt
CustomHorizontalPager์— persona/nickname ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€(ํ—ค๋” ๋ Œ๋”๋ง), fetchInitInfo๋ฅผ ๋ณ‘๋ ฌ async๋กœ ๋ณ€๊ฒฝ, PlaceData.thumbnailUrl nullable๋กœ ๋ณ€๊ฒฝ, ํ•„ํ„ฐ ์ดˆ๊ธฐ ์„ ํƒ ์ƒํƒœ ๋ณ€๊ฒฝ
์˜จ๋ณด๋”ฉยท์—ฌ๋Ÿฌ ํ™”๋ฉด์˜ ํด๋ฆญ ๊ฐ€๋“œ ์ œ๊ฑฐ
feature/onboarding/..., feature/course/.../FavoriteTownRoute.kt, feature/mypage/.../ProfileEditScreen.kt, ๊ธฐํƒ€ ํ™”๋ฉด๋“ค (CollectionScreen.kt, MypageScreen.kt, WithdrawScreen.kt, SearchScreen.kt, ๋“ฑ)
์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ์ƒ๋‹จ ํŒจ๋”ฉ(top = 50.dp) ์ ์šฉ ๋ฐ ์ผ๋ถ€ ๋ฒ„ํŠผ์˜ isEnabled/์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ ์ œ๊ฑฐ๋กœ ํด๋ฆญ์ด ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋„๋ก ๋ณ€๊ฒฝ(๋ฒ„ํŠผ ์Šคํƒ€์ผ์€ ์—ฌ์ „ํžˆ ์ƒํƒœ์— ์˜์กด)
OAuth / ๊ธฐํƒ€ ์†Œ์†Œํ•œ ๋ณ€๊ฒฝ
feature/oauth/.../OauthViewModel.kt
postSocialLogin ์‹คํŒจ ๋กœ๊น… ์ œ๊ฑฐ

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant UI as RenameCourseBottomSheet
    participant VM as MapsViewModel
    participant State as MapsState

    User->>UI: ์ฝ”์Šค๋ช…/์†Œ๊ฐœ ์ž…๋ ฅ
    UI->>UI: ๊ธธ์ด ๊ฒ€์ฆ ๋ฐ ๋ฌธ์ž์ˆ˜ ํ‘œ์‹œ
    User->>UI: "์™„๋ฃŒ" ํด๋ฆญ
    UI->>VM: onChangeRenameCourse(name,intro)
    VM->>VM: ChangeRenameCourse ์ฒ˜๋ฆฌ (courseDetailInfo ์—…๋ฐ์ดํŠธ)
    VM->>UI: onStartRenameCourseClick() (ํŽธ์ง‘ ์™„๋ฃŒ ํ›„ ํ๋ฆ„)
Loading
sequenceDiagram
    participant User
    participant Screen as RegisterPlaceScreen
    participant Image as RegisterPlaceImage
    participant VM as RegisterPlaceViewModel

    User->>Screen: ์ด๋ฏธ์ง€ ์„ ํƒ/์—…๋ฐ์ดํŠธ
    Screen->>Image: selectedUris ์ „๋‹ฌ
    User->>Image: ์„ ํƒ๋œ ์ด๋ฏธ์ง€ ํด๋ฆญ (index)
    Image->>Screen: resetSelectedUris(index)
    Screen->>VM: RegisterPlaceIntent.ResetSelectedUris(index)
    VM->>VM: ์ธ๋ฑ์Šค ๊ฒ€์ฆ ํ›„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ ๋ฐ ์ƒํƒœ ๊ฐฑ์‹ 
    VM->>Screen: ์—…๋ฐ์ดํŠธ๋œ selectedUris ์ƒํƒœ ๋ฐ˜์˜
Loading

Estimated code review effort

๐ŸŽฏ 3 (Moderate) | โฑ๏ธ ~25 minutes

Possibly related PRs

  • [Feature/#131] ์ œ๋ณดํ•˜๊ธฐย #139 โ€” ReportPlaceDialog, RegisterPlaceImage ๋ฐ resetSelectedUris ๊ด€๋ จ ๋ณ€๊ฒฝ๊ณผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋จ.
  • [Refactor/#144] first qaย #153 โ€” RegisterPlaceImage ๋ฐ resetSelectedUris ์—ฐ๊ฒฐ, Report/Register ๊ฒฝ๋กœ์˜ ๊ณตํ†ต ๋ณ€ํ™”์™€ ์—ฐ๊ด€.
  • [Feature/#72] main place api connectย #86 โ€” PlaceDto/PlaceEntity์˜ thumbnail nullability ๋ฐ mainTagโ†’primaryTag ๋ณ€๊ฒฝ๊ณผ ๋งคํผ/์ €์žฅ์†Œ ์กฐ์ • ๊ด€๋ จ.

Suggested labels

์‹œํ˜„๐Ÿฅ๐ŸŸ, ui๐ŸŽƒ

Suggested reviewers

  • nagaeng
  • 88guri

Poem

๐Ÿฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„ ํŒจ๋”ฉ 50dp,
๋ฒ„ํŠผ์€ ๋” ์ž์œ ๋กญ๊ฒŒ ํด์ง!
๋‹ค์ด์–ผ๋กœ๊ทธ๋Š” ํŒ์—…์œผ๋กœ ๊นก์ด,
์ด๋ฏธ์ง€ ํ•œ ์žฅ ๋ฝ‘์•„ ๋ฆฌ์…‹ ์ฝœ,
๋ฐ์ดํ„ฐ๋Š” ๋„๋„ ํ’ˆ๊ณ  ๋ณ‘๋ ฌ๋กœ ๋‹ฌ๋ ค์š” ๐Ÿฅ•

Pre-merge checks and finishing touches

โŒ Failed checks (1 warning, 3 inconclusive)
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.
Title check โ“ Inconclusive PR ์ œ๋ชฉ์ด ๋งค์šฐ ๋ชจํ˜ธํ•˜๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•จ. '#154' ์ด์Šˆ ๋ฒˆํ˜ธ์™€ 'first qa-2'๋Š” ๊ตฌ์ฒด์ ์ธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Œ. PR ์ œ๋ชฉ์„ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์„ธ์š”. ์˜ˆ: 'Design system UI ๊ฐœ์„  ๋ฐ API ๋งคํ•‘ ๋ณ€๊ฒฝ' ๋˜๋Š” '๋””์ž์ธ ์‹œ์Šคํ…œ UI ์กฐ์ • ๋ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ'.
Linked Issues check โ“ Inconclusive ์—ฐ๊ฒฐ๋œ ์ด์Šˆ #154๋Š” ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋งŒ ํฌํ•จํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ช…์‹œ๋˜์ง€ ์•Š์Œ. ์ฝ”๋”ฉ ๊ด€๋ จ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Œ. ์ด์Šˆ #154์— ๊ตฌ์ฒด์ ์ธ ์ฝ”๋”ฉ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋ชฉํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ PR์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…์‹œํ•˜์„ธ์š”.
Out of Scope Changes check โ“ Inconclusive ์ด์Šˆ์— ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ์—†์–ด ๋ฒ”์œ„ ํŒ๋‹จ์ด ์–ด๋ ค์šฐ๋‚˜, ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์ด ๋””์ž์ธ ์‹œ์Šคํ…œ UI, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ, ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ ์กฐ์ •์œผ๋กœ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ณด์ž„. ์ด์Šˆ #154์˜ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ช…์‹œ๋˜์–ด์•ผ ๋ฒ”์œ„ ๋‚ด/์™ธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โœ… Passed checks (1 passed)
Check name Status Explanation
Description Check โœ… Passed Check skipped - CodeRabbitโ€™s high-level summary is enabled.
โœจ Finishing touches
  • ๐Ÿ“ Generate docstrings

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

๐Ÿงน Nitpick comments (10)
feature/maps/src/main/java/com/teamsolply/solply/maps/component/CourseItem.kt (3)

108-110: ํƒ€์ดํ‹€ 1์ค„ ์ œํ•œ ์‹œ Ellipsis ๋ช…์‹œ๋ฅผ ๊ณ ๋ ค

ํƒ€์ดํ‹€์„ maxLines = 1๋กœ ์ œํ•œํ•˜๋ฉด์„œ overflow ์ •์ฑ…์ด ๊ธฐ๋ณธ๊ฐ’(Clip)์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ์ƒ ์ž˜๋ฆฐ๋‹ค๋Š” ๊ฑธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด TextOverflow.Ellipsis๋ฅผ ๋ช…์‹œํ•˜๋Š” ํŽธ์ด ๋” ์ง๊ด€์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-                            Text(
-                                text = placeName.formatTextToPlaceItemTitle(),
-                                modifier = Modifier,
-                                color = SolplyTheme.colors.black,
-                                style = SolplyTheme.typography.title15M,
-                                maxLines = 1
-                            )
+                            Text(
+                                text = placeName.formatTextToPlaceItemTitle(),
+                                modifier = Modifier,
+                                color = SolplyTheme.colors.black,
+                                style = SolplyTheme.typography.title15M,
+                                maxLines = 1,
+                                overflow = TextOverflow.Ellipsis
+                            )

113-123: ์ฃผ์†Œ Text์˜ maxLines/overflow ์ •์ฑ… ์ผ๊ด€์„ฑ ๊ฐœ์„  ์ œ์•ˆ

์„ ํƒ ์ƒํƒœ์—์„œ๋งŒ maxLines = 2 + Ellipsis, ๋น„์„ ํƒ ์ƒํƒœ์—์„œ๋Š” maxLines = 1 + Clip ์กฐํ•ฉ์ธ๋ฐ, ๋น„์„ ํƒ ์ƒํƒœ์—์„œ๋„ ๊ธธ์ด๊ฐ€ ์•ฝ๊ฐ„๋งŒ ๊ธธ์–ด๋„ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๊ฐ€ ๋”ฑ ์ž˜๋ ค ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UX ๊ด€์ ์—์„œ ํ•ญ์ƒ ๋ง์ค„์ž„ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์ด ์ž์—ฐ์Šค๋Ÿฌ์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ overflow ์ •์ฑ…๋งŒ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด๋ณผ ๋งŒํ•ฉ๋‹ˆ๋‹ค.

-                            style = SolplyTheme.typography.caption12R,
-                            maxLines = if (selectedPlaceItem) 2 else 1,
-                            overflow = if (selectedPlaceItem) {
-                                TextOverflow.Ellipsis
-                            } else {
-                                TextOverflow.Clip
-                            }
+                            style = SolplyTheme.typography.caption12R,
+                            maxLines = if (selectedPlaceItem) 2 else 1,
+                            overflow = TextOverflow.Ellipsis

125-145: Spacer ํญ ๋ช…์‹œ๋กœ ์•„์ด์ฝ˜ ์˜์—ญ ์—ฌ๋ฐฑ ํ‘œํ˜„์ด ๋” ๋ช…ํ™•ํ•ด์ง

Spacer(modifier = Modifier.width(12.dp))๋กœ ํ…์ŠคํŠธ์™€ ์•„์ด์ฝ˜ ์‚ฌ์ด ๊ฐ„๊ฒฉ์„ ๊ณ ์ •๊ฐ’์œผ๋กœ ๋‘” ์„ ํƒ์€ ์ง๊ด€์ ์ด๊ณ , Row ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„ ์—ฌ๋ฐฑ ์˜๋„๊ฐ€ ์ž˜ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์„ ํƒ์  ์ œ์•ˆ์œผ๋กœ, ๋งˆ์ง€๋ง‰ Spacer(modifier = Modifier.padding(end = 22.dp))๋„ ์•„๋ž˜์ฒ˜๋Ÿผ width ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์ผํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ ์˜๋„๋ฅผ ์ฝ๋Š” ์ž…์žฅ์—์„œ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-                    Spacer(modifier = Modifier.padding(end = 22.dp))
+                    Spacer(modifier = Modifier.width(22.dp))
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/header/SolplyHomeHeader.kt (1)

32-33: ํ—ค๋” ์—ฌ๋ฐฑ ๋Œ€ํญ ์ฆ๊ฐ€

์ƒ๋‹จ ํŒจ๋”ฉ์ด 11.dp์—์„œ 48.dp๋กœ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™”๋ฉด๋“ค์€ ๋Œ€๋ถ€๋ถ„ 50.dp๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” 48.dp๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”? ์˜๋„์ ์ธ ์ฐจ์ด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด 50.dp ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

         .fillMaxWidth()
         .background(color = SolplyTheme.colors.white)
-        .padding(top = 48.dp)
+        .padding(top = 50.dp)
feature/place/src/main/java/com/teamsolply/solply/place/component/bottomsheet/PlaceOptionFilterSheet.kt (1)

95-95: ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ์˜ ์„ ํƒ ์ƒํƒœ๋ฅผ ์žฌ๊ณ ํ•˜์„ธ์š”.

"์ดˆ๊ธฐํ™”" ๋ฒ„ํŠผ์˜ selected ์†์„ฑ์ด ํ•ญ์ƒ true๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ๋œ ํ•„ํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ์ƒํƒœ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋ช…ํ™•ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •์„ ๊ณ ๋ คํ•˜์„ธ์š”:

 SolplyBasicButton(
     text = "์ดˆ๊ธฐํ™”",
     onClick = onReset,
     modifier = Modifier.weight(1f),
-    selected = true,
+    selected = selectedOptionIds.isNotEmpty(),
     textColor = SolplyTheme.colors.gray900,
     textStyle = SolplyTheme.typography.body16M,
     enabledBackgroundColor = SolplyTheme.colors.white,
     disabledBackgroundColor = SolplyTheme.colors.white
 )
feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt (1)

152-183: fetchInitInfo์˜ async/await ์‚ฌ์šฉ ๊ตฌ์กฐ ๋‹จ์ˆœํ™”/๋ช…ํ™•ํ™” ์ œ์•ˆ

fetchPlaces, fetchRecommendPlace, fetchMainTags ๊ฐ๊ฐ์ด ๋‚ด๋ถ€์—์„œ ์ด๋ฏธ viewModelScope.launch { ... }๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ, ์—ฌ๊ธฐ์„œ async { fetchXxx() }๋กœ ๊ฐ์‹ผ ๋’ค await()๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€๋Š” ์•Š๊ณ , ๊ธฐ์กด(๋‹จ์ˆœ ํ•จ์ˆ˜ ํ˜ธ์ถœ)๊ณผ ๋™์ž‘์ด ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜๋„๊ฐ€ ๋‹จ์ˆœํžˆ ์„ธ ์ž‘์—…์„ ๋™์‹œ์— ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ์•„๋ž˜์ฒ˜๋Ÿผ ์›๋ž˜์ฒ˜๋Ÿผ ๋‹จ์ˆœ ํ˜ธ์ถœ๋กœ ๋‘์–ด๋„ ๋˜๊ณ , ๊ตฌ์กฐ์  ๋™์‹œ์„ฑ์„ ๋ช…ํ™•ํžˆ ๊ฐ€์ ธ๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด ์„ธ ํ•จ์ˆ˜๋ฅผ suspend๋กœ ๋ฐ”๊พผ ๋’ค ์ด ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ๋งŒ async/await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ๋„ ๊ณ ๋ คํ•ด ๋ณผ ๋งŒํ•ฉ๋‹ˆ๋‹ค.

// ๊ฐ„๋‹จํžˆ ๋™์ผ ๋™์ž‘์„ ์œ ์ง€ํ•  ๊ฒฝ์šฐ
fetchPlaces(...)
fetchRecommendPlace(...)
fetchMainTags()

ํฐ ๋ฒ„๊ทธ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜์ค‘์— await()๊ฐ€ ์‹ค์ œ ์™„๋ฃŒ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๊ณ  ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ•œ ๋ฒˆ ๊ฒ€ํ† ํ•ด ๋ณด์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceContract.kt (1)

36-55: ResetSelectedUris์˜ index ์˜๋ฏธ๋ฅผ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค

์ƒˆ ์ธํ…ํŠธ ์ถ”๊ฐ€ ๋ฐฉํ–ฅ ์ž์ฒด๋Š” ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ index๊ฐ€ 0 ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค์ธ์ง€, ์–ด๋–ค ๋ฆฌ์ŠคํŠธ(์˜ˆ: selectedReportUris)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š”์ง€ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋Š” ์•ฝ๊ฐ„ ๋ชจํ˜ธํ•ด์„œ,

  • ์ด๋ฆ„์„ ResetSelectedReportUri ์ •๋„๋กœ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜
  • KDoc/์ฃผ์„์œผ๋กœ index ์˜๋ฏธ๋ฅผ ์„ค๋ช…

ํ•ด๋‘๋ฉด ํ˜ธ์ถœ ์ธก์—์„œ ์‹ค์ˆ˜ํ•  ์—ฌ์ง€๊ฐ€ ๋” ์ค„์–ด๋“ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceViewModel.kt (1)

106-131: ์„ ํƒ ์ด๋ฏธ์ง€ ๋ฆฌ์…‹ ๋กœ์ง์€ ์•ˆ์ „ํ•˜์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ ํƒ€์ž… ์ผ๊ด€์„ฑ์€ ์กฐ๊ธˆ ๋” ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

target.isEmpty() ๋ฐ intent.index !in target.indices ์ฒดํฌ๋กœ ๋ฐฉ์–ด ๋กœ์ง์ด ์ž˜ ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์•ˆ์ „ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ RegisterPlaceState์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ persistentListOf()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” toMutableList() ํ›„ MutableList๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒํƒœ์— ๋„ฃ๊ณ  ์žˆ์–ด ์ปฌ๋ ‰์…˜ ํƒ€์ž… ์ผ๊ด€์„ฑ์ด ์•ฝ๊ฐ„ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹ค์‹œ immutable ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊ฟ” ๋„ฃ๋Š” ์ชฝ์„ ํ•œ ๋ฒˆ ๊ณ ๋ คํ•ด ๋ณด์…”๋„ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

is RegisterPlaceIntent.ResetSelectedUris -> reduce {
    val target = selectedReportUris.toMutableList()
    if (target.isEmpty() || intent.index !in target.indices) return@reduce this
    target.removeAt(intent.index)
    copy(selectedReportUris = target.toPersistentList())
}

(ํ•„์š” ์‹œ kotlinx.collections.immutable.toPersistentList import ์ถ”๊ฐ€)

feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (1)

488-496: Persona ๋งคํ•‘ ๋กœ์ง

getRecommendText ํ•จ์ˆ˜๊ฐ€ persona ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ถ”์ฒœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” 4๊ฐ€์ง€ persona ํƒ€์ž…๊ณผ fallback์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ persona ํƒ€์ž…์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ์ค‘์•™ ์ง‘์ค‘์‹ persona ๊ด€๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data/course/src/main/java/com/teamsolply/solply/course/favoriteTown/repository/FavoriteTownRepositoryImpl.kt (1)

15-38: ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง

์ค‘์ฒฉ๋œ ํŠธ๋ฆฌ ๊ตฌ์กฐ ๋Œ€์‹  ํ‰๋ฉด ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ง€์—ญ๊ณผ ํƒ€์šด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ง์ด ๋” ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์„ ํƒ์  ๊ฐœ์„ ์‚ฌํ•ญ: Line 28์˜ groupBy { it.parentTownId ?: 0L }์—์„œ ?: 0L ๋ถ€๋ถ„์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Line 27์˜ ํ•„ํ„ฐ ์กฐ๊ฑด์—์„œ ์ด๋ฏธ null๊ณผ 0์„ ์ œ์™ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

-        val townsByRegion: Map<Long, List<TownLite>> = towns
-            .filter { it.parentTownId != null && it.parentTownId != 0L }
-            .groupBy { it.parentTownId ?: 0L }
+        val townsByRegion: Map<Long, List<TownLite>> = towns
+            .filter { it.parentTownId != null && it.parentTownId != 0L }
+            .groupBy { it.parentTownId!! }
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between db6473b and ac7ced2.

๐Ÿ“’ Files selected for processing (48)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/bottomsheet/SolplyBasicBottomSheet.kt (2 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/button/SolplyButton.kt (1 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/RegisterPlaceImage.kt (2 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyCourseCard.kt (1 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt (2 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/header/SolplyHomeHeader.kt (2 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt (1 hunks)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/topbar/SolplyTopBar.kt (1 hunks)
  • data/course/src/main/java/com/teamsolply/solply/course/favoriteTown/dto/TownTreeResponseDto.kt (1 hunks)
  • data/course/src/main/java/com/teamsolply/solply/course/favoriteTown/repository/FavoriteTownRepositoryImpl.kt (1 hunks)
  • data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt (1 hunks)
  • data/place/src/main/java/com/teamsolply/solply/place/mapper/PlaceEntityMapper.kt (1 hunks)
  • data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt (1 hunks)
  • domain/place/src/main/java/com/teamsolply/solply/place/model/PlaceEntity.kt (1 hunks)
  • feature/collection/src/main/java/com/teamsolply/solply/collection/CollectionMenuScreen.kt (1 hunks)
  • feature/collection/src/main/java/com/teamsolply/solply/collection/collection/component/CollectionScreen.kt (2 hunks)
  • feature/course/src/main/java/com/teamsolply/solply/course/component/FavoriteTownTopBar.kt (1 hunks)
  • feature/course/src/main/java/com/teamsolply/solply/course/favoriteTown/FavoriteTownRoute.kt (1 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (16 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsContract.kt (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt (7 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.kt (2 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/CourseItem.kt (4 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/AddCourseBottomSheet.kt (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/EditCourseBottomSheet.kt (3 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/RenameCourseBottomSheet.kt (7 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/dialog/ReportPlaceDialog.kt (9 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/MypageScreen.kt (2 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/component/MypagePlaceAllScreen.kt (1 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/profile/ProfileEditScreen.kt (2 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/withdraw/WithdrawScreen.kt (1 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (0 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/AllowClauseScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectTownScreen.kt (2 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (5 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt (2 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/component/bottomsheet/PlaceOptionFilterSheet.kt (1 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt (1 hunks)
  • feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceContract.kt (1 hunks)
  • feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceScreen.kt (6 hunks)
  • feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceViewModel.kt (1 hunks)
  • feature/search/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (2 hunks)
  • remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt (1 hunks)
  • remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt (1 hunks)
๐Ÿ’ค Files with no reviewable changes (1)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt
๐Ÿงฐ Additional context used
๐Ÿงฌ Code graph analysis (8)
feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceViewModel.kt (1)
core/ui/src/main/java/com/teamsolply/solply/ui/base/BaseViewModel.kt (1)
  • reduce (44-46)
feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/RenameCourseBottomSheet.kt (1)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/button/SolplyButton.kt (1)
  • SolplyBasicButton (57-83)
feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.kt (1)
core/ui/src/main/java/com/teamsolply/solply/ui/base/BaseViewModel.kt (1)
  • reduce (44-46)
feature/maps/src/main/java/com/teamsolply/solply/maps/component/dialog/ReportPlaceDialog.kt (1)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/button/SolplyButton.kt (1)
  • SolplyBasicButton (57-83)
feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (1)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/header/SolplyHomeHeader.kt (1)
  • SolplyHomeHeader (22-82)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt (1)
core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt (1)
  • AdaptationImage (15-69)
feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (3)
feature/course/src/main/java/com/teamsolply/solply/course/favoriteTown/favoriteTownNavigation/FavoriteTownNavigation.kt (1)
  • favoriteTownNavGraph (20-32)
feature/search/src/main/java/com/teamsolply/solply/search/navigation/SearchNavigation.kt (1)
  • searchNavGraph (16-30)
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/snackbar/SolplySnackBar.kt (4)
  • SolplyTextSnackBar (37-53)
  • SolplyNotificationSnackBar (55-78)
  • SolplyNavigateSnackBar (80-113)
  • SolplyNavigateSimpleSnackBar (115-147)
feature/search/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (1)
feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (1)
  • navigateToBack (116-118)
๐Ÿ”‡ Additional comments (70)
feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/AddCourseBottomSheet.kt (1)

63-67: 28.dp ํ„ฐ์น˜ ์˜์—ญ ํฌ๊ธฐ ํ™•์ธ ํ•„์š” - ์„ค๊ณ„ ์˜๋„ ๊ฒ€์ฆ

์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒ€์ฆํ•œ ๊ฒฐ๊ณผ, 28.dp ํฌ๊ธฐ๋Š” ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋ณด์กฐ ์ž‘์—… ์•„์ด์ฝ˜(secondary action icons)์˜ ์ผ๊ด€๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค:

  • EditCourseBottomSheet.kt ์ค„ 159: ํŽธ์ง‘ ์•„์ด์ฝ˜ 28.dp
  • CourseItem.kt ์ค„ 130: ํŽธ์ง‘ ์•„์ด์ฝ˜ 28.dp
  • ๋‹ค๋ฅธ ๋ณด์กฐ ์ž‘์—… ์•„์ด์ฝ˜๋“ค: 20.dp, 24.dp
  • ์ฃผ์š” ์ž‘์—… ๋ฒ„ํŠผ๋งŒ: 48.dp (MainBottomBar)

28.dp๊ฐ€ Android ๊ถŒ์žฅ 48.dp๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์„ค๊ณ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. rippleEnabled = false ์„ค์ •์€ ์‹œ๊ฐ์  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ์˜๋„๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ์Šคํ…œ ๋ฌธ์„œ์—์„œ ์ด ํฌ๊ธฐ ์„ ํƒ์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/component/CourseItem.kt (3)

32-32: TextOverflow import ์ถ”๊ฐ€ ์ ์ ˆ

์•„๋ž˜ Text ์ปดํฌ์ €๋ธ”์—์„œ overflow ์„ค์ •์„ ์œ„ํ•ด ํ•„์š”ํ•œ import์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ๋„ ์—†์–ด ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.


65-69: ์„ ํƒ ์ƒํƒœ๋ณ„ ์ฃผ์†Œ ํฌ๋งท ๋ถ„๋ฆฌ ๋กœ์ง ์ ์ ˆ

selectedPlaceItem ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์›๋ณธ ์ฃผ์†Œ vs ์ถ•์•ฝ/ํฌ๋งทํŒ… ์ฃผ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ , ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค. ๋™์ผ ๋กœ์ง์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ค‘๋ณต ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.


98-98: Row ๋‚ด ํ…์ŠคํŠธ ์˜์—ญ์— weight ๋ถ€์—ฌํ•œ ๊ฒƒ ์ ์ ˆ

Column(modifier = Modifier.weight(1f))๋กœ ํ…์ŠคํŠธ ์˜์—ญ์ด ๊ฐ€๋ณ€ ํญ์„ ๊ฐ€์ง€๋„๋ก ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ์•„์ด์ฝ˜ ์˜์—ญ์„ ๊ณ ์ • ํญ์œผ๋กœ ๋‘๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ ˆ์ด์•„์›ƒ ์•ˆ์ •์„ฑ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ธด ํƒ€์ดํ‹€/์ฃผ์†Œ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ ์•„์ด์ฝ˜์ด ๋ฐ€๋ฆฌ์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐ ์œ ํšจํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

feature/course/src/main/java/com/teamsolply/solply/course/component/FavoriteTownTopBar.kt (1)

29-29: ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ ์กฐ์ •์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋‹จ ํŒจ๋”ฉ์„ 50.dp๋กœ ์ฆ๊ฐ€์‹œ์ผœ ์ „์ฒด ์•ฑ์˜ ์ผ๊ด€๋œ ๊ฐ„๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1)

118-118: ์ƒ๋‹จ ๊ฐ„๊ฒฉ ์กฐ์ •์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ 50.dp ๊ฐ„๊ฒฉ์„ ์ ์šฉํ•˜์—ฌ ์ผ๊ด€๋œ UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

feature/mypage/src/main/java/com/teamsolply/solply/mypage/withdraw/WithdrawScreen.kt (1)

105-106: ๋ ˆ์ด์•„์›ƒ ํŒจ๋”ฉ์ด ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ ์ ์šฉ ํ›„ ์ƒ๋‹จ ํŒจ๋”ฉ 50.dp๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•œ ๊ฐ„๊ฒฉ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt (1)

392-392: ๋ฐ”ํ…€์‹œํŠธ ๋‚ด๋ถ€ ๊ฐ„๊ฒฉ ์กฐ์ •์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

SNS ๋งํฌ ์„น์…˜๊ณผ ์˜ค๋ฅ˜ ์ œ๋ณด ์„น์…˜ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ 20.dp๋กœ ์ฆ๊ฐ€์‹œ์ผœ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

feature/collection/src/main/java/com/teamsolply/solply/collection/CollectionMenuScreen.kt (1)

136-137: ์ผ๊ด€๋œ ์ƒ๋‹จ ๊ฐ„๊ฒฉ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฉ”์ธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ 50.dp ์ƒ๋‹จ ํŒจ๋”ฉ์„ ์ ์šฉํ•˜์—ฌ ํ†ต์ผ๋œ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

feature/mypage/src/main/java/com/teamsolply/solply/mypage/component/MypagePlaceAllScreen.kt (1)

38-39: ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ์ด ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ ์ ์šฉ ํ›„ ์ƒ๋‹จ ํŒจ๋”ฉ 50.dp๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์•ฑ ์ „์ฒด์˜ ์ผ๊ด€๋œ ๊ฐ„๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/topbar/SolplyTopBar.kt (1)

48-48: ํ…์ŠคํŠธ ํŒจ๋”ฉ ์ œ๊ฑฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ํŒจ๋”ฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒ์œ„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ผ๊ด€๋œ ๊ฐ„๊ฒฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์—์„œ ์ƒ๋‹จ ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

feature/course/src/main/java/com/teamsolply/solply/course/favoriteTown/FavoriteTownRoute.kt (1)

103-103: ViewModel์˜ selectedTownId ๊ฒ€์ฆ์ด ์ด๋ฏธ ์กด์žฌํ•˜์—ฌ ์•ˆ์ „์„ฑ ํ™•๋ณด๋จ

๊ฒ€์ฆ ๊ฒฐ๊ณผ, FavoriteTownRoute.kt ๋ผ์ธ 103์˜ onClick ํ•ธ๋“ค๋Ÿฌ๋Š” isButtonEnabled ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ConfirmSelection ์ธํ…ํŠธ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ FavoriteViewModel.patchUserFavoriteTown() (๋ผ์ธ 47)์—์„œ val selectedTownId = s.selectedTownId ?: return๋กœ null์„ ์ฒดํฌํ•˜๊ณ  ์กฐ๊ธฐ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ๋ฒ„ํŠผ์ด ์‹œ๊ฐ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ํด๋ฆญ๋˜์–ด๋„ ์‹ค์ œ ์ž‘์—…์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ViewModel์ด ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ํ˜„์žฌ ๊ตฌํ˜„์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

feature/mypage/src/main/java/com/teamsolply/solply/mypage/profile/ProfileEditScreen.kt (2)

120-121: ์ƒ๋‹จ ์—ฌ๋ฐฑ ์ถ”๊ฐ€ ํ™•์ธ

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ์ผ๊ด€๋˜๊ฒŒ 50.dp ์ƒ๋‹จ ํŒจ๋”ฉ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PR ์ „๋ฐ˜์— ๊ฑธ์นœ UI ๊ฐ„๊ฒฉ ํ‘œ์ค€ํ™” ์ž‘์—…์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


201-201: Now I need to examine the SolplyButton.kt file directly to understand the implementation:The web search results aren't specific to the codebase. Based on the earlier findings, I have enough information to make a determination. Let me now examine the specific usages more carefully and provide a comprehensive analysis:

Based on my analysis of the script results showing all SolplyBasicButton usages, I can now provide a comprehensive assessment:

๊ฒ€์ฆ ๋กœ์ง ์ด๋™์— ๋”ฐ๋ฅธ button ๋™์ž‘ ๋ณ€๊ฒฝ ํ™•์ธ ์™„๋ฃŒ

์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ SolplyBasicButton์˜ ์‚ฌ์šฉ ํŒจํ„ด์„ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถˆ์ผ์น˜๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค:

ํ˜„์žฌ ์ฝ”๋“œ๋ฒ ์ด์Šค ํŒจํ„ด:

  • WithdrawScreen.kt (162-167): if (buttonEnabled) ์กฐ๊ฑด ์ฒดํฌ๋ฅผ onClick ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰
  • ProfileEditScreen.kt (๋ณ€๊ฒฝ ํ›„): selected = isEditSuccess์ด์ง€๋งŒ onClick ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ
  • ๋‚˜๋จธ์ง€ ํ™”๋ฉด๋“ค (SelectTownScreen, SelectPersonaScreen, AllowClauseScreen ๋“ฑ): selected = isButtonEnabled ๋“ฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

๋ฌธ์ œ์ :
๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ํŒจํ„ด์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๊ฒ€์ฆ ๋กœ์ง์„ ํ˜ธ์ถœ์ž์—์„œ ์ฒ˜๋ฆฌ (WithdrawScreen ํŒจํ„ด)
  2. ๊ฒ€์ฆ์„ selected ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฒ˜๋ฆฌ (๋ณ€๊ฒฝ๋œ ProfileEditScreen ํŒจํ„ด)

์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์˜๋„๋œ ๋™์ž‘์ธ์ง€ ํ™•์ธ์ด ํ•„์š”ํ•˜๋ฉฐ, SolplyBasicButton์˜ selected=false์ผ ๋•Œ onClick ํ˜ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™”๋ฉด๋“ค(ํŠนํžˆ RegisterPlaceScreen์—์„œ ๋ณต์žกํ•œ ์„ ํƒ ์กฐ๊ฑด ์‚ฌ์šฉ)๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

feature/collection/src/main/java/com/teamsolply/solply/collection/collection/component/CollectionScreen.kt (1)

46-47: ์ผ๊ด€๋œ ์ƒ๋‹จ ์—ฌ๋ฐฑ ์ ์šฉ

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ 50.dp ์ƒ๋‹จ ํŒจ๋”ฉ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์•ฑ์˜ UI ๊ฐ„๊ฒฉ ์ผ๊ด€์„ฑ์„ ์œ„ํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

feature/mypage/src/main/java/com/teamsolply/solply/mypage/MypageScreen.kt (3)

128-129: ์ผ๊ด€๋œ ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ ์ ์šฉ

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ 50.dp ์ƒ๋‹จ ํŒจ๋”ฉ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ์ƒ‰๋„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ๋ ˆ์ด์•„์›ƒ์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


134-134: Modifier ์ฒด์ด๋‹ ๊ฐ„์†Œํ™”

Row์˜ modifier๊ฐ€ ๋‹จ์ผ ํ˜ธ์ถœ๋กœ ๊ฐ„์†Œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


143-143: ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ํŒจ๋”ฉ ์กฐ์ •

์ƒ๋‹จ ์—ฌ๋ฐฑ์ด Column ๋ ˆ๋ฒจ์—์„œ ์ ์šฉ๋˜๋ฉด์„œ Icon์˜ ๊ฐœ๋ณ„ top padding์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ์™€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt (1)

398-399: ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์Šคํƒ€์ผ๋ง ๊ฐœ์„ 

ํ”Œ๋ ˆ์ด์Šคํ™€๋”์˜ ์ƒ‰์ƒ์ด ๋” ์ง„ํ•˜๊ฒŒ(gray500 โ†’ gray600) ๋ณ€๊ฒฝ๋˜๊ณ , ํ…์ŠคํŠธ ์Šคํƒ€์ผ์ด ๋” ํฌ๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ(caption12M โ†’ body14R)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์ด ๊ฐœ์„ ๋˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyCourseCard.kt (1)

82-86: ์˜ค๋ฒ„๋ ˆ์ด ๋ชจ์„œ๋ฆฌ ๋‘ฅ๊ธ€๊ธฐ ๊ฐœ์„ 

๋ฐ˜ํˆฌ๋ช… ์˜ค๋ฒ„๋ ˆ์ด์— ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ ๋‘ฅ๊ธ€๊ธฐ(4.dp)๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ๋ชจ์„œ๋ฆฌ๊ฐ€ ๋‘ฅ๊ธ€๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด ์นด๋“œ์˜ ์‹œ๊ฐ์  ์™„์„ฑ๋„๊ฐ€ ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.

feature/search/src/main/java/com/teamsolply/solply/search/SearchScreen.kt (2)

99-99: ์ผ๊ด€๋œ ์ƒ๋‹จ ์—ฌ๋ฐฑ ์ ์šฉ

๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ ์ƒ๋‹จ ํŒจ๋”ฉ์ด 50.dp๋กœ ์ฆ๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PR ์ „๋ฐ˜์˜ UI ๊ฐ„๊ฒฉ ํ‘œ์ค€ํ™” ์ž‘์—…์ž…๋‹ˆ๋‹ค.


103-107: ํ„ฐ์น˜ ์˜์—ญ ๋ช…ํ™•ํ™”

ํด๋ฆญ ๊ฐ€๋Šฅ ์˜์—ญ์ด Row ์ „์ฒด์—์„œ Icon์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์˜์—ญ์ด ๋” ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/button/SolplyButton.kt (1)

72-72: onClick ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ - ์„ค๊ณ„ ์ผ๊ด€์„ฑ ๋ฐ ๋ฌธ์„œํ™” ๊ฐœ์„  ํ•„์š”

ํ˜„์žฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ฒ˜(SelectPersonaScreen, SelectTownScreen, AllowClauseScreen, ProfileEditScreen, FavoriteTownRoute ๋“ฑ 8๊ฐœ ํŒŒ์ผ)๋ฅผ ๊ฒ€ํ† ํ•œ ๊ฒฐ๊ณผ, selected ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ด๋ฏธ enabledBackgroundColor/disabledBackgroundColor์™€ ํ•จ๊ป˜ enable/disable ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋Š” ์˜๋„๋œ ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๋‹ค์Œ ๊ฐœ์„ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. ์„ค๊ณ„ ๋ถˆ์ผ์น˜: ๊ฐ™์€ ํŒŒ์ผ์˜ AddLocalAreaButton์€ selected ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด onClick์„ ํ•ญ์ƒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. SolplyBasicButton๊ณผ์˜ ๋™์ž‘ ์ผ๊ด€์„ฑ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.

  2. ๋ช…ํ™•ํ•œ ๋ฌธ์„œํ™”: selected=false์ผ ๋•Œ onClick์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋™์ž‘์„ KDoc ์ฃผ์„์œผ๋กœ ๋ช…์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ API ๊ณ„์•ฝ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์„ธ์š”.

  3. ๋Œ€์•ˆ ๊ฒ€ํ† : enabled ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜ ์ด๋ฆ„/์ฃผ์„์„ ํ†ตํ•ด ์ด ๋™์ž‘์ด ์˜๋„์ ์ž„์„ ๋ถ„๋ช…ํžˆ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/MapsContract.kt (1)

88-89: ์ƒˆ๋กœ์šด ์ธํ…ํŠธ ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ResetSelectedUris์™€ ChangeRenameCourse ์ธํ…ํŠธ๊ฐ€ ๊ธฐ์กด ํŒจํ„ด๊ณผ ์ผ๊ด€๋˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/bottomsheet/SolplyBasicBottomSheet.kt (4)

33-35: ๋ฐ”ํ…€ ์‹œํŠธ ํฌ๊ธฐ ์กฐ์ •์„ ํ™•์ธํ•˜์„ธ์š”.

fullyExpanded์™€ slightlyExpanded ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋””๋ฐ”์ด์Šค์—์„œ ๋ฐ”ํ…€ ์‹œํŠธ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.


40-40: zIndex ๋ ˆ์ด์–ด๋ง์˜ ์˜ํ–ฅ์„ ๊ฒ€์ฆํ•˜์„ธ์š”.

zIndex(1f)๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋ฐ”ํ…€ ์‹œํŠธ๊ฐ€ ๋‹ค๋ฅธ UI ์š”์†Œ ์œ„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒ์—…์ด๋‚˜ ๋‹ค์ด์–ผ๋กœ๊ทธ์™€์˜ z-order ์ถฉ๋Œ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.


46-46: ์‹œ์Šคํ…œ ์ธ์…‹ ์ฒ˜๋ฆฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

WindowInsets(0, 0, 0, 0)๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ์น˜๋‚˜ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ธฐ๊ธฐ์—์„œ ์‹œ์Šคํ…œ ๋ฐ” ์˜์—ญ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


47-57: ๋“œ๋ž˜๊ทธ ํ•ธ๋“ค ์ถ”๊ฐ€๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ์‹œ๊ฐ์  ๋“œ๋ž˜๊ทธ ํ•ธ๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (3)

123-128: ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ์ด ์ผ๊ด€์„ฑ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

innerPadding์„ paddingValue๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


437-481: Popup์˜ ํ•ด์ œ ๋ถˆ๊ฐ€ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜์„ธ์š”.

์Šค๋‚ต๋ฐ”๊ฐ€ Popup์œผ๋กœ ๋ž˜ํ•‘๋˜์–ด dismissOnBackPress = false์™€ dismissOnClickOutside = false๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์Šค๋‚ต๋ฐ”๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ•ด์ œํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šค๋‚ต๋ฐ” ํƒ€์ž…์—์„œ ์ด๊ฒƒ์ด ์˜๋„๋œ ๋™์ž‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”.


440-440: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์˜คํ”„์…‹ ๊ฐ’์„ ํ™•์ธํ•˜์„ธ์š”.

์˜คํ”„์…‹์ด IntOffset(0, -32)๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋ฐฉํ–ฅ์—์„œ ์Šค๋‚ต๋ฐ” ์œ„์น˜๊ฐ€ ์ ์ ˆํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/SolplyPlaceCard.kt (2)

87-100: null ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋™์ž‘์„ ๋ช…ํ™•ํžˆ ํ•˜์„ธ์š”.

imgRes๊ฐ€ null์ผ ๋•Œ AdaptationImage๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ isImageReady๊ฐ€ ํ•ญ์ƒ false๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ์นด๋“œ๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค (line 64์˜ touchable && isImageReady ์กฐ๊ฑด). ์ด๊ฒƒ์ด ์˜๋„๋œ ๋™์ž‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ์žฅ์†Œ ์นด๋“œ๋„ ํด๋ฆญ ๊ฐ€๋Šฅํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ ์—†์–ด๋„ ์นด๋“œ๋ฅผ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด:

 Column(
     modifier = modifier
         .fillMaxWidth()
         .then(
-            if (touchable && isImageReady) {
+            if (touchable && (isImageReady || imgRes == null)) {
                 Modifier.customClickable(rippleEnabled = false) { onClick() }
             } else {
                 Modifier
             }
         ),

42-42: ๊ฒ€ํ†  ์˜๊ฒฌ์ด ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค - Kotlin ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์˜คํ•ด์ž…๋‹ˆ๋‹ค.

imgRes ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ String์—์„œ String?๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ Kotlin์—์„œ breaking change๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Kotlin์˜ ํƒ€์ž… ํ˜ธํ™˜์„ฑ ๊ทœ์น™์— ๋”ฐ๋ฅด๋ฉด, ๋งค๊ฐœ๋ณ€์ˆ˜์— null ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ **์—ญ๋ฐฉํ–ฅ ํ˜ธํ™˜(backward compatible)**์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ํ˜ธ์ถœ์ž๋Š” String ๊ฐ’์„ ๊ณ„์† String? ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Breaking change๊ฐ€ ๋˜๋ ค๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (String? โ†’ String์€ ๋ชจ๋“  ํ˜ธ์ถœ์ž๊ฐ€ null ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ).

์‹ค์ œ๋กœ ํ™•์ธ๋œ ์‚ฌํ•ญ:

  • ํ•จ์ˆ˜ ๊ตฌํ˜„์—์„œ if (imgRes != null) ์กฐ๊ฑด์œผ๋กœ null์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ
  • 4๊ฐœ ํ˜ธ์ถœ ์œ„์น˜ ๋ชจ๋‘ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ „๋‹ฌ
  • ํ˜ธ์ถœ์ž ์—…๋ฐ์ดํŠธ ๋ถˆํ•„์š”

Likely an incorrect or invalid review comment.

data/place/src/main/java/com/teamsolply/solply/place/repository/PlaceRepositoryImpl.kt (1)

108-108: ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ผ๊ด€์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

dto.mainTag์—์„œ dto.primaryTag๋กœ ๋ณ€๊ฒฝ์ด ๋งคํผ์™€ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

data/place/src/main/java/com/teamsolply/solply/place/mapper/PlaceEntityMapper.kt (1)

11-11: ๊ฒ€์ฆ ์™„๋ฃŒ: ํ•„๋“œ ๋งคํ•‘์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

PlaceDto์— primaryTag ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ(data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt 24๋ฒˆ ์ค„), PlaceEntityMapper.kt 11๋ฒˆ ์ค„์˜ ๋งคํ•‘์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. mainTag์—์„œ primaryTag๋กœ์˜ ํ•„๋“œ๋ช… ๋ณ€๊ฒฝ์ด ์ œ๋Œ€๋กœ ๋ฐ˜์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt (1)

67-75: ์„ ํƒ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ onNextClick์ด ํ˜ธ์ถœ๋˜๋Š” ๋™์ž‘ ์˜๋„ ํ™•์ธ ํ•„์š”

์ด์ œ isButtonEnabled๊ฐ€ false์—ฌ๋„ onNextClick()์ด ํ•ญ์ƒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. SolplyBasicButton์ด ์ž์ฒด์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฏธ์„ ํƒ ์ƒํƒœ์—์„œ๋„ ์˜จ๋ณด๋”ฉ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์–ด์„œ, ์ด ์ผ€์ด์Šค๋ฅผ onNextClick ์ชฝ์—์„œ ๊ฒ€์ฆ/์ฐจ๋‹จํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ•œ ๋ฒˆ๋งŒ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt (1)

12-12: async ๋„์ž…์„ ์œ„ํ•œ import ์ถ”๊ฐ€๋Š” ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค

์•„๋ž˜ fetchInitInfo์—์„œ ๋ณ‘๋ ฌ ํ˜ธ์ถœ์„ ์œ„ํ•ด async๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์™€ ์ผ๊ด€๋œ import๋ผ์„œ ๋ฌธ์ œ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

domain/place/src/main/java/com/teamsolply/solply/place/model/PlaceEntity.kt (1)

3-9: thumbnailImageUrl nullable ์ „ํ™˜์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ์ฒ˜ null ์ฒ˜๋ฆฌ ํ™•์ธ ๊ถŒ์žฅ

thumbnailImageUrl๊ฐ€ String?๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งคํผ/UI ์ชฝ์—์„œ๋„ ๋ชจ๋‘ null ํ—ˆ์šฉ ์ „์ œ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์•ฝ์ƒ PlaceData.thumbnailUrl๋„ nullable๋กœ ๋งž์ถฐ์ง„ ๊ฒƒ ๊ฐ™์ง€๋งŒ,

  • !!.,
  • ๋ฐ”๋กœ ์ด๋ฏธ์ง€ ๋กœ๋”์— ๋„˜๊ธฐ๋ฉด์„œ null์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ,

๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด ๋Ÿฐํƒ€์ž„ NPE๋‚˜ ํ”Œ๋ ˆ์ด์Šคํ™€๋” ๋ฏธํ‘œ์‹œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ•ด๋‹น ํ•„๋“œ ์‚ฌ์šฉ์ฒ˜ ํ•œ ๋ฒˆ๋งŒ ์ „์ฒด์ ์œผ๋กœ ์Šค์บ”ํ•ด ๋ด ์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

feature/place/src/main/java/com/teamsolply/solply/place/model/PlaceData.kt (1)

8-8: nullable ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ ์™„๋ฃŒ

thumbnailUrl์„ nullable๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ API ์‘๋‹ต์—์„œ ์ธ๋„ค์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ PlaceEntity, PlaceDto ๋“ฑ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt (1)

69-70: ์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ ์ œ๊ฑฐ ํ™•์ธ

onClick ํ•ธ๋“ค๋Ÿฌ์—์„œ state.isOnBoardingSuccess ์ฒดํฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฌด์กฐ๊ฑด ShowStartingScreen์„ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AI summary์— ๋”ฐ๋ฅด๋ฉด SolplyBasicButton์ด selected ์ƒํƒœ์ผ ๋•Œ๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ onClick์„ ์ „๋‹ฌํ•˜๋ฏ€๋กœ, ๊ฐ€๋“œ ๋กœ์ง์ด ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ๋กœ ์ด๋™ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectTownScreen.kt (2)

141-141: ์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ ์ œ๊ฑฐ - ์ผ๊ด€๋œ ํŒจํ„ด

"์™„๋ฃŒ" ๋ฒ„ํŠผ์˜ onClick ํ•ธ๋“ค๋Ÿฌ์—์„œ isButtonEnabled ์ฒดํฌ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. SolplyBasicButton์ด selected ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ํด๋ฆญ์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, NamingScreen ๋ฐ ๋‹ค๋ฅธ ์˜จ๋ณด๋”ฉ ํ™”๋ฉด๋“ค๊ณผ ์ผ๊ด€๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.


157-157: ์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ ์ œ๊ฑฐ ํ™•์ธ

"๋‹ค์Œ" ๋ฒ„ํŠผ๋„ ๋™์ผํ•˜๊ฒŒ ์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ, ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

remote/place/src/main/java/com/teamsolply/solply/place/datasource/PlaceRemoteDataSourceImpl.kt (1)

37-50: API ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ™•์ธ

subTag1Ids/subTag2Ids๋ฅผ subTagAIdList/subTagBIdList๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. null ์ฒดํฌ ๋ฐ ์‰ผํ‘œ ๊ตฌ๋ถ„ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด ๊ธฐ๋Šฅ์ƒ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. PlaceService์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ๋„ ์ผ๊ด€๋˜๊ฒŒ ์ •๋ ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

remote/place/src/main/java/com/teamsolply/solply/place/service/PlaceService.kt (1)

32-33: Retrofit ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ

API ๊ณ„์•ฝ์— ๋งž์ถฐ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ subTag1Ids/subTag2Ids์—์„œ subTagAIdList/subTagBIdList๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/EditCourseBottomSheet.kt (4)

83-84: ์ƒˆ ์ฝœ๋ฐฑ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€

์ฝ”์Šค ํŽธ์ง‘ ์™„๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ finishEditCourseClick ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. MapsViewModel์˜ ์ƒˆ๋กœ์šด intent์™€ ํ•จ๊ป˜ ์ฝ”์Šค ํŽธ์ง‘ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.


151-151: ๊ฐ„๊ฒฉ ์กฐ์ •

์ฝ”์Šค ์ด๋ฆ„ ํ•˜๋‹จ ํŒจ๋”ฉ์ด 4.dp์—์„œ 8.dp๋กœ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์  ๊ฐ„๊ฒฉ ๊ฐœ์„ ์„ ์œ„ํ•œ ๋งˆ์ด๋„ˆ UI ์กฐ์ •์ž…๋‹ˆ๋‹ค.


158-162: ํŽธ์ง‘ ์•„์ด์ฝ˜ ํด๋ฆญ ๊ฐ€๋Šฅ ์˜์—ญ ๊ฐœ์„ 

ํŽธ์ง‘ ์•„์ด์ฝ˜์— customClickable์„ ์ ์šฉํ•˜๊ณ  ํฌ๊ธฐ๋ฅผ 24.dp์—์„œ 28.dp๋กœ ์ฆ๊ฐ€์‹œ์ผœ ํ„ฐ์น˜ ์˜์—ญ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.


300-300: ์™„๋ฃŒ ๋ฒ„ํŠผ ๋™์ž‘ ๋ณ€๊ฒฝ

"์™„๋ฃŒ" ๋ฒ„ํŠผ์ด ์ด์ œ finishEditCourseClick()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ฝœ๋ฐฑ ๊ตฌ์กฐ์™€ ์ผ๊ด€๋œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/card/RegisterPlaceImage.kt (2)

37-37: ์ด๋ฏธ์ง€ ์„ ํƒ ํ•ด์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

resetSelectedUris ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ ํƒ๋œ ์ด๋ฏธ์ง€๋ฅผ ํƒญํ•˜์—ฌ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์— ๋„์›€์ด ๋˜๋Š” ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.


51-54: ์„ ํƒ๋œ ์ด๋ฏธ์ง€ ํด๋ฆญ ์ฒ˜๋ฆฌ

์„ ํƒ๋œ ์ด๋ฏธ์ง€์— customClickable์„ ์ ์šฉํ•˜์—ฌ ํด๋ฆญ ์‹œ resetSelectedUris(index)๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง๊ด€์ ์ธ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ UX๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (2)

234-235: ๊ฐœ์ธํ™”๋œ ์ถ”์ฒœ ํ…์ŠคํŠธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

CustomHorizontalPager์— persona์™€ nickname ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋งž์ถคํ˜• ์ถ”์ฒœ ํ—ค๋”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์ธํ™”ํ•˜๋Š” ์ข‹์€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.


404-420: ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ฐฐ๊ฒฝ ๋ฐ ์ถ”์ฒœ ํ—ค๋” UI ์ถ”๊ฐ€

์ถ”์ฒœ ์˜์—ญ์— ๊ทธ๋ผ๋ฐ์ด์…˜ ๋ฐฐ๊ฒฝ๊ณผ persona ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ํ…์ŠคํŠธ ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์ ์œผ๋กœ ์„น์…˜์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ฐœ์ธํ™”๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜์—ฌ UX๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

data/place/src/main/java/com/teamsolply/solply/place/dto/response/GetPlacesResponseDto.kt (3)

23-24: ํ•„๋“œ๋ช… ๋ณ€๊ฒฝ ํ™•์ธ

mainTag์—์„œ primaryTag๋กœ ํ•„๋“œ๋ช…์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ API ์ŠคํŽ™ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์š”์•ฝ์— ๋”ฐ๋ฅด๋ฉด ๊ด€๋ จ ๋งคํผ(PlaceEntityMapper, PlaceRepositoryImpl)๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


29-30: ์ƒˆ๋กœ์šด ํ•„์ˆ˜ ํ•„๋“œ ์ถ”๊ฐ€

townId ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ API๊ฐ€ ์ด ํ•„๋“œ๋ฅผ ํ•ญ์ƒ ์ œ๊ณตํ•˜๋Š”์ง€, ๊ธฐ์กด ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


21-21: ๋ฆฌ๋ทฐ ์˜๊ฒฌ์ด ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค

๊ฒ€์ฆ ๊ฒฐ๊ณผ, thumbnailImageUrl ํ•„๋“œ ๋ณ€๊ฒฝ์€ null ์ฒ˜๋ฆฌ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • GetPlacesResponseDto.PlaceDto (String?) โ†’ PlaceEntity (String?): ํƒ€์ž… ์ผ์น˜
  • PlaceViewModel์—์„œ PlaceData.thumbnailUrl (String?): null ์•ˆ์ „
  • RecommendPlaceInfo์™€ SearchResultEntity๋Š” ๋ณ„๋„ DTO ์‚ฌ์šฉ์œผ๋กœ ์˜ํ–ฅ ์—†์Œ

์ด ๋ณ€๊ฒฝ์€ ๋ฐ์ดํ„ฐ ๊ณ„์ธต ๋‚ด์—์„œ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, UI ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฏธ nullable ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

feature/search/src/main/java/com/teamsolply/solply/registerplace/RegisterPlaceScreen.kt (3)

221-221: ์ƒ๋‹จ ํŒจ๋”ฉ ์ฆ๊ฐ€

์ƒ๋‹จ ํŒจ๋”ฉ์ด 16.dp์—์„œ 50.dp๋กœ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ƒํƒœ ํ‘œ์‹œ์ค„ ์˜์—ญ์„ ๊ณ ๋ คํ•œ ์กฐ์ •์œผ๋กœ ๋ณด์ด๋ฉฐ, PR ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.


536-540: Shape ๊ฐœ์„ 

ํ‚ค์›Œ๋“œ ๋ฒ„ํŠผ์˜ shape์„ RoundedCornerShape(16.dp)์—์„œ CircleShape์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋ช…ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ ์‹œ๊ฐ์ ์œผ๋กœ๋„ ์ ์ ˆํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.


129-131: ์„ ํƒ๋œ URI ๋ฆฌ์…‹ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

resetSelectedUris ์ฝœ๋ฐฑ์ด ์ถ”๊ฐ€๋˜์–ด ํŠน์ • ์ธ๋ฑ์Šค์˜ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Composition ๊ณ„์ธต์„ ํ†ตํ•ด ์ ์ ˆํžˆ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„์ด ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 175-175, 462-462

feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt (3)

484-487: ์ง€๋„ UI ์„ค์ • ์ถ”๊ฐ€

๋„ค์ด๋ฒ„ ์ง€๋„์˜ ๊ธฐ๋ณธ ์คŒ ์ปจํŠธ๋กค๊ณผ ๋‚˜์นจ๋ฐ˜์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ UI๋ฅผ ์œ„ํ•œ ์ ์ ˆํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.


286-286: ์ฝ”์Šค ํŽธ์ง‘ ๋ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ”Œ๋กœ์šฐ ๊ฐœ์„ 

finishEditCourseClick์™€ onChangeRenameCourse ์ฝœ๋ฐฑ์ด ์ถ”๊ฐ€๋˜์–ด ํŽธ์ง‘ ์™„๋ฃŒ ๋ฐ ์ฝ”์Šค ์ •๋ณด ์—…๋ฐ์ดํŠธ ํ๋ฆ„์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Composition ๊ณ„์ธต์„ ํ†ตํ•ด ์ผ๊ด€๋˜๊ฒŒ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 355-357, 404-404, 658-658


335-337: ์ œ๋ณด ์ด๋ฏธ์ง€ ๋ฆฌ์…‹ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

resetSelectedUris ์ฝœ๋ฐฑ์ด ReportPlaceDialog์— ์ถ”๊ฐ€๋˜์–ด ๊ฐœ๋ณ„ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. Intent ์‹œ์Šคํ…œ๊ณผ ์ž˜ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.kt (3)

269-275: ์ฝ”์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ UI ์ƒํƒœ ์ดˆ๊ธฐํ™”

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


277-284: ์ฝ”์Šค ์ •๋ณด ์—…๋ฐ์ดํŠธ ๋กœ์ง ์ถ”๊ฐ€

ChangeRenameCourse Intent๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ฝ”์Šค๋ช…๊ณผ ์†Œ๊ฐœ๋ฅผ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.


337-342: URI ๋ฆฌ์…‹ ๋กœ์ง ๊ตฌํ˜„

ResetSelectedUris Intent๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ํŠน์ • ์ธ๋ฑ์Šค์˜ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/RenameCourseBottomSheet.kt (3)

128-132: ์ž…๋ ฅ ๊ธธ์ด ์ œํ•œ ๊ตฌํ˜„

์ฝ”์Šค ์ด๋ฆ„(18์ž)๊ณผ ์†Œ๊ฐœ(20์ž)์— ๋Œ€ํ•œ ์ž…๋ ฅ ๊ธธ์ด ์ œํ•œ์ด ์ ์ ˆํžˆ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 153-157


135-142: ๊ธ€์ž ์ˆ˜ ํ‘œ์‹œ ์ถ”๊ฐ€

์ž…๋ ฅ ํ•„๋“œ ํ•˜๋‹จ์— ํ˜„์žฌ ๊ธ€์ž ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ UX ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

Also applies to: 160-166


98-118: ํ—ค๋” ๋ ˆ์ด์•„์›ƒ ๊ฐœ์„ 

ํ—ค๋”๋ฅผ Box์—์„œ Row๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋ช…ํ™•ํ•œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

feature/maps/src/main/java/com/teamsolply/solply/maps/component/dialog/ReportPlaceDialog.kt (3)

90-103: Dialog์—์„œ Popup์œผ๋กœ ์ „ํ™˜

Dialog ๋Œ€์‹  Popup์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์„ธ๋ฐ€ํ•œ ๋™์ž‘ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. WindowInsets ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ UI์™€์˜ ๊ฒน์นจ์„ ๋ฐฉ์ง€ํ•˜๊ณ , dismissOnClickOutside = false ์„ค์ •์œผ๋กœ ์‹ค์ˆ˜๋กœ ๋‹ซํžˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ๋œ Box ๊ตฌ์กฐ๊ฐ€ ๋‹ค์†Œ ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, Popup์˜ ์ „์ฒด ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ๊ณผ ์ ์ ˆํ•œ ํŒจ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค.

Also applies to: 104-240


81-81: ์ด๋ฏธ์ง€ ๋ฆฌ์…‹ ๊ธฐ๋Šฅ ํ†ตํ•ฉ

resetSelectedUris ์ฝœ๋ฐฑ์ด ReportPlaceDialog โ†’ ReportContentScreen โ†’ RegisterPlaceImage๋กœ ์ ์ ˆํžˆ ์ „๋‹ฌ๋˜์–ด ์ œ๋ณด ๋‹ค์ด์–ผ๋กœ๊ทธ์—์„œ๋„ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

Also applies to: 191-191, 298-298, 366-366


145-170: ํ—ค๋” ๋„ค๋น„๊ฒŒ์ด์…˜ ์ถ”๊ฐ€

๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ๊ณผ ์ œ๋ชฉ์ด ํฌํ•จ๋œ ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ € ํŽ˜์ด์ง€์— ๋”ฐ๋ผ ๋™์ž‘์ด ์ ์ ˆํžˆ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค (์ฒซ ํŽ˜์ด์ง€: ๋‹ซ๊ธฐ, ๋‘ ๋ฒˆ์งธ ํŽ˜์ด์ง€: ์ด์ „์œผ๋กœ).

Comment on lines +14 to +15
@SerialName("townName") val townName: String,
@SerialName("parentTownId") val parentTownId: Long?
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸก Minor

๐Ÿงฉ Analysis chain

DTO ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ ํ•„์ˆ˜ ํ•„๋“œ ์ถ”๊ฐ€

TownNodeDto๊ฐ€ ์ค‘์ฒฉ ๊ตฌ์กฐ์—์„œ ํ‰๋ฉด ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • townName์ด nullable์—์„œ non-nullable๋กœ ๋ณ€๊ฒฝ (ํ•„์ˆ˜ ํ•„๋“œ)
  • parentTownId ์ถ”๊ฐ€ (๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„ ํ‘œํ˜„)
  • ๊ธฐ์กด name, subTowns ํ•„๋“œ ์ œ๊ฑฐ

๋ฐฑ์—”๋“œ API๊ฐ€ townName์„ ํ•ญ์ƒ ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. null์ด ์ „์†ก๋˜๋ฉด ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# TownNodeDto ์‚ฌ์šฉ์ฒ˜ ํ™•์ธ
rg -nP --type=kotlin -C3 'TownNodeDto' -g '!**/test/**'

Length of output: 1378


Let me check the complete TownNodeDto definition to see all fields:Based on my verification of the Kotlin serialization behavior and the code structure, I can now generate the rewritten review comment:

๋ฐฑ์—”๋“œ API ์‘๋‹ต ๊ฒ€์ฆ ํ•„์ˆ˜

townName: String์€ ํ•„์ˆ˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. kotlinx.serialization์˜ ๊ธฐ๋ณธ ์„ค์ •(explicitNulls=true)์—์„œ non-nullable ํ•„๋“œ๋Š” JSON์— ๋ฐ˜๋“œ์‹œ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ฐฑ์—”๋“œ๊ฐ€ ์ด ํ•„๋“œ๋ฅผ ํ•ญ์ƒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ parentTownId: Long?์€ ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋Š” nullable ํ•„๋“œ์ด๋ฏ€๋กœ, ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด์•ผ kotlinx.serialization์—์„œ ์„ ํƒ์  ํ•„๋“œ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ์ง€์—ญ(๋ถ€๋ชจ๊ฐ€ ์—†๋Š”)์˜ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ parentTownId: Long? = null๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ API ์‘๋‹ต์—์„œ townName์ด ํ•ญ์ƒ ์กด์žฌํ•˜๊ณ  null์ด ์•„๋‹Œ์ง€ ํ™•์ธ
  • parentTownId๊ฐ€ ์„ ํƒ์  ํ•„๋“œ์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ ํ• ๋‹น ๊ถŒ์žฅ
๐Ÿค– Prompt for AI Agents
In
data/course/src/main/java/com/teamsolply/solply/course/favoriteTown/dto/TownTreeResponseDto.kt
around lines 14-15, the DTO declares townName: String (non-nullable) and
parentTownId: Long? (nullable without default); ensure the backend always
supplies a non-null townName, and make parentTownId optional by giving it a
default value so kotlinx.serialization treats it as optional โ€” change
parentTownId to have a default of null (parentTownId: Long? = null) and verify
the API always returns a non-null townName.

Comment on lines +64 to +67
val isButtonEnabled = newCourseName.isNotEmpty() &&
newCourseName.length != 18 &&
newCourseIntroduction.isNotEmpty() &&
newCourseIntroduction.length != 20
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐Ÿ”ด Critical

๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋กœ์ง ์˜ค๋ฅ˜

๋ฒ„ํŠผ ํ™œ์„ฑํ™” ์กฐ๊ฑด์— ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Line 65: newCourseName.length != 18 - ๊ธธ์ด๊ฐ€ ์ •ํ™•ํžˆ 18์ผ ๋•Œ๋งŒ ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค
  • Line 67: newCourseIntroduction.length != 20 - ๊ธธ์ด๊ฐ€ ์ •ํ™•ํžˆ 20์ผ ๋•Œ๋งŒ ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค

์ด๋Š” ์˜๋„ํ•œ ๋™์ž‘์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ์„ ์ฒดํฌํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

-    val isButtonEnabled = newCourseName.isNotEmpty() &&
-        newCourseName.length != 18 &&
-        newCourseIntroduction.isNotEmpty() &&
-        newCourseIntroduction.length != 20
+    val isButtonEnabled = newCourseName.isNotEmpty() &&
+        newCourseName.length <= 18 &&
+        newCourseIntroduction.isNotEmpty() &&
+        newCourseIntroduction.length <= 20
๐Ÿค– Prompt for AI Agents
In
feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/RenameCourseBottomSheet.kt
around lines 64 to 67, the button-enabled condition incorrectly uses != to check
lengths (disabling only when length equals exactly 18 or 20); change those
checks to enforce maximum length (e.g., newCourseName.length <= 18 and
newCourseIntroduction.length <= 20) while keeping the non-empty checks so the
button is enabled only when both fields are non-empty and within their max
lengths.

Comment on lines +140 to 141
onClick = { onNextClick() },
selected = isAllChecked,
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐Ÿ”ด Critical

ํ•„์ˆ˜ ์•ฝ๊ด€ ๋™์˜๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

"๋‹ค์Œ" ๋ฒ„ํŠผ์˜ onClick์ด isAllChecked ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์‹คํ–‰๋˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์ˆ˜ ์•ฝ๊ด€(๋งŒ 14์„ธ ์ด์ƒ, ์„œ๋น„์Šค ์ด์šฉ ์•ฝ๊ด€, ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ)์— ๋™์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ•์ /๊ทœ์ • ์ค€์ˆ˜ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐ๊ฑด๋ถ€ ๊ฐ€๋“œ๋ฅผ ๋ณต์›ํ•˜์„ธ์š”:

 SolplyBasicButton(
     text = "๋‹ค์Œ",
     modifier = Modifier.padding(bottom = 24.dp),
-    onClick = { onNextClick() },
+    onClick = { if (isAllChecked) onNextClick() },
     selected = isAllChecked,
     textStyle = SolplyTheme.typography.button16M,
     textColor = if (isAllChecked) SolplyTheme.colors.white else SolplyTheme.colors.gray800,
     enabledBackgroundColor = SolplyTheme.colors.gray900,
     disabledBackgroundColor = SolplyTheme.colors.gray300
 )
๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick = { onNextClick() },
selected = isAllChecked,
onClick = { if (isAllChecked) onNextClick() },
selected = isAllChecked,
๐Ÿค– Prompt for AI Agents
In
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/AllowClauseScreen.kt
around lines 140-141, the "Next" button's onClick handler is always invoking
onNextClick regardless of isAllChecked; restore the conditional guard so the
handler only proceeds when the user has checked all required consents (e.g.,
only call onNextClick when isAllChecked is true), and ensure the button is
non-actionable otherwise (disable the button or no-op the click) to prevent
bypassing mandatory agreements.

Comment on lines +64 to +65
sideEffect.townId,
sideEffect.placeId
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐Ÿ”ด Critical

๋„ค๋น„๊ฒŒ์ด์…˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ ์˜ค๋ฅ˜ - ์ˆ˜์ • ํ•„์š”

navigateToPlaceDetail ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” (String, Long, Long)์ด๋ฉฐ (type, placeId, townId) ์ˆœ์„œ๋กœ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ, ํ˜„์žฌ ์ฝ”๋“œ๋Š” (type, townId, placeId) ์ˆœ์„œ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ž˜๋ชป๋œ ์žฅ์†Œ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

                 is SearchSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(
                     MapsType.PLACE_DETAIL.name,
-                    sideEffect.townId,
-                    sideEffect.placeId
+                    sideEffect.placeId,
+                    sideEffect.townId
                 )

ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๋ฅผ ์ ์šฉํ•ด์ฃผ์„ธ์š”.

๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
sideEffect.townId,
sideEffect.placeId
is SearchSideEffect.NavigateToPlaceDetail -> navigateToPlaceDetail(
MapsType.PLACE_DETAIL.name,
sideEffect.placeId,
sideEffect.townId
)
๐Ÿค– Prompt for AI Agents
In feature/search/src/main/java/com/teamsolply/solply/search/SearchScreen.kt
around lines 64-65, the call passes navigation parameters in the wrong order
(sideEffect.townId, sideEffect.placeId) while the navigateToPlaceDetail
signature expects (type: String, placeId: Long, townId: Long); swap the second
and third arguments so you call navigateToPlaceDetail(type, sideEffect.placeId,
sideEffect.townId) and ensure the types match the function signature.

Copy link
Contributor

@ImHyungsuk ImHyungsuk left a comment

Choose a reason for hiding this comment

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

๊ตฟ๊ตฟ

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

๐Ÿงน Nitpick comments (1)
feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt (1)

165-180: ๋ณ‘๋ ฌ ๋กœ๋”ฉ์œผ๋กœ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์ข‹์Šต๋‹ˆ๋‹ค๋งŒ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

์„ธ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•œ ๊ฒƒ์€ ์ข‹์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ async ๋ธ”๋ก ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด await() ํ˜ธ์ถœ ์‹œ ์˜ˆ์™ธ๊ฐ€ ์ „ํŒŒ๋˜์–ด ๋‹ค๋ฅธ ์ž‘์—…๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ์ƒํƒœ๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ฒŒ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์‹คํŒจ ์‹œ์—๋„ ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ณ„ try-catch ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๐Ÿ”Ž ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ฐœ์„  ์˜ˆ์‹œ
-                    val placesJob = async {
-                        fetchPlaces(
-                            townId = userInfo.selectedTown.townId,
-                            mainTagId = null,
-                            subTagAIdList = null,
-                            subTagBIdList = null
-                        )
-                    }
-                    val recommendJob = async {
-                        fetchRecommendPlace(townId = userInfo.selectedTown.townId)
-                    }
-                    val mainTagsJob = async { fetchMainTags() }
-
-                    placesJob.await()
-                    recommendJob.await()
-                    mainTagsJob.await()
+                    val placesJob = async {
+                        runCatching {
+                            fetchPlaces(
+                                townId = userInfo.selectedTown.townId,
+                                mainTagId = null,
+                                subTagAIdList = null,
+                                subTagBIdList = null
+                            )
+                        }
+                    }
+                    val recommendJob = async {
+                        runCatching {
+                            fetchRecommendPlace(townId = userInfo.selectedTown.townId)
+                        }
+                    }
+                    val mainTagsJob = async {
+                        runCatching { fetchMainTags() }
+                    }
+
+                    placesJob.await()
+                    recommendJob.await()
+                    mainTagsJob.await()
๐Ÿ“œ Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between ac7ced2 and a06261e.

๐Ÿ“’ Files selected for processing (1)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt
๐Ÿ”‡ Additional comments (2)
feature/place/src/main/java/com/teamsolply/solply/place/PlaceViewModel.kt (2)

12-12: LGTM!

๋ณ‘๋ ฌ ์‹คํ–‰์„ ์œ„ํ•ด ํ•„์š”ํ•œ import๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


256-256: PlaceType ๋งคํ•‘ ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

valueOf์—์„œ fromApiName์œผ๋กœ์˜ ๋ณ€๊ฒฝ์€ ์ ์ ˆํ•œ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค. fromApiName ๋ฉ”์„œ๋“œ๋Š” API ์‘๋‹ต์˜ ํ•œ๊ธ€ ์ด๋ฆ„์„ PlaceType ์—ด๊ฑฐํ˜•์œผ๋กœ ๋งคํ•‘ํ•˜๋ฉฐ, ์•Œ ์ˆ˜ ์—†๋Š” API ์ด๋ฆ„์„ ๋ฐ›์€ ๊ฒฝ์šฐ ALL๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. valueOf์ฒ˜๋Ÿผ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  gracefulํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

@ImHyungsuk ImHyungsuk merged commit d7cdb5f into develop Jan 6, 2026
1 check passed
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.

[Refactor] 1์ฐจ qa ์ˆ˜์ • 2

3 participants