Skip to content

Conversation

@leeseokchan00
Copy link
Contributor

@leeseokchan00 leeseokchan00 commented Jul 15, 2025

๐Ÿ“Œ PR ์š”์•ฝ

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

  • ์˜จ๋ณด๋”ฉ, ์ง€๋„ api ์กฐ๊ธˆ

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

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

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

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

Summary by CodeRabbit

  • ์‹ ๊ทœ ๊ธฐ๋Šฅ

    • ์˜จ๋ณด๋”ฉ ๊ณผ์ •์—์„œ ํŽ˜๋ฅด์†Œ๋‚˜ ์งˆ๋ฌธ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋‹‰๋„ค์ž„ ์ž…๋ ฅ ์‹œ ์ค‘๋ณต ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜๊ณ , ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฏธ์ง€(SVG, GIF ํฌํ•จ) ๋กœ๋”ฉ ๋ฐ ํ‘œ์‹œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์žฅ์†Œ ๋ฐ ์ฝ”์Šค ์ƒ์„ธ ์ •๋ณด, ๋ถ๋งˆํฌ ์ถ”๊ฐ€/์‚ญ์ œ, ์žฅ์†Œ๋ณ„ ์ฝ”์Šค ๋ชฉ๋ก ์กฐํšŒ ๋“ฑ ์ง€๋„ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ ๊ฐœ์„ 

    • ์žฅ์†Œ ๋ฐ ์ฝ”์Šค ์‹๋ณ„์ž ํƒ€์ž…์ด Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ์ง€ ์ •๋ณด, SNS ๋งํฌ ๋“ฑ ์ƒ์„ธ ์ •๋ณด ๊ตฌ์กฐ๊ฐ€ ๊ฐœ์„ ๋˜์–ด ๋” ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์˜จ๋ณด๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„๊ทธ ์ˆ˜์ •

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

    • Coil ์ด๋ฏธ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ 2.7.0์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ณ , SVG ๋ฐ GIF ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@leeseokchan00 leeseokchan00 requested a review from a team July 15, 2025 22:44
@leeseokchan00 leeseokchan00 self-assigned this Jul 15, 2025
@leeseokchan00 leeseokchan00 added the ์„์ฐฌ๐Ÿš๐Ÿฆ ์ด์„ ์ฐฌ์ฐฌ์ฐฌ์ฐฌ ์ฐฌ์ด์•ผ ~ ์™„์ „ ์ฐฌ์ด์•ผ ~ label Jul 15, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jul 15, 2025

Walkthrough

์ด๋ฒˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ง€๋„(Maps) ๋ฐ ์˜จ๋ณด๋”ฉ(OnBoarding) ๊ธฐ๋Šฅ์˜ ์ „์ฒด์ ์ธ API ์—ฐ๋™, DTO ๋ฐ Entity ๊ตฌ์กฐ ์ •๋น„, Flow ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ ๋กœ์ง ๋„์ž…, Compose UI ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์ผ๊ด€ํ™”, ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์œ ํ‹ธ ์ถ”๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ๊ฐฑ์‹ ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‹ ๊ทœ API ์—”๋“œํฌ์ธํŠธ์™€ ๋งคํผ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ๋ฐ์ดํ„ฐ์†Œ์Šค ๊ตฌํ˜„์ด ๋Œ€ํญ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Changes

ํŒŒ์ผ/๊ฒฝ๋กœ ์š”์•ฝ ๋ณ€๊ฒฝ ๋‚ด์šฉ ์š”์•ฝ
core/designsystem/.../SolplyTextField.kt ๋‹‰๋„ค์ž„ ์œ ํšจ์„ฑ ์ฝœ๋ฐฑ ์ถ”๊ฐ€, ๋‚ด๋ถ€ ๊ฒ€์ฆ ๋กœ์ง ๋ฐ ์˜์กด์„ฑ ๋ณ€๊ฒฝ, delay ์ œ๊ฑฐ
core/ui/build.gradle.kts, gradle/libs.versions.toml Coil SVG/GIF ๋ฒˆ๋“ค ์ถ”๊ฐ€ ๋ฐ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ, Compose ๋ฒˆ๋“ค ์ˆ˜์ •
core/ui/.../AdaptationImage.kt SVG/GIF ์ง€์› AdaptationImage ์ปดํฌ์ €๋ธ” ์ถ”๊ฐ€
data/maps/.../dto/response/*.kt ์ฝ”์Šค/์žฅ์†Œ ์ƒ์„ธ, ์ฝ”์Šค ๋ฆฌ์ŠคํŠธ์šฉ DTO ์‹ ๊ทœ ์ถ”๊ฐ€
data/maps/.../mapper/*.kt DTO โ†’ Entity ๋งคํ•‘ ํ™•์žฅ ํ•จ์ˆ˜ ์‹ ๊ทœ ์ถ”๊ฐ€
data/maps/.../repository/MapsRepositoryImpl.kt, .../source/MapsRemoteDataSource.kt ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ, ์‹ค์ œ ์›๊ฒฉ ๋ฐ์ดํ„ฐ ์—ฐ๋™, ๋ถ๋งˆํฌ/์ฝ”์Šค ๊ด€๋ จ ์‹ ๊ทœ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๋ฐ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ณ€๊ฒฝ
domain/maps/.../model/*.kt ID ํƒ€์ž… Intโ†’Long, ์ธ๋„ค์ผ/์ด๋ฏธ์ง€/๋งํฌ ํ•„๋“œ ํƒ€์ž… ๋ฐ ๋ช…์นญ ์ •๋น„
domain/maps/.../repository/MapsRepository.kt ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…, ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์ผ๊ด„ Long์œผ๋กœ ๋ณ€๊ฒฝ, ์‹ ๊ทœ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€/์ œ๊ฑฐ
data/onboarding/.../response/GetPersonaQuestionsResponseDto.kt, .../mapper/PersonaEntityMapper.kt ํŽ˜๋ฅด์†Œ๋‚˜ ๊ด€๋ จ DTO, ๋งคํผ ์‹ ๊ทœ ์ถ”๊ฐ€
data/onboarding/.../repository/OnBoardingRepositoryImpl.kt, .../source/remote/OnBoardingRemoteDataSource.kt ํŽ˜๋ฅด์†Œ๋‚˜ ์งˆ๋ฌธ ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๋กœ ๋ณ€๊ฒฝ
domain/onboarding/.../model/PersonaEntity.kt, .../repository/OnBoardingRepository.kt ํŽ˜๋ฅด์†Œ๋‚˜ Entity ๋ฐ Repository ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
feature/maps/... (๋‹ค์ˆ˜) IDํƒ€์ž… Intโ†’Long, ํ•„๋“œ๋ช… ์ •๋น„, ํŒŒ๋ผ๋ฏธํ„ฐ/์ฝœ๋ฐฑ ํƒ€์ž… ์ผ๊ด€ํ™”, ์‹ ๊ทœ API ์—ฐ๋™
feature/onboarding/... (๋‹ค์ˆ˜) ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์ฒดํฌ Flow ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐํ™”, ์˜จ๋ณด๋”ฉ ์„ฑ๊ณต ํ”Œ๋ž˜๊ทธ ๋ฐ Intent ์ถ”๊ฐ€, ํŽ˜๋ฅด์†Œ๋‚˜/๋‹‰๋„ค์ž„/๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋กœ์ง ๊ฐœ์„ 
remote/maps/.../MapsRemoteDataSourceImpl.kt, .../service/MapsService.kt ๊ธฐ์กด saveCourse ์ œ๊ฑฐ, ์žฅ์†Œ/์ฝ”์Šค/๋ถ๋งˆํฌ ๊ด€๋ จ ์‹ ๊ทœ API ๋ฉ”์„œ๋“œ ๋Œ€๊ฑฐ ์ถ”๊ฐ€
remote/onboarding/.../OnBoardingRemoteDataSourceImpl.kt, .../service/OnBoardingService.kt ํŽ˜๋ฅด์†Œ๋‚˜ ์งˆ๋ฌธ ์กฐํšŒ API ์ถ”๊ฐ€ ๋ฐ ๊ตฌํ˜„
๊ธฐํƒ€ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ, import, DTO ํŒจํ‚ค์ง€ ์œ„์น˜ ์ผ๋ถ€ ์ •๋น„

Sequence Diagram(s)

sequenceDiagram
    participant UI
    participant ViewModel
    participant Repository
    participant RemoteDataSource
    participant Service

    UI->>ViewModel: getPlaceDetailInfo(placeId: Long)
    ViewModel->>Repository: getPlaceDetail(placeId: Long)
    Repository->>RemoteDataSource: getPlaceDetail(placeId: Long)
    RemoteDataSource->>Service: getPlaceDetail(placeId: Long) [API]
    Service-->>RemoteDataSource: BaseResponse<GetPlaceDetailResponseDto>
    RemoteDataSource-->>Repository: GetPlaceDetailResponseDto
    Repository-->>ViewModel: PlaceDetailEntity (๋งคํ•‘)
    ViewModel-->>UI: State ์—…๋ฐ์ดํŠธ
Loading
sequenceDiagram
    participant UI
    participant ViewModel
    participant Repository
    participant RemoteDataSource
    participant Service

    UI->>ViewModel: ChangeInputNickname(nickname)
    ViewModel->>ViewModel: nicknameFlow ์—…๋ฐ์ดํŠธ
    ViewModel-->>ViewModel: (debounce 500ms)
    ViewModel->>Repository: checkNicknameDuplicate(nickname)
    Repository->>RemoteDataSource: checkNicknameDuplicate(nickname)
    RemoteDataSource->>Service: checkNicknameDuplicate(nickname) [API]
    Service-->>RemoteDataSource: BaseResponse<Boolean>
    RemoteDataSource-->>Repository: Boolean
    Repository-->>ViewModel: Boolean
    ViewModel-->>UI: isNicknameDuplicate, isOnBoardingSuccess ๋“ฑ State ์—…๋ฐ์ดํŠธ
Loading

Possibly related PRs

  • #76: SolplyTextField.kt์˜ ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์ฒดํฌ ์ฝœ๋ฐฑ ๊ตฌ์กฐ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ, ๋™์ผ ์ปดํฌ์ €๋ธ” ๋ฐ ๊ฒ€์ฆ ๋กœ์ง์„ ์ˆ˜์ •ํ•จ.
  • #30: SolplyTextField.kt์˜ ๋‹‰๋„ค์ž„ ๊ฒ€์ฆ UI/์ƒํƒœ ๊ด€๋ฆฌ ์ „๋ฉด ๋ฆฌํŒฉํ„ฐ์™€ ๊ด€๋ จ, ๋™์ผ ์ปดํฌ์ €๋ธ” ๋ฐ ๊ฒ€์ฆ ๋กœ์ง์„ ๋‹ค๋ฃธ.

Suggested reviewers

  • ImHyungsuk

Poem

๐Ÿฐ
์ฝ”์Šค์™€ ์žฅ์†Œ, ๋กฑ์œผ๋กœ ํ†ต์ผ,
๋ถ๋งˆํฌ, ํŽ˜๋ฅด์†Œ๋‚˜, ๋ชจ๋‘ API๋กœ ๋นŒ๋นŒ!
๋‹‰๋„ค์ž„ ๊ฒ€์ฆ์€ Flow๋กœ ์ฐฐ๋ž‘,
์ด๋ฏธ์ง€ ๋กœ๋”ฉ์€ Coil๋กœ ๋ฐ˜์ง!
ํ† ๋ผ๋Š” ์˜ค๋Š˜๋„ ์ฝ”๋“œ๋ฅผ ๋‹ฌ๋ ค,
SOLPLY์˜ ์ง€๋„๋ฅผ ์™„์„ฑํ•˜๋ ค!
๐Ÿ—บ๏ธโœจ

โœจ 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
๐Ÿชง 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.
    • Explain this complex logic.
    • 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. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • 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 src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai 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

Documentation and Community

  • 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.

@leeseokchan00 leeseokchan00 merged commit 1e59b15 into develop Jul 15, 2025
1 check was pending
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: 10

๐Ÿ”ญ Outside diff range comments (2)
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt (1)

34-35: ์ค‘๋ณต๋œ modifier๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

fillMaxSize() modifier๊ฐ€ ๋‘ ๋ฒˆ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

modifier = Modifier
    .fillMaxSize()
-    .fillMaxSize()
    .padding(horizontal = 16.dp)
    .addFocusCleaner(focusManager),
feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.kt (1)

231-241: ํ•˜๋“œ์ฝ”๋”ฉ๋œ courseId ์ˆ˜์ • ํ•„์š”

getCourseDetailInfo() ๋ฉ”์„œ๋“œ์—์„œ courseId = 1๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”์Šค ID๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

-    fun getCourseDetailInfo() {
+    fun getCourseDetailInfo(courseId: Long) {
         viewModelScope.launch {
-            mapsRepository.getCourseDetail(courseId = 1).onSuccess {
+            mapsRepository.getCourseDetail(courseId = courseId).onSuccess {
๐Ÿงน Nitpick comments (7)
core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt (2)

39-46: ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ์ง€์› ์ถ”๊ฐ€ ๊ณ ๋ ค

ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์‹คํŒจ๋‚˜ ๋กœ๋”ฉ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์„ ์œ„ํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐœ์„ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค:

 @Composable
 fun AdaptationImage(
     modifier: Modifier = Modifier,
     imageUrl: String,
     contentScale: ContentScale = ContentScale.Fit,
-    contentDescription: String? = null
+    contentDescription: String? = null,
+    placeholder: @Composable (() -> Unit)? = null,
+    error: @Composable (() -> Unit)? = null,
+    onLoading: @Composable (() -> Unit)? = null
 ) {
     // ... existing code ...
     
     AsyncImage(
         model = request,
         imageLoader = imageLoader,
         contentScale = contentScale,
         contentDescription = contentDescription,
+        placeholder = placeholder,
+        error = error,
+        onLoading = onLoading,
         modifier = modifier
     )
 }

27-31: ๋””์ฝ”๋” ์ถ”๊ฐ€ ๋กœ์ง ๊ฐœ์„  ํ•„์š”

ํ˜„์žฌ when ๋ธ”๋ก์—์„œ SVG ๋˜๋Š” GIF ์ค‘ ํ•˜๋‚˜๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์กฐ๊ฑด์ด ๋ชจ๋‘ true์ธ ๊ฒฝ์šฐ๋‚˜ ๋‘˜ ๋‹ค false์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋” ๋ช…ํ™•ํ•œ ๋กœ์ง์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค:

 .components {
-    when {
-        isSvg -> add(SvgDecoder.Factory())
-        isGif -> add(GifDecoder.Factory())
-    }
+    if (isSvg) add(SvgDecoder.Factory())
+    if (isGif) add(GifDecoder.Factory())
 }
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/PersonaEntity.kt (1)

3-6: ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•˜๋‚˜ ํฌ๋งคํŒ…์„ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”.

๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„๋Š” ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํด๋ž˜์Šค ์ •์˜์—์„œ ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 data class PersonaEntity(
     val personaList: List<Persona>
-
 )
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (1)

81-91: ํŽ˜๋ฅด์†Œ๋‚˜ ์งˆ๋ฌธ ์กฐํšŒ ์‹œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์„ฑ๊ณต ์ผ€์ด์Šค๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์–ด ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

private fun getPersonaQuestions() {
    viewModelScope.launch {
-        onBoardingRepository.getPersonaQuestions().onSuccess {
-            reduce {
-                copy(
-                    personaList = it
-                )
+        onBoardingRepository.getPersonaQuestions()
+            .onSuccess {
+                reduce {
+                    copy(
+                        personaList = it
+                    )
+                }
+            }
+            .onFailure { throwable ->
+                // ์—๋Ÿฌ ๋กœ๊น… ๋˜๋Š” ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
+                // ์˜ˆ: postSideEffect(OnBoardingSideEffect.ShowError(throwable.message))
            }
-        }
    }
}
remote/maps/src/main/java/com/teamsolply/solply/maps/service/MapsService.kt (3)

22-32: ๋ฉ”์„œ๋“œ๋ช…์˜ ์ผ๊ด€์„ฑ์„ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”.

๋ถ๋งˆํฌ ๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋ช…์—์„œ "BookMark"๋ณด๋‹ค๋Š” "Bookmark"๊ฐ€ ๋” ์ผ๊ด€๋œ ํ‘œ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

-    suspend fun postPlaceBookMark(
+    suspend fun postPlaceBookmark(
        @Path("placeId") placeId: Long
    ): BaseResponse<Unit>

-    suspend fun deletePlaceBookMark(
+    suspend fun deletePlaceBookmark(
        @Path("placeId") placeId: Long
    ): BaseResponse<Unit>

34-39: ๋ฉ”์„œ๋“œ๋ช…์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”.

"getAddMyCourse"๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ช…์ด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. "Add"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ถ”๊ฐ€ ์ž‘์—…์œผ๋กœ ์˜คํ•ด๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์กฐํšŒ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

-    suspend fun getAddMyCourse(
+    suspend fun getMyCourses(
        @Query("townId") townId: Long,
        @Query("placeId") placeId: Long
    ): BaseResponse<CoursesResponseDto>

47-47: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์„ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”.

"// ์ฝ”์Šค ์ „์ฒด ์กฐํšŒ" ์ฃผ์„์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”.

-    // ์ฝ”์Šค ์ „์ฒด ์กฐํšŒ
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 6a6609e and e9a839c.

๐Ÿ“’ Files selected for processing (39)
  • core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt (2 hunks)
  • core/ui/build.gradle.kts (1 hunks)
  • core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/dto/SaveCourseRequestDto.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetAddMyCourseResponseDto.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetCourseDetailResponseDto.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetPlaceDetailResponseDto.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseDetailEntityMapper.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseInfoEntityMapper.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/mapper/PlaceDetailEntityMapper.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/repository/MapsRepositoryImpl.kt (1 hunks)
  • data/maps/src/main/java/com/teamsolply/solply/maps/source/MapsRemoteDataSource.kt (1 hunks)
  • data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/GetPersonaQuestionsResponseDto.kt (1 hunks)
  • data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/PersonaEntityMapper.kt (1 hunks)
  • data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt (1 hunks)
  • data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/remote/OnBoardingRemoteDataSource.kt (1 hunks)
  • domain/maps/src/main/java/com/teamsolply/solply/maps/model/CourseDetailEntity.kt (1 hunks)
  • domain/maps/src/main/java/com/teamsolply/solply/maps/model/CourseInfoEntity.kt (1 hunks)
  • domain/maps/src/main/java/com/teamsolply/solply/maps/model/PlaceDetailEntity.kt (1 hunks)
  • domain/maps/src/main/java/com/teamsolply/solply/maps/repository/MapsRepository.kt (1 hunks)
  • domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/PersonaEntity.kt (1 hunks)
  • domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsContract.kt (5 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt (5 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.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 (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt (4 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt (3 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (4 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (2 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt (4 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt (1 hunks)
  • gradle/libs.versions.toml (7 hunks)
  • remote/maps/src/main/java/com/teamsolply/solply/maps/datasource/MapsRemoteDataSourceImpl.kt (1 hunks)
  • remote/maps/src/main/java/com/teamsolply/solply/maps/service/MapsService.kt (1 hunks)
  • remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt (1 hunks)
  • remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/di/OnBoardingRemoteDataModule.kt (1 hunks)
  • remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt (2 hunks)
๐Ÿ”‡ Additional comments (88)
gradle/libs.versions.toml (3)

89-89: Coil ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ์Šน์ธ

2.7.0 ๋ฒ„์ „์œผ๋กœ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด SVG ๋ฐ GIF ๋””์ฝ”๋” ์ง€์›์„ ์œ„ํ•œ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค.


189-190: ์ƒˆ๋กœ์šด Coil ๋ชจ๋“ˆ ์ถ”๊ฐ€ ์Šน์ธ

SVG ๋ฐ GIF ์ง€์›์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


260-260: Coil ๋ฒˆ๋“ค ๊ตฌ์„ฑ ์Šน์ธ

๊ด€๋ จ๋œ Coil ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋กœ ๋ฌถ์–ด ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

core/ui/build.gradle.kts (1)

9-11: ์˜์กด์„ฑ ์ถ”๊ฐ€ ์Šน์ธ

์ƒˆ๋กœ์šด AdaptationImage ์ปดํฌ์ €๋ธ”์„ ์œ„ํ•œ Coil ๋ฒˆ๋“ค ์˜์กด์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/di/OnBoardingRemoteDataModule.kt (1)

4-4: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๊ฐœ์„ ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

OnBoardingRemoteDataSource ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ source.remote ํŒจํ‚ค์ง€๋กœ ์ด๋™์‹œํ‚จ ๊ฒƒ์€ ์›๊ฒฉ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋“ค์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” ์ข‹์€ ๊ตฌ์กฐ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt (2)

3-3: PersonaEntity ์ž„ํฌํŠธ ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ getPersonaQuestions() ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  PersonaEntity ํƒ€์ž…์˜ ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


7-7: Repository ํŒจํ„ด์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ getPersonaQuestions() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข‹์€ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • suspend ํ•จ์ˆ˜๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • Result<T> ํƒ€์ž…์œผ๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  • ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt (3)

48-48: ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋งž๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

PersonaEntity ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋งž์ถฐ options.personaList.forEach๋กœ ์ˆ˜์ •๋œ ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ options๋Š” PersonaEntity ํƒ€์ž…์ด๊ณ  ์‹ค์ œ ๋ฆฌ์ŠคํŠธ๋Š” personaList ํ”„๋กœํผํ‹ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.


49-49: ์„ ํƒ๋œ ํŽ˜๋ฅด์†Œ๋‚˜ ๋น„๊ต ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

selectedPersona == persona.personaType ๋น„๊ต๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” selectedPersona๊ฐ€ ์ด์ œ String ํƒ€์ž…(personaType)์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.


54-54: Intent ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •์ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

OnBoardingIntent.OnPersonaSelected์— persona.personaType์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ ํƒ๋œ ํŽ˜๋ฅด์†Œ๋‚˜๋ฅผ ๊ฐ์ฒด ๋Œ€์‹  ํƒ€์ž… ๋ฌธ์ž์—ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ƒˆ๋กœ์šด ์„ค๊ณ„์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt (2)

5-5: ์ƒˆ๋กœ์šด DTO ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

GetPersonaQuestionsResponseDto ์ž„ํฌํŠธ๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ API ๋ฉ”์„œ๋“œ์— ๋งž์ถฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


15-16: API ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„์ด ์ผ๊ด€๋œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ getPersonaQuestions() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข‹์€ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • @GET ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์ ์ ˆํ•œ ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ
  • ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค๊ณผ ์ผ๊ด€๋œ BaseResponse<T> ๋ž˜ํผ ์‚ฌ์šฉ
  • suspend ํ•จ์ˆ˜๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜
remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt (3)

4-4: ํ•„์š”ํ•œ DTO ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ๊ตฌํ˜„๋œ getPersonaQuestions() ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ GetPersonaQuestionsResponseDto ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


8-8: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋งž๋Š” ์ž„ํฌํŠธ ๊ฒฝ๋กœ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

OnBoardingRemoteDataSource ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ž„ํฌํŠธ ๊ฒฝ๋กœ๊ฐ€ source.remote ํŒจํ‚ค์ง€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


14-15: ์ผ๊ด€๋œ ๊ตฌํ˜„ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ getPersonaQuestions() ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ๋‚ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค๊ณผ ๋™์ผํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„ .data ํ•„๋“œ ๋ฐ˜ํ™˜
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ์œ„์ž„
  • ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๊ตฌํ˜„
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/remote/OnBoardingRemoteDataSource.kt (3)

1-1: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๊ฐœ์„ ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋ช…์„ remote๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•œ ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ์ข‹์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.


4-4: ์ƒˆ๋กœ์šด DTO ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

persona ์งˆ๋ฌธ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ DTO ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


9-9: ์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด getPersonaQuestions() ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ์กด ํŒจํ„ด๊ณผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. suspend ํ•จ์ˆ˜๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/PersonaEntity.kt (1)

8-11: Persona ์—”ํ‹ฐํ‹ฐ ์ •์˜๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

personaType๊ณผ description ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt (3)

4-5: ์ƒˆ๋กœ์šด ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

mapper ํ•จ์ˆ˜์™€ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


7-7: ์—…๋ฐ์ดํŠธ๋œ ์ž„ํฌํŠธ ๊ฒฝ๋กœ๊ฐ€ ์ผ๊ด€์„ฑ ์žˆ์Šต๋‹ˆ๋‹ค.

remote ํŒจํ‚ค์ง€๋กœ ์ด๋™ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


13-17: ์—๋Ÿฌ ํ•ธ๋“ค๋ง๊ณผ ๋งคํ•‘์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

runCatching๊ณผ mapCatching์„ ์‚ฌ์šฉํ•œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์ด ์ ์ ˆํ•˜๊ณ , DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋กœ์ง์ด ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์™€ ์ผ๊ด€์„ฑ ์žˆ๋Š” ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/PersonaEntityMapper.kt (3)

1-7: ์ž„ํฌํŠธ ๋ฐ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋งคํผ ํŒŒ์ผ์˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ํ•„์š”ํ•œ DTO, ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋“ค์˜ ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


8-12: ResponseDto ๋งคํผ ๊ตฌํ˜„์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

GetPersonaQuestionsResponseDto๋ฅผ PersonaEntity๋กœ ๋งคํ•‘ํ•˜๋Š” ๋กœ์ง์ด ๊น”๋”ํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ ๋งคํ•‘์— map ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


14-19: ๊ฐœ๋ณ„ DTO ๋งคํผ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PersonaDto๋ฅผ Persona ์—”ํ‹ฐํ‹ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋กœ์ง์ด ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ๋งคํ•‘์ด ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/GetPersonaQuestionsResponseDto.kt (3)

1-5: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ์ง๋ ฌํ™” ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

DTO ํŒจํ‚ค์ง€ ์œ„์น˜์™€ kotlinx.serialization ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


6-10: ์‘๋‹ต DTO ๊ตฌํ˜„์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

@Serializable ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @SerialName์„ ์‚ฌ์šฉํ•œ JSON ํ•„๋“œ ๋งคํ•‘์ด ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ๋ช… ์ฐจ์ด(personaList vs personaDtoList)๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


12-18: PersonaDto ๊ตฌํ˜„์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ persona ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ DTO ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ , ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

60-75: ํ‚ค๋ณด๋“œ ์ฒ˜๋ฆฌ ๋ฐ ๊ฒ€์ฆ ๋กœ์ง ๊ฐœ์„ ์ด ์ž˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

imePadding() ์ถ”๊ฐ€๋กœ ํ‚ค๋ณด๋“œ๊ฐ€ ๋ฒ„ํŠผ์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๊ณ , isOnBoardingSuccess ์ƒํƒœ๋ฅผ ํ†ตํ•œ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋กœ์ง์ด ๋” ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

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

16-22: ์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ ๊ฐœ์„ ์ด ์ž˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PersonaEntity๋กœ์˜ ๋ณ€๊ฒฝ๊ณผ isOnBoardingSuccess ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€๋กœ ์˜จ๋ณด๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

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

113-172: ๋‹‰๋„ค์ž„ ๊ฒ€์ฆ ๋กœ์ง์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์ฝœ๋ฐฑ์„ ํ†ตํ•œ ๊ฒ€์ฆ ์ƒํƒœ ์ „๋‹ฌ๊ณผ ์ง€์—ฐ ์ œ๊ฑฐ๋กœ ๋” ๋ฐ˜์‘์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

74-76: ์ฝœ๋ฐฑ ์ „ํŒŒ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

checkOnBoardingSuccess ์ฝœ๋ฐฑ์ด ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต์„ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 89-90, 188-188

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

24-39: Flow ๊ธฐ๋ฐ˜ ๋‹‰๋„ค์ž„ ๊ฒ€์ฆ์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

500ms ๋””๋ฐ”์šด์Šค๋กœ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ์ค„์ด๊ณ , ์‹คํŒจ ์‹œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


97-109: ์•ˆ์ „ํ•œ null ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ๋œ let์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ API ํ˜ธ์ถœ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/dto/SaveCourseRequestDto.kt (1)

1-1: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ์ •๋ฆฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์Šน์ธ

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

domain/maps/src/main/java/com/teamsolply/solply/maps/model/CourseInfoEntity.kt (1)

9-9: ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ ํƒ€์ž… ๋ณ€๊ฒฝ ์Šน์ธ

๋กœ์ปฌ ๋ฆฌ์†Œ์Šค ID์—์„œ URL ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ์„œ๋ฒ„ API ์—ฐ๋™์„ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ๋กœ์ง์ด ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

domain/maps/src/main/java/com/teamsolply/solply/maps/model/CourseDetailEntity.kt (2)

4-4: ์ฝ”์Šค ID ํƒ€์ž… ๋ณ€๊ฒฝ ์Šน์ธ

Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ๋” ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ ์ ˆํ•œ ํƒ€์ž… ํ‘œ์ค€ํ™”์ž…๋‹ˆ๋‹ค.


12-12: ์žฅ์†Œ ID ํƒ€์ž… ๋ณ€๊ฒฝ ์Šน์ธ

Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ID ํƒ€์ž… ํ‘œ์ค€ํ™”์˜ ์ผํ™˜์œผ๋กœ ์ ์ ˆํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

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

39-39: ImageInfo ์ž„ํฌํŠธ ์ถ”๊ฐ€ ์Šน์ธ

๋” ๊ตฌ์กฐํ™”๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ž„ํฌํŠธ์ž…๋‹ˆ๋‹ค.


51-51: ์ด๋ฏธ์ง€ URL ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ๋ณ€๊ฒฝ ์Šน์ธ

Int ๋ฆฌ์†Œ์Šค ID์—์„œ ImageInfo ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ๋” ํ’๋ถ€ํ•œ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ ์ ˆํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.


265-265: SNS ํ”Œ๋žซํผ ์†์„ฑ๋ช… ๋ณ€๊ฒฝ ์Šน์ธ

๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์†์„ฑ๋ช… ๋ณ€๊ฒฝ์— ๋งž์ถ˜ ์ ์ ˆํ•œ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseInfoEntityMapper.kt (1)

7-17: ๋งคํผ ํ•จ์ˆ˜ ์ „์ฒด ๊ตฌ์กฐ ์Šน์ธ

์ „๋ฐ˜์ ์œผ๋กœ ์ ์ ˆํ•œ ๋งคํผ ํ•จ์ˆ˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. DTO์—์„œ Entity๋กœ์˜ ๋ณ€ํ™˜ ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseDetailEntityMapper.kt (1)

8-16: CourseDetailResponseDto ๋งคํผ ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

DTO์—์„œ Entity๋กœ์˜ ๋ณ€ํ™˜ ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

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

36-39: ID ํƒ€์ž…์˜ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ณ€๊ฒฝ์ด ์ž˜ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

selectedPlaceItem๊ณผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ID ํƒ€์ž… ํ‘œ์ค€ํ™”์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetAddMyCourseResponseDto.kt (2)

6-10: CoursesResponseDto๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ž˜ํผ ํด๋ž˜์Šค๋กœ์„œ์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ณ  ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์ ˆํžˆ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


12-34: CourseDto ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ณ , courseId๋ฅผ Long ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ID ํƒ€์ž… ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/mapper/PlaceDetailEntityMapper.kt (2)

19-19: null ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

contactNumber์˜ null ์ฒ˜๋ฆฌ๋กœ ๋นˆ ๋ฌธ์ž์—ด์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


28-40: ImageInfo์™€ SnsLink ๋งคํผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ๋œ DTO ๊ฐ์ฒด๋“ค์˜ ๋ณ€ํ™˜ ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetPlaceDetailResponseDto.kt (3)

6-50: GetPlaceDetailResponseDto๊ฐ€ ์ž˜ ๊ตฌ์กฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ณ , @SerialName ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด JSON ์ง๋ ฌํ™”๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. placeId๋ฅผ Long ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.


27-31: ์ขŒํ‘œ ๋ฐ์ดํ„ฐ์˜ String ํƒ€์ž… ์„ ํƒ์— ๋Œ€ํ•œ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

latitude์™€ longitude์ด String ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” API ์‘๋‹ต ํ˜•์‹์— ๋งž์ถ˜ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งคํผ์—์„œ Double๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

API ์‘๋‹ต์—์„œ ์ขŒํ‘œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋˜๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


52-68: ์ค‘์ฒฉ๋œ DTO ํด๋ž˜์Šค๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ImageInfoDto์™€ SnsLinkDto๊ฐ€ ๊ฐ๊ฐ์˜ ์—ญํ• ์— ๋งž๊ฒŒ ์ž˜ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๊ณ , ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์ ˆํžˆ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

domain/maps/src/main/java/com/teamsolply/solply/maps/model/PlaceDetailEntity.kt (7)

6-6: ID ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ ์™„๋ฃŒ

placeId์˜ ํƒ€์ž…์ด Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋” ํฐ ๋ฒ”์œ„์˜ ์‹๋ณ„์ž๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.


9-9: ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ™•์ธ ์™„๋ฃŒ

description์ด introduction์œผ๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. API ์‘๋‹ต๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


10-10: ์ด๋ฏธ์ง€ ์ •๋ณด ๊ตฌ์กฐ ๊ฐœ์„ 

imageInfos์˜ ํƒ€์ž…์ด List<Int>์—์„œ List<ImageInfo>๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋” ๊ตฌ์กฐํ™”๋œ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ‘œ์‹œ ์ˆœ์„œ์™€ URL ์ •๋ณด๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์„ ๋œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


16-16: SNS ๋งํฌ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ™•์ธ

snsLink๊ฐ€ snsLinks๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋ณต์ˆ˜ํ˜•์œผ๋กœ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


19-19: ๊ธฐ๋ณธ ์žฅ์†Œ ID ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ

placeDefaultId๋„ Long ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋‹ค๋ฅธ ID ํ•„๋“œ๋“ค๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.


22-25: ์ƒˆ๋กœ์šด ImageInfo ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์ถ”๊ฐ€

์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. displayOrder์™€ url ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ํ‘œ์‹œ ์ˆœ์„œ์™€ URL์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


28-28: SNS ํ”Œ๋žซํผ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ

SnsLink ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ platform์ด snsPlatform์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋” ๋ช…ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetCourseDetailResponseDto.kt (3)

6-22: DTO ๊ตฌ์กฐ ๋ฐ ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜ ํ™•์ธ ์™„๋ฃŒ

CourseDetailResponseDto์˜ ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์ •์˜๋˜์–ด ์žˆ๊ณ , ๋ชจ๋“  ํ•„๋“œ์— @SerialName ์–ด๋…ธํ…Œ์ด์…˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Long ํƒ€์ž…์˜ ID ์‚ฌ์šฉ๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


24-58: CoursePlaceDto ๊ตฌ์กฐ ํ™•์ธ ์™„๋ฃŒ

CoursePlaceDto์˜ ํ•„๋“œ๋“ค์ด ์ ์ ˆํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๊ณ , ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ๋ช…๊ณผ ํƒ€์ž…์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


47-51: API ์‘๋‹ต ์ขŒํ‘œ ํƒ€์ž… ํ™•์ธ ํ•„์š”

GetCourseDetailResponseDto์™€ GetPlaceDetailResponseDto์—์„œ latitude/longitude๊ฐ€ ๋ชจ๋‘ String์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ณ , ๋„๋ฉ”์ธ ๋ชจ๋ธ์ธ CourseDetailEntity๋„ String์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋ฒ„ API ์ŠคํŽ™์—์„œ ์ขŒํ‘œ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋˜๋Š”์ง€ ๋ฐฑ์—”๋“œ ํŒ€์— ํ™•์ธํ•ด ์ฃผ์„ธ์š”.
๋งŒ์•ฝ API๊ฐ€ ์ˆซ์ž(Double)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด DTOยท๋„๋ฉ”์ธ ๋ชจ๋ธ์„ Double๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋งคํผ์—์„œ์˜ toDouble() ๋ณ€ํ™˜์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ€“ ํ™•์ธ ๋Œ€์ƒ ์œ„์น˜:
โ€ข data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetCourseDetailResponseDto.kt
โ€ข data/maps/src/main/java/com/teamsolply/solply/maps/dto/response/GetPlaceDetailResponseDto.kt
โ€ข domain/maps/src/main/java/com/teamsolply/solply/maps/model/CourseDetailEntity.kt
โ€ข domain/maps/src/main/java/com/teamsolply/solply/maps/model/PlaceDetailEntity.kt
โ€ข data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseDetailEntityMapper.kt
โ€ข data/maps/src/main/java/com/teamsolply/solply/maps/mapper/PlaceDetailEntityMapper.kt

data/maps/src/main/java/com/teamsolply/solply/maps/source/MapsRemoteDataSource.kt (5)

3-6: ์ƒˆ๋กœ์šด DTO ์ž„ํฌํŠธ ํ™•์ธ

ํ•„์š”ํ•œ DTO ํด๋ž˜์Šค๋“ค์ด ์ ์ ˆํ•˜๊ฒŒ ์ž„ํฌํŠธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์‘๋‹ต ํƒ€์ž…๋“ค์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


8-8: ์žฅ์†Œ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

getPlaceDetail ๋ฉ”์„œ๋“œ๊ฐ€ Long ํƒ€์ž… ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์†Œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋„๋ก ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ช…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.


9-10: ๋ถ๋งˆํฌ ๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

์žฅ์†Œ ๋ถ๋งˆํฌ ์ €์žฅ ๋ฐ ์‚ญ์ œ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ช…์ด ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


12-15: ์‚ฌ์šฉ์ž ์ฝ”์Šค ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

getAddMyCourse ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ํŠน์ • ์ง€์—ญ๊ณผ ์žฅ์†Œ์— ๋Œ€ํ•œ ์ฝ”์Šค ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


17-17: ์ฝ”์Šค ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

getCourseDetail ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ฝ”์Šค ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์ ์ ˆํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

24-24: ์„ ํƒ๋œ ์žฅ์†Œ ID ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ

selectedPlaceInfoId์˜ ํƒ€์ž…์ด Long?์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋‹ค๋ฅธ ID ํ•„๋“œ๋“ค๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.


50-50: Intent ๋ฐ SideEffect์—์„œ ID ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ

๋ชจ๋“  Intent์™€ SideEffect์—์„œ placeId ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์ด Long์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ข‹์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

Also applies to: 54-54, 88-88, 113-113


124-124: ๊ธฐ๋ณธ ์—”ํ‹ฐํ‹ฐ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ์—…๋ฐ์ดํŠธ

defaultPlaceDetailEntity์—์„œ description์ด introduction์œผ๋กœ, snsLink๊ฐ€ snsLinks๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 128-128

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

58-58: ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์ผ๊ด€์„ฑ ์œ ์ง€

selectedPlaceItem, singleCoursePlaceBookMarkClick, placeInfoClick, placeDetailClick์˜ ํƒ€์ž…์ด Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ „์ฒด maps ๋ชจ๋“ˆ์˜ ํƒ€์ž… ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ์ €๋ธ” ๋‚ด๋ถ€ ๋กœ์ง์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์ ์ ˆํ•œ ํƒ€์ž… ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

Also applies to: 64-64, 66-66, 71-71

remote/maps/src/main/java/com/teamsolply/solply/maps/datasource/MapsRemoteDataSourceImpl.kt (2)

14-15: ๊ฒ€์ฆ ๊ฒฐ๊ณผ: .data ์ง์ ‘ ์ ‘๊ทผ์€ ์•ˆ์ „ํ•˜๋ฉฐ ์ถ”๊ฐ€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋ถˆํ•„์š”

  • GetPlaceDetailResponseDto ๋“ฑ ๊ฐ ResponseDto์˜ data ํ”„๋กœํผํ‹ฐ๋Š” non-nullable๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด, JSON ํ•„๋“œ ๋ˆ„๋ฝ ์‹œ์—๋Š” ์ง๋ ฌํ™” ๋‹จ๊ณ„์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • RemoteDataSource๋Š” ์˜ˆ์™ธ๋ฅผ ์ƒ์œ„ ๋ ˆ์ด์–ด๋กœ ์ „ํŒŒํ•˜๋Š” ์„ค๊ณ„์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์„œ ๋ณ„๋„ tryโ€“catch ์ฒ˜๋ฆฌ๋‚˜ null ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Likely an incorrect or invalid review comment.


17-27: ํ™•์ธ ์™„๋ฃŒ: ๋ถ๋งˆํฌ ๋ฉ”์„œ๋“œ .data ๋ฐ˜ํ™˜ ํƒ€์ž…์€ Unit์ด ๋งž์Šต๋‹ˆ๋‹ค
MapsService์˜ postPlaceBookMark ๋ฐ deletePlaceBookMark ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ BaseResponse<Unit>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, .data์˜ ํƒ€์ž…์€ Unit์œผ๋กœ ๊ตฌํ˜„์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

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

43-65: ๋ถ๋งˆํฌ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ๊ฐœ์„ ๋จ

๋ถ๋งˆํฌ ํ† ๊ธ€ ์‹œ UI ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ธก๋ฉด์—์„œ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค.


197-207: ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ๋จ

placeId ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Int์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ผ๊ด€์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

84-86: ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์ผ๊ด€์„ฑ ๊ฐœ์„ 

townId์™€ targetId ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Long ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ์ผ๊ด€์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


106-106: ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์—…๋ฐ์ดํŠธ ํ™•์ธ

getAllCourseInfo ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์ƒˆ๋กœ์šด ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


285-287: ์ฝœ๋ฐฑ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ€์ž… ๋ณ€๊ฒฝ ํ™•์ธ

UI ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด Long์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


561-566: ์†์„ฑ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ™•์ธ

description์ด introduction์œผ๋กœ, snsLink๊ฐ€ snsLinks๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

domain/maps/src/main/java/com/teamsolply/solply/maps/repository/MapsRepository.kt (3)

9-11: ๋ถ๋งˆํฌ ๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ํ™•์ธ

์ƒˆ๋กœ์šด ๋ถ๋งˆํฌ ์ €์žฅ ๋ฐ ์‚ญ์ œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค.


13-16: ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ฐœ์„ 

getAddMyCourse ๋ฉ”์„œ๋“œ๊ฐ€ townId์™€ placeId ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋„๋ก ์—…๋ฐ์ดํŠธ๋˜์–ด ๋” ๊ตฌ์ฒด์ ์ธ ์ฝ”์Šค ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


19-19: ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ์ผ๊ด€์„ฑ ํ™•์ธ

getCourseDetail ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Long ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ผ๊ด€์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

data/maps/src/main/java/com/teamsolply/solply/maps/repository/MapsRepositoryImpl.kt (4)

15-19: ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋งคํ•‘ ํŒจํ„ด ๊ฐœ์„ 

runCatching๊ณผ mapCatching์„ ํ™œ์šฉํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํŒจํ„ด์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งคํ•‘ ๋กœ์ง๋„ ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.


21-27: ๋ถ๋งˆํฌ ๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ํ™•์ธ

๋ถ๋งˆํฌ ์ €์žฅ ๋ฐ ์‚ญ์ œ ๋ฉ”์„œ๋“œ๊ฐ€ ์›๊ฒฉ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์ ์ ˆํžˆ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


29-36: ์ฝ”์Šค ๋ฆฌ์ŠคํŠธ ๋งคํ•‘ ๋กœ์ง ํ™•์ธ

getAddMyCourse ๋ฉ”์„œ๋“œ์—์„œ ์‘๋‹ต DTO์˜ courses ๋ฆฌ์ŠคํŠธ๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


39-43: ์ฝ”์Šค ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ํ™•์ธ

getCourseDetail ๋ฉ”์„œ๋“œ๊ฐ€ ์›๊ฒฉ ๋ฐ์ดํ„ฐ์†Œ์Šค ํ˜ธ์ถœ๊ณผ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘์„ ์ ์ ˆํžˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

remote/maps/src/main/java/com/teamsolply/solply/maps/service/MapsService.kt (3)

3-11: Import ๋ฌธ๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด DTO ํด๋ž˜์Šค๋“ค๊ณผ Retrofit ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ด ์ ์ ˆํ•˜๊ฒŒ import๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


14-20: ์žฅ์†Œ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

RESTful ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, Long ํƒ€์ž… ์‚ฌ์šฉ๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


43-46: ์ฝ”์Šค ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

RESTful ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์ƒ์„ธ ์กฐํšŒ ๋ฉ”์„œ๋“œ๋“ค๊ณผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Comment on lines +48 to +51
private fun containsExtension(url: String, extension: String): Boolean {
val regex = Regex("\\.$extension(\\?|$)", RegexOption.IGNORE_CASE)
return regex.containsMatchIn(url)
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํ™•์žฅ์ž ๊ฒ€์ถœ ๋กœ์ง ๊ฐœ์„  ํ•„์š”

ํ˜„์žฌ ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ํ™•์žฅ์ž ๊ฒ€์ถœ์ด ๋ชจ๋“  URL ํ˜•ํƒœ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ณต์žกํ•œ URL์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” robustํ•œ ํ™•์žฅ์ž ๊ฒ€์ถœ ๋กœ์ง์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค:

 private fun containsExtension(url: String, extension: String): Boolean {
-    val regex = Regex("\\.$extension(\\?|$)", RegexOption.IGNORE_CASE)
-    return regex.containsMatchIn(url)
+    return try {
+        val uri = java.net.URI(url)
+        val path = uri.path ?: ""
+        path.substringAfterLast('.', "").equals(extension, ignoreCase = true)
+    } catch (e: Exception) {
+        // Fallback to regex if URI parsing fails
+        val regex = Regex("\\.$extension(\\?|$)", RegexOption.IGNORE_CASE)
+        regex.containsMatchIn(url)
+    }
 }
๐Ÿ“ 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
private fun containsExtension(url: String, extension: String): Boolean {
val regex = Regex("\\.$extension(\\?|$)", RegexOption.IGNORE_CASE)
return regex.containsMatchIn(url)
}
private fun containsExtension(url: String, extension: String): Boolean {
return try {
val uri = java.net.URI(url)
val path = uri.path ?: ""
path.substringAfterLast('.', "").equals(extension, ignoreCase = true)
} catch (e: Exception) {
// Fallback to regex if URI parsing fails
val regex = Regex("\\.$extension(\\?|$)", RegexOption.IGNORE_CASE)
regex.containsMatchIn(url)
}
}
๐Ÿค– Prompt for AI Agents
In core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt
around lines 48 to 51, the current regex-based extension detection may fail on
complex URLs with query parameters. Improve the logic by parsing the URL to
extract the path component and then checking if the path ends with the given
extension, ignoring case. This approach avoids false matches in query strings
and ensures more accurate extension detection.

Comment on lines +25 to +32
val imageLoader = ImageLoader.Builder(context)
.components {
when {
isSvg -> add(SvgDecoder.Factory())
isGif -> add(GifDecoder.Factory())
}
}
.build()
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ImageLoader ์บ์‹ฑ ํ•„์š”

ํ˜„์žฌ ImageLoader๊ฐ€ ๋งค๋ฒˆ ์ปดํฌ์ง€์…˜๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ImageLoader๋ฅผ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜ remember๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

+    val imageLoader = remember(isSvg, isGif) {
+        ImageLoader.Builder(context)
+            .components {
+                when {
+                    isSvg -> add(SvgDecoder.Factory())
+                    isGif -> add(GifDecoder.Factory())
+                }
+            }
+            .build()
+    }
-    val imageLoader = ImageLoader.Builder(context)
-        .components {
-            when {
-                isSvg -> add(SvgDecoder.Factory())
-                isGif -> add(GifDecoder.Factory())
-            }
-        }
-        .build()
๐Ÿค– Prompt for AI Agents
In core/ui/src/main/java/com/teamsolply/solply/ui/image/AdaptationImage.kt
around lines 25 to 32, the ImageLoader is being recreated on every composition,
which can degrade performance. To fix this, cache the ImageLoader instance by
using a remember block or another caching mechanism so that it is only created
once and reused across compositions, improving efficiency.

Comment on lines +65 to 66
placeImageUrls.size
3
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํŽ˜์ด์ € ์ƒํƒœ ์ดˆ๊ธฐํ™” ๊ฒ€ํ†  ํ•„์š”

placeImageUrls.size์™€ ๊ณ ์ •๊ฐ’ 3์ด ๋ชจ๋‘ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ˆ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

-        placeImageUrls.size
-        3
+        placeImageUrls.size
๐Ÿค– Prompt for AI Agents
In
feature/maps/src/main/java/com/teamsolply/solply/maps/component/bottomsheet/PlaceDetailBottomSheet.kt
around lines 65 to 66, there is a discrepancy between using placeImageUrls.size
and the fixed value 3. This likely causes inconsistent pager state
initialization. Replace the fixed value 3 with placeImageUrls.size to ensure the
pager state correctly reflects the actual number of images.

title = this.title,
placeCount = this.placeCount,
thumbnailImage = this.thumbnailImage,
mainTag = this.mainTags.map { PlaceType.valueOf(it) },
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์—ด๊ฑฐํ˜• ๋ณ€ํ™˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•„์š”

PlaceType.valueOf(it)๋Š” ์ผ์น˜ํ•˜๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์—†์„ ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

-        mainTag = this.mainTags.map { PlaceType.valueOf(it) },
+        mainTag = this.mainTags.mapNotNull { 
+            try { PlaceType.valueOf(it) } catch (e: IllegalArgumentException) { null }
+        },

๋˜๋Š” ์„œ๋ฒ„์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์—ด๊ฑฐํ˜• ๊ฐ’๋งŒ ์ „๋‹ฌ๋˜๋„๋ก ๋ณด์žฅํ•˜์„ธ์š”.

๐Ÿ“ 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
mainTag = this.mainTags.map { PlaceType.valueOf(it) },
mainTag = this.mainTags.mapNotNull {
try { PlaceType.valueOf(it) } catch (e: IllegalArgumentException) { null }
},
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseInfoEntityMapper.kt
at line 13, the use of PlaceType.valueOf(it) can throw an exception if the
string does not match any enum constant. To fix this, add exception handling
around the valueOf call or use a safe conversion method that returns a default
or null value when no match is found, ensuring the code does not crash on
invalid input.


fun CourseDto.toEntity(): CourseInfoEntity {
return CourseInfoEntity(
courseId = this.courseId.toInt(),
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํƒ€์ž… ๋ณ€ํ™˜ ์•ˆ์ „์„ฑ ๊ฒ€ํ†  ํ•„์š”

Long์—์„œ Int๋กœ์˜ ๋ณ€ํ™˜์€ ๋ฐ์ดํ„ฐ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ courseId๋ฅผ Long์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

-        courseId = this.courseId.toInt(),
+        courseId = this.courseId,

๊ทธ๋ฆฌ๊ณ  CourseInfoEntity์˜ courseId ํƒ€์ž…์„ Long์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

๐Ÿ“ 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
courseId = this.courseId.toInt(),
courseId = this.courseId,
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseInfoEntityMapper.kt
at line 9, the code converts courseId from Long to Int, which risks data loss.
To fix this, change the courseId type in the domain model to Long and update the
CourseInfoEntity's courseId type to Long as well, then remove the toInt()
conversion to maintain type consistency and safety.

latitude = latitude,
longitude = longitude,
placeTag = placeType,
placeDefaultId = placeDefaultId.toInt()
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

String to Int ๋ณ€ํ™˜ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

placeDefaultId.toInt() ํ˜ธ์ถœ ์‹œ String์ด ์œ ํšจํ•œ ์ •์ˆ˜๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ NumberFormatException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ˆ์ „ํ•œ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

-        placeDefaultId = placeDefaultId.toInt()
+        placeDefaultId = placeDefaultId.toIntOrNull() ?: 0

๋˜๋Š” ๋” ์•ˆ์ „ํ•œ ์ ‘๊ทผ์„ ์œ„ํ•ด:

-        placeDefaultId = placeDefaultId.toInt()
+        placeDefaultId = runCatching { placeDefaultId.toInt() }.getOrDefault(0)
๐Ÿ“ 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
placeDefaultId = placeDefaultId.toInt()
// before (line 30)
- placeDefaultId = placeDefaultId.toInt()
// after
+ placeDefaultId = placeDefaultId.toIntOrNull() ?: 0
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/mapper/CourseDetailEntityMapper.kt
at line 30, the direct call to placeDefaultId.toInt() can throw a
NumberFormatException if the string is not a valid integer. To fix this, replace
the direct conversion with a safe parsing method such as toIntOrNull(), and
handle the null case appropriately to avoid exceptions during runtime.

Comment on lines +17 to +18
latitude = latitude.toDouble(),
longitude = longitude.toDouble(),
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ขŒํ‘œ ๋ฌธ์ž์—ด์˜ Double ๋ณ€ํ™˜ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

latitude.toDouble()๊ณผ longitude.toDouble() ํ˜ธ์ถœ ์‹œ ๋ฌธ์ž์—ด์ด ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ NumberFormatException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ ๋ณ€ํ™˜์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

-        latitude = latitude.toDouble(),
-        longitude = longitude.toDouble(),
+        latitude = latitude.toDoubleOrNull() ?: 0.0,
+        longitude = longitude.toDoubleOrNull() ?: 0.0,
๐Ÿ“ 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
latitude = latitude.toDouble(),
longitude = longitude.toDouble(),
latitude = latitude.toDoubleOrNull() ?: 0.0,
longitude = longitude.toDoubleOrNull() ?: 0.0,
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/mapper/PlaceDetailEntityMapper.kt
around lines 17 to 18, the calls to latitude.toDouble() and longitude.toDouble()
can throw NumberFormatException if the strings are not valid numbers. To fix
this, implement safe parsing by catching exceptions or using a safe conversion
method that returns a default value or null when parsing fails, ensuring the
application does not crash due to invalid coordinate strings.

return PlaceDetailEntity(
placeId = placeId,
placeName = placeName,
primaryTag = PlaceType.valueOf(primaryTag),
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

PlaceType.valueOf() ํ˜ธ์ถœ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

primaryTag ๊ฐ’์ด ์œ ํšจํ•œ PlaceType enum ๊ฐ’๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ IllegalArgumentException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ ๋ณ€ํ™˜์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

-        primaryTag = PlaceType.valueOf(primaryTag),
+        primaryTag = PlaceType.entries.find { it.name == primaryTag } ?: PlaceType.EMPTY,

๋˜๋Š” runCatching์„ ์‚ฌ์šฉํ•˜์—ฌ:

-        primaryTag = PlaceType.valueOf(primaryTag),
+        primaryTag = runCatching { PlaceType.valueOf(primaryTag) }.getOrDefault(PlaceType.EMPTY),
๐Ÿ“ 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
primaryTag = PlaceType.valueOf(primaryTag),
primaryTag = PlaceType.entries.find { it.name == primaryTag } ?: PlaceType.EMPTY,
Suggested change
primaryTag = PlaceType.valueOf(primaryTag),
primaryTag = runCatching { PlaceType.valueOf(primaryTag) }
.getOrDefault(PlaceType.EMPTY),
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/mapper/PlaceDetailEntityMapper.kt
at line 13, the call to PlaceType.valueOf(primaryTag) can throw an
IllegalArgumentException if primaryTag does not match any enum constant. To fix
this, add exception handling around the valueOf call to safely handle invalid
values, such as using a try-catch block or Kotlin's runCatching to catch the
exception and provide a default value or null instead of letting the exception
propagate.

Comment on lines +210 to 228
fun getAllCourseInfo(
townId: Long,
placeId: Long
) {
viewModelScope.launch {
mapsRepository.getAllCourses().onSuccess {
mapsRepository.getAddMyCourse(
townId = townId,
placeId = placeId
).onSuccess {
reduce {
copy(
courses = it.toPersistentList()
)
}
}.onFailure {
Log.d("asdasdasd", it.toString())
}
}
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๊ฐœ์„  ํ•„์š”

์—๋Ÿฌ ๋กœ๊น…์—์„œ Log.d("asdasdasd", it.toString())๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ๋Š” ๋” ๋ช…ํ™•ํ•œ ํƒœ๊ทธ์™€ ๊ตฌ์กฐ์ ์ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

-            }.onFailure {
-                Log.d("asdasdasd", it.toString())
+            }.onFailure { exception ->
+                Log.e("MapsViewModel", "Failed to get courses: ${exception.message}", exception)
+                // TODO: ์‚ฌ์šฉ์ž์—๊ฒŒ ์—๋Ÿฌ ์ƒํƒœ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ
๐Ÿค– Prompt for AI Agents
In feature/maps/src/main/java/com/teamsolply/solply/maps/MapsViewModel.kt
between lines 210 and 228, the error handling uses a vague log tag "asdasdasd"
and simple Log.d for logging exceptions. Replace this with a clear, descriptive
log tag relevant to the class or function, and use Log.e to log errors with the
throwable to provide structured and meaningful error information suitable for
production. This will improve error traceability and debugging.

Comment on lines +3 to +8
import com.teamsolply.solply.maps.mapper.toEntity
import com.teamsolply.solply.maps.model.CourseDetailEntity
import com.teamsolply.solply.maps.model.CourseInfoEntity
import com.teamsolply.solply.maps.model.NewCourseEntity
import com.teamsolply.solply.maps.model.Place
import com.teamsolply.solply.maps.model.PlaceDetailEntity
import com.teamsolply.solply.maps.model.SnsLink
import com.teamsolply.solply.maps.source.MapsRemoteDataSource
import com.teamsolply.solply.model.PlaceType
import toEntity
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

์ค‘๋ณต import ๋ฌธ์ œ

toEntity ํ•จ์ˆ˜๊ฐ€ ๋‘ ๋ฒˆ import๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 8๋ฒˆ์งธ ์ค„์˜ import toEntity๋Š” ๋ถˆํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

 import com.teamsolply.solply.maps.mapper.toEntity
 import com.teamsolply.solply.maps.model.CourseDetailEntity
 import com.teamsolply.solply.maps.model.CourseInfoEntity
 import com.teamsolply.solply.maps.model.PlaceDetailEntity
 import com.teamsolply.solply.maps.source.MapsRemoteDataSource
-import toEntity
๐Ÿ“ 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
import com.teamsolply.solply.maps.mapper.toEntity
import com.teamsolply.solply.maps.model.CourseDetailEntity
import com.teamsolply.solply.maps.model.CourseInfoEntity
import com.teamsolply.solply.maps.model.NewCourseEntity
import com.teamsolply.solply.maps.model.Place
import com.teamsolply.solply.maps.model.PlaceDetailEntity
import com.teamsolply.solply.maps.model.SnsLink
import com.teamsolply.solply.maps.source.MapsRemoteDataSource
import com.teamsolply.solply.model.PlaceType
import toEntity
import com.teamsolply.solply.maps.mapper.toEntity
import com.teamsolply.solply.maps.model.CourseDetailEntity
import com.teamsolply.solply.maps.model.CourseInfoEntity
import com.teamsolply.solply.maps.model.PlaceDetailEntity
import com.teamsolply.solply.maps.source.MapsRemoteDataSource
๐Ÿค– Prompt for AI Agents
In
data/maps/src/main/java/com/teamsolply/solply/maps/repository/MapsRepositoryImpl.kt
around lines 3 to 8, there is a duplicate import of the toEntity function.
Remove the redundant import statement on line 8 that simply says 'import
toEntity' to eliminate the duplicate import issue.

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.

[Feature] ์ง€๋„ api

2 participants