Skip to content

Conversation

@leeseokchan00
Copy link
Contributor

@leeseokchan00 leeseokchan00 commented Jun 25, 2025

📌 PR 요약

🌱 작업한 내용

  • 와이어 프레임이 어느 정도 정해짐에 따라 feature 모듈 생성
  • domain, data, local ouath모듈 생성
  • navigation 연결
  • 소셜 로그인 성공시 암호화 datastore에 저장

🌱 PR 포인트

📸 스크린샷

스크린샷
Screen_recording_20250626_004316.mp4

|파일첨부바람|

📮 관련 이슈

Summary by CodeRabbit

  • New Features

    • 온보딩, 장소, 코스, 지도, 마이페이지 등 신규 기능 화면 및 네비게이션 추가
    • OAuth 인증 및 토큰 저장 기능 도입
    • 각 기능별 독립된 모듈 구조로 프로젝트 확장
  • Refactor

    • 기존 홈 화면 및 더미 코드, 불필요한 인터페이스와 클래스 삭제
    • 데이터 저장 구조를 토큰 중심으로 변경
  • Bug Fixes

    • 네비게이션 및 화면 전환 로직 개선
  • Chores

    • .gitignore 및 빌드 스크립트 정비, 워크플로우 파일 정리
  • Documentation

    • 예시 및 템플릿 ProGuard 설정 파일 제거

@leeseokchan00 leeseokchan00 requested a review from a team June 25, 2025 15:44
@leeseokchan00 leeseokchan00 self-assigned this Jun 25, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jun 25, 2025

Walkthrough

OAuth 인증, 온보딩, 장소, 코스, 지도, 마이페이지 등 주요 기능별로 프로젝트가 다중 모듈 구조로 대대적으로 리팩토링되었습니다. 기존의 더미 코드와 홈 관련 파일이 제거되고, 각 기능별로 새로운 Gradle 설정, 네비게이션, ViewModel, DI 모듈 등이 추가되었습니다. OAuth 토큰 데이터 저장 및 전달 방식이 명확하게 분리 및 개선되었습니다.

Changes

파일/경로 그룹 변경 요약
.github/workflows/android-pull-request-ci.yml
data/build.gradle.kts
feature/home/proguard-rules.pro
local/proguard-rules.pro
CI 워크플로우, data 모듈 빌드 스크립트, ProGuard 설정 등 불필요 파일 삭제
settings.gradle.kts 프로젝트 모듈 구조를 도메인/데이터/로컬의 OAuth 하위 모듈 및 신규 기능(feature) 모듈로 재구성
app/build.gradle.kts
feature/main/build.gradle.kts
종속성에서 더미/홈 모듈 제거, OAuth/온보딩/장소/코스/지도/마이페이지 등 신규 기능 모듈 추가
feature/main/src/main/java/com/teamsolply/solply/main/MainNavTab.kt
MainNavigator.kt
네비게이션 탭 및 네비게이터에서 HOME/더미 라우트 제거, PLACE/COURSE 등 실제 기능 탭으로 변경, 관련 네비게이션 함수 추가
feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt 네비게이션 그래프에 온보딩, 장소, 코스, 지도, 마이페이지 등 신규 그래프 추가 및 OAuth-온보딩-장소 간 이동 흐름 구현
core/datastore/... SolplyLocalDataSolplyTokenData로 데이터 타입 및 직렬화 클래스 일괄 변경, DI 어노테이션 추가
data/oauth/...
domain/oauth/...
local/oauth/...
OAuth 토큰 저장/조회 위한 레포지토리, 데이터소스, DI 모듈, 엔티티 등 신규 도메인/데이터/로컬 계층 클래스 및 DI 모듈 추가
feature/oauth/... OAuth 화면, ViewModel, Intent/SideEffect 등 패키지/파일 위치 및 구조 변경, 카카오 로그인 성공 시 토큰 저장 및 온보딩 이동 구현
feature/onboarding/... 온보딩 화면, ViewModel, Intent/SideEffect, 네비게이션, Gradle 스크립트 등 신규 추가
feature/place/...
feature/course/...
feature/maps/...
feature/mypage/...
각 기능별 화면, 네비게이션, Gradle, .gitignore, AndroidManifest 등 신규 추가 및 네임스페이스/패키지 구조 정비
data/src/main/java/com/teamsolply/solply/dummy/data/DummyData.kt
domain/src/main/java/com/teamsolply/solply/dummy/...
local/src/main/java/com/teamsolply/solply/dummy/local/DummyLocalData.kt
더미 데이터/모델/레포지토리/로컬 클래스 일괄 삭제
remote/build.gradle.kts 불필요한 data 모듈 의존성 제거

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant OauthScreen
    participant OauthViewModel
    participant OauthRepository
    participant OauthLocalDataSource
    participant DataStore

    User->>OauthScreen: 카카오 로그인 클릭
    OauthScreen->>OauthViewModel: OauthIntent.KakaoLoginClick
    OauthViewModel->>OauthScreen: OauthSideEffect.StartKakaoLogin
    OauthScreen->>User: 카카오 로그인 SDK 실행
    User->>OauthScreen: 로그인 성공(토큰 전달)
    OauthScreen->>OauthViewModel: OauthIntent.KakaoLoginSuccess
    OauthViewModel->>OauthRepository: saveJwtToken(TokenEntity)
    OauthRepository->>OauthLocalDataSource: setAuthLocalData(SolplyTokenData)
    OauthLocalDataSource->>DataStore: updateData
    DataStore-->>OauthLocalDataSource: 저장 완료
    OauthLocalDataSource-->>OauthRepository: 완료
    OauthRepository-->>OauthViewModel: Result<Unit>
    OauthViewModel->>OauthScreen: OauthSideEffect.NavigateToOnBoarding
    OauthScreen->>User: 온보딩 화면으로 이동
Loading
sequenceDiagram
    participant User
    participant OnBoardingScreen
    participant OnBoardingViewModel

    User->>OnBoardingScreen: 온보딩 버튼 클릭
    OnBoardingScreen->>OnBoardingViewModel: OnBoardingIntent.OnBoardingButtonClick
    OnBoardingViewModel->>OnBoardingScreen: OnBoardingSideEffect.NavigateToPlace
    OnBoardingScreen->>User: 장소 화면으로 이동
Loading

Possibly related PRs

  • SOLPLY/SOLPLY-ANDROID#4: 카카오 로그인 SDK 연동 초기 PR로, 본 PR의 OAuth 로그인 및 토큰 저장/네비게이션 확장과 직접적으로 연관됨.

Poem

🐰
새싹 모듈이 쏙쏙,
더미는 안녕,
토큰은 안전하게,
온보딩도 척척!
네비게이션 타고
토끼는 깡총깡총
솔플라이, 앞으로 Go! 🚀

✨ Finishing Touches
  • 📝 Generate Docstrings

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

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

🔭 Outside diff range comments (3)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)

41-50: 보안 위험: 민감한 토큰 정보 로깅을 제거해주세요.

액세스 토큰과 리프레시 토큰이 로그에 평문으로 기록되고 있습니다. 이는 보안 위험을 초래할 수 있습니다.

-                        Log.d(
-                            "asdasdasd",
-                            "accessToken: ${accessToken}\n refreshToken: $refreshToken"
-                        )
+                        // 토큰 저장 성공 로그 (민감한 정보 제외)
+                        Log.d("OauthScreen", "OAuth login successful")
core/datastore/src/main/java/com/teamsolply/solply/datastore/SolplySecureDataStoreSerializer.kt (2)

54-78: 복호화 로직에서 예외 처리를 개선해주세요.

현재 모든 예외에 대해 printStackTrace()를 호출하고 있는데, 이는 로그에 민감한 정보가 노출될 위험이 있습니다.

다음과 같이 개선하는 것을 권장합니다:

         } catch (e: Exception) {
-            e.printStackTrace()
+            // 보안상 상세한 에러 정보는 로깅하지 않음
+            android.util.Log.w("DataStore", "토큰 읽기 실패, 기본값 사용")
             defaultValue
         }

80-100: 암호화 로직에서 예외 처리를 개선해주세요.

복호화와 마찬가지로 암호화 실패 시에도 민감한 정보가 로그에 노출될 위험이 있습니다.

다음과 같이 개선하는 것을 권장합니다:

         } catch (e: Exception) {
-            e.printStackTrace()
-            throw e
+            android.util.Log.e("DataStore", "토큰 암호화 실패")
+            throw SecurityException("토큰 저장에 실패했습니다")
         }
♻️ Duplicate comments (3)
feature/place/.gitignore (1)

1-1: .gitignore 중복 관리와 동일 이슈

local/oauth/.gitignore 코멘트와 동일한 맥락입니다.
공통 규칙을 루트로 올리는 방향을 고려해 주세요.

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

13-17: PlaceScreen과 동일한 paddingValues 사용 이슈가 있습니다.

CourseRoute에서 paddingValues를 받지만 사용하지 않는 문제가 PlaceScreen과 동일합니다.

PlaceScreen과 동일한 방식으로 수정을 제안합니다:

 @Composable
 fun CourseRoute(
     paddingValues: PaddingValues
 ) {
-    CourseScreen()
+    CourseScreen(paddingValues = paddingValues)
 }
feature/course/src/main/java/com/teamsolply/solply/course/navigation/CourseNavigation.kt (1)

1-29: 일관된 네비게이션 패턴을 잘 따르고 있습니다.

다른 네비게이션 파일들과 동일한 패턴을 사용하여 일관성이 좋습니다. 하지만 앞서 언급한 코드 중복 개선 사항이 여기에도 적용됩니다.

🧹 Nitpick comments (15)
domain/oauth/.gitignore (1)

1-1: 루트 .gitignore에 이미 /build 패턴이 있다면 중복입니다
프로젝트 최상위 .gitignore에서 **/build/ 혹은 /build를 이미 무시하고 있다면, 모듈별 .gitignore에 동일 항목을 두는 것은 불필요한 중복입니다. 한 곳에서만 관리하면 패턴 수정·추가 시 누락을 방지할 수 있으니 확인 후 중복이라면 삭제를 권장합니다.

-/build
feature/mypage/.gitignore (1)

1-1: 모듈별 .gitignore 중복 규칙은 루트 .gitignore로 통합하는 방안을 고려해 주세요.

/build 디렉터리를 무시하는 규칙이 각 모듈마다 반복되고 있습니다.
프로젝트 루트의 .gitignore**/build/ 패턴을 추가하면 중복을 제거하고 유지보수를 단순화할 수 있습니다.

feature/onboarding/.gitignore (1)

1-1: 중복 .gitignore 규칙 통합 제안

앞선 코멘트와 동일하게, /build 무시 규칙을 루트 .gitignore로 옮기면 모듈 추가/삭제 시 규칙 관리가 용이합니다.

feature/course/.gitignore (1)

1-1: /build 무시 규칙 중앙집중화 권장

불필요한 파일 수를 줄이고 일관성을 위해 루트 .gitignore로 이동하는 것을 추천드립니다.

feature/maps/.gitignore (1)

1-1: 규칙 중복 제거 권장

모듈별 동일 규칙이 반복되고 있습니다. 루트 .gitignore**/build/ 패턴을 추가해보세요.

local/oauth/.gitignore (1)

1-1: 중복 .gitignore 관리 제안

모듈별로 /build만 단독 지정된 파일이 다수 존재합니다.
프로젝트 루트의 .gitignore에 공통 항목을 두고, 모듈 단위 파일은 필요한 특수 규칙이 있을 때만 추가하도록 하면 관리 부담이 줄어듭니다.

local/oauth/src/main/java/com/teamsolply/solply/oauth/di/AuthLocalDataModule.kt (1)

13-13: 클래스명 일관성을 개선해보세요.

기능적으로는 올바르지만, 클래스명이 AuthLocalDataModule인데 OauthLocalDataSource를 바인딩하고 있어 일관성이 부족합니다.

-abstract class AuthLocalDataModule {
+abstract class OauthLocalDataModule {
feature/main/src/main/java/com/teamsolply/solply/main/MainNavTab.kt (1)

13-22: 탭 구조 개선이 잘 되었습니다.

더미 탭을 실제 기능 탭(PLACE, COURSE)으로 교체한 것이 좋습니다.

사용자 경험 향상을 위해 각 탭에 고유한 아이콘을 사용하는 것을 권장합니다:

 PLACE(
-    iconResId = com.teamsolply.solply.designsystem.R.drawable.ic_bottom_nav_dummy,
+    iconResId = com.teamsolply.solply.designsystem.R.drawable.ic_bottom_nav_place,
     contentDescription = "PLACE",
     Place
 ),
 COURSE(
-    iconResId = com.teamsolply.solply.designsystem.R.drawable.ic_bottom_nav_dummy,
+    iconResId = com.teamsolply.solply.designsystem.R.drawable.ic_bottom_nav_course,
     contentDescription = "COURSE",
     Course
 )
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (3)

48-48: 디버그 태그를 의미있는 이름으로 변경해주세요.

"asdasdasd"는 임시 디버그 태그로 보입니다. 일관된 로깅을 위해 의미있는 태그명을 사용해주세요.

-                            "asdasdasd",
+                            "OauthScreen",

86-131: 복잡한 Kakao 로그인 함수의 리팩토링을 고려해보세요.

함수가 너무 길고 복잡합니다. 가독성과 유지보수성 향상을 위해 분리를 고려해보세요.

다음과 같이 함수를 분리할 수 있습니다:

private fun loginWithKakaoTalk(
    activity: Activity,
    context: Context,
    onSuccess: (String, String?) -> Unit,
    onFailure: (Throwable) -> Unit
) { /* KakaoTalk 로그인 로직 */ }

private fun loginWithKakaoAccount(
    context: Context,
    onSuccess: (String, String?) -> Unit,
    onFailure: (Throwable) -> Unit
) { /* KakaoAccount 로그인 로직 */ }

96-98: Toast 메시지 현지화를 고려해보세요.

하드코딩된 한국어 메시지 대신 리소스 문자열 사용을 권장합니다.

// strings.xml에 추가
<string name="login_cancelled">로그인 취소</string>
<string name="login_failed">로그인 실패: %s</string>

// 코드에서 사용
Toast.makeText(context, context.getString(R.string.login_cancelled), Toast.LENGTH_SHORT).show()

Also applies to: 103-108, 123-123

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

29-31: 실제 지도 기능 구현이 필요합니다.

현재는 플레이스홀더 텍스트만 표시하고 있습니다. 향후 실제 지도 컴포넌트(Google Maps, Naver Maps 등)를 통합할 계획이 있는지 확인이 필요합니다.

실제 지도 기능 구현에 도움이 필요하시면 관련 라이브러리 통합 방안을 제시해드릴 수 있습니다.

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

1-29: 네비게이션 패턴 중복을 고려해 보세요.

구현 자체는 올바르고 일관성이 있지만, 다른 네비게이션 파일들과 거의 동일한 구조를 가지고 있습니다. 공통 패턴을 추상화하여 코드 중복을 줄이는 것을 고려해 보세요.

예를 들어, 다음과 같은 공통 함수를 만들 수 있습니다:

inline fun <reified T : Route> NavController.navigateToRoute(
    route: T,
    navOptions: NavOptions
) {
    navigate(route, navOptions)
}

inline fun <reified T : Route> NavGraphBuilder.addRouteComposable(
    route: T,
    crossinline content: @Composable () -> Unit
) {
    composable<T> { content() }
}
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1)

35-52: UI 구현이 매우 간단합니다.

현재 온보딩 화면이 클릭 가능한 텍스트만으로 구현되어 있습니다. 구조적 변경에 집중한 PR이라 의도적일 수 있지만, 실제 온보딩 UI가 필요한지 확인해 보세요.

이후 온보딩 UI를 개선할 계획이 있으신지 확인이 필요합니다. 필요하다면 다음과 같은 요소들을 고려해 볼 수 있습니다:

  • 온보딩 단계별 화면
  • 진행 표시기
  • 건너뛰기 옵션
  • 더 나은 시각적 디자인
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (1)

16-28: TODO 주석을 처리하여 완전한 에러 핸들링을 구현해주세요.

KakaoLoginFailure 인텐트에 대한 처리가 TODO로 남아있어 런타임에서 NotImplementedError가 발생할 수 있습니다.

다음 구현을 제안합니다:

-            is OauthIntent.KakaoLoginFailure -> {
-                TODO()
-            }
+            is OauthIntent.KakaoLoginFailure -> {
+                postSideEffect(OauthSideEffect.ShowLoginError(intent.errorMessage))
+            }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4ec8ef0 and 449950d.

📒 Files selected for processing (61)
  • .github/workflows/android-pull-request-ci.yml (0 hunks)
  • app/build.gradle.kts (1 hunks)
  • core/datastore/src/main/java/com/teamsolply/solply/datastore/SolplySecureDataStoreSerializer.kt (4 hunks)
  • core/datastore/src/main/java/com/teamsolply/solply/datastore/SolplyTokenData.kt (1 hunks)
  • core/datastore/src/main/java/com/teamsolply/solply/datastore/di/DataStoreModule.kt (1 hunks)
  • data/build.gradle.kts (0 hunks)
  • data/oauth/build.gradle.kts (1 hunks)
  • data/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthDataModule.kt (1 hunks)
  • data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt (1 hunks)
  • data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthLocalDataSource.kt (1 hunks)
  • data/src/main/java/com/teamsolply/solply/dummy/data/DummyData.kt (0 hunks)
  • domain/oauth/.gitignore (1 hunks)
  • domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt (1 hunks)
  • domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt (1 hunks)
  • domain/src/main/java/com/teamsolply/solply/dummy/model/DummyModel.kt (0 hunks)
  • domain/src/main/java/com/teamsolply/solply/dummy/repository/DummyRepository.kt (0 hunks)
  • domain/src/main/java/com/teamsolply/solply/dummy/usecase/DummyUseCase.kt (0 hunks)
  • feature/course/.gitignore (1 hunks)
  • feature/course/build.gradle.kts (1 hunks)
  • feature/course/src/main/java/com/teamsolply/solply/course/CourseScreen.kt (1 hunks)
  • feature/course/src/main/java/com/teamsolply/solply/course/navigation/CourseNavigation.kt (1 hunks)
  • feature/home/proguard-rules.pro (0 hunks)
  • feature/main/build.gradle.kts (1 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainNavTab.kt (1 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (2 hunks)
  • feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (2 hunks)
  • feature/maps/.gitignore (1 hunks)
  • feature/maps/build.gradle.kts (1 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt (2 hunks)
  • feature/maps/src/main/java/com/teamsolply/solply/maps/navigation/MapsNavigation.kt (1 hunks)
  • feature/mypage/.gitignore (1 hunks)
  • feature/mypage/build.gradle.kts (1 hunks)
  • feature/mypage/src/main/AndroidManifest.xml (1 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/MypageScreen.kt (1 hunks)
  • feature/mypage/src/main/java/com/teamsolply/solply/mypage/navigation/MypageNavigation.kt (1 hunks)
  • feature/oauth/build.gradle.kts (1 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt (2 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (4 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (1 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt (2 hunks)
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/presentation/OauthViewModel.kt (0 hunks)
  • feature/onboarding/.gitignore (1 hunks)
  • feature/onboarding/build.gradle.kts (1 hunks)
  • feature/onboarding/src/main/AndroidManifest.xml (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (1 hunks)
  • feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt (1 hunks)
  • feature/place/.gitignore (1 hunks)
  • feature/place/build.gradle.kts (1 hunks)
  • feature/place/src/main/AndroidManifest.xml (1 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt (1 hunks)
  • feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt (1 hunks)
  • local/oauth/.gitignore (1 hunks)
  • local/oauth/build.gradle.kts (1 hunks)
  • local/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthLocalDataSourceImpl.kt (1 hunks)
  • local/oauth/src/main/java/com/teamsolply/solply/oauth/di/AuthLocalDataModule.kt (1 hunks)
  • local/proguard-rules.pro (0 hunks)
  • local/src/main/java/com/teamsolply/solply/dummy/local/DummyLocalData.kt (0 hunks)
  • remote/build.gradle.kts (0 hunks)
  • settings.gradle.kts (1 hunks)
💤 Files with no reviewable changes (11)
  • remote/build.gradle.kts
  • domain/src/main/java/com/teamsolply/solply/dummy/model/DummyModel.kt
  • domain/src/main/java/com/teamsolply/solply/dummy/usecase/DummyUseCase.kt
  • domain/src/main/java/com/teamsolply/solply/dummy/repository/DummyRepository.kt
  • data/src/main/java/com/teamsolply/solply/dummy/data/DummyData.kt
  • local/src/main/java/com/teamsolply/solply/dummy/local/DummyLocalData.kt
  • feature/home/proguard-rules.pro
  • local/proguard-rules.pro
  • data/build.gradle.kts
  • feature/oauth/src/main/java/com/teamsolply/solply/oauth/presentation/OauthViewModel.kt
  • .github/workflows/android-pull-request-ci.yml
🔇 Additional comments (58)
feature/place/src/main/AndroidManifest.xml (1)

1-4: package 속성 확인 필요

manifest 요소만 존재합니다. AGP 8.0 이상에서 namespacebuild.gradle에 선언했다면 문제없지만, 그렇지 않다면 package="com.your.package" 속성을 명시하거나 Gradle 설정을 확인해 주세요.
또한 실제 컴포넌트가 없다면 이 파일이 불필요할 수도 있으므로 존재 이유를 한번 더 검토해 주세요.

feature/mypage/src/main/AndroidManifest.xml (1)

2-4: 패키지(package) 속성 누락 검토 필요

AGP 8부터 namespacepackage를 대체하지만, 특정 서드-파티 라이브러리나 Manifest 병합 규칙이 package를 직접 참조하는 경우가 아직 있습니다.
빌드 및 런타임 단계에서 예상치 못한 병합 충돌이 발생하지 않는지 한 번 더 확인해 주세요.

feature/maps/build.gradle.kts (1)

5-7: 네임스페이스 변경에 따른 참조 코드 확인 권장

namespace = "com.teamsolply.solply.maps" 로 수정되었으므로

  1. AndroidManifest(들) 및 ProGuard/R8 규칙에서 이전 home 네임스페이스가 남아 있지 않은지
  2. DI 모듈, hiltViewModel() 등에서 HomeMaps 로 클래스 명이 일관되게 수정됐는지

검색 한 번 돌려서 누락된 참조가 없는지 확인해 주세요.

feature/oauth/build.gradle.kts (1)

9-12: 의존성 범위 점검

implementation(projects.domain.oauth) 로 설정했는데,
feature-layer에서 domain API 를 외부로 노출할 필요가 있으면 api() 로 승격해야 하며, 반대로 내부 전용이면 implementation이 적절합니다. 현재 공개 범위를 한번 더 검토해 주세요.

feature/mypage/build.gradle.kts (2)

1-3: 버전 카탈로그 alias 존재 여부 확인 필요

libs.plugins.solply.feature 항목이 libs.versions.toml에 실제로 정의되어 있는지 확인하지 않으면 빌드 단계에서 Unknown plugin 오류가 발생할 수 있습니다.


5-7: 네임스페이스가 실제 패키지 구조와 일치하는지 점검

com.teamsolply.solply.mypage 경로에 src/main/java 하위 패키지 구조가 일치하지 않으면 R 클래스 생성이나 Manifest 병합에서 문제가 생길 수 있습니다.

feature/onboarding/build.gradle.kts (2)

1-3: 플러그인 alias 정의 확인

모듈이 새로 추가되면서 버전 카탈로그에도 동일 alias가 포함되었는지 미리 확인해 주세요. 누락 시 CI 빌드 실패 원인이 됩니다.


5-7: 네임스페이스-패키지 정합성 검증

onboarding 모듈의 실제 소스 패키지가 이 네임스페이스와 불일치하면 런타임에서 ClassNotFoundException 등 이슈가 생길 수 있습니다.

feature/place/build.gradle.kts (2)

1-3: 플러그인 alias 유효성 점검

다른 모듈과 동일하게 libs.plugins.solply.feature가 참조되므로, 버전 카탈로그 업데이트 여부를 재확인해 주세요.


5-7: 네임스페이스 확인

com.teamsolply.solply.place 패키지 경로와 실제 소스 폴더 구조가 일치하는지 검증이 필요합니다.

feature/course/build.gradle.kts (2)

1-3: 플러그인 alias 정의 누락 위험

version-catalog에 solply.feature alias가 없으면 빌드 에러가 발생합니다. PR 범위에 포함됐는지 확인 바랍니다.


5-7: 네임스페이스와 소스 디렉터리 구조 일치 여부 확인

course 모듈 소스가 동일 네임스페이스를 따르는지 확인하지 않으면 코드-제너레이션 이슈가 발생할 수 있습니다.

local/oauth/build.gradle.kts (2)

6-6: 네임스페이스 변경이 적절합니다.

OAuth 관련 기능을 별도 모듈로 분리하면서 네임스페이스를 com.teamsolply.solply.oauth로 변경한 것은 모듈 분리 전략과 일치합니다.


12-12: 의존성 구조가 올바르게 설정되었습니다.

projects.data.oauth로 의존성을 변경한 것은 모듈화 전략에 맞으며, 로컬 데이터 소스가 데이터 레이어에 의존하는 구조가 적절합니다.

data/oauth/build.gradle.kts (1)

10-11: Clean Architecture 패턴을 잘 따르고 있습니다.

데이터 레이어가 도메인 레이어(projects.domain.oauth)와 데이터스토어(projects.core.datastore)에 의존하는 구조는 Clean Architecture의 의존성 규칙을 올바르게 준수합니다.

feature/main/build.gradle.kts (1)

11-15: 피처 모듈 분리가 잘 수행되었습니다.

기존의 단일 feature.home 모듈을 5개의 세분화된 피처 모듈로 분리한 것은 모듈 간 결합도를 낮추고 유지보수성을 높이는 좋은 접근입니다.

domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt (1)

3-6: 도메인 엔티티 설계가 적절합니다.

TokenEntity 클래스는 OAuth 토큰 정보를 캡슐화하는 도메인 모델로서 적절하게 설계되었습니다. 불변 속성(val)을 사용하여 데이터 무결성을 보장하고 있습니다.

data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthLocalDataSource.kt (1)

5-7: 인터페이스 설계가 적절합니다.

OauthLocalDataSource 인터페이스는 비동기 데이터 저장을 위해 suspend 함수를 사용하고 있으며, 단일 책임 원칙을 잘 따르고 있습니다. 매개변수명 jwtToken도 의도를 명확히 표현합니다.

domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt (1)

5-7: OAuth 리포지토리 인터페이스 구현이 깔끔합니다.

suspend 함수와 Result 사용으로 비동기 처리와 에러 핸들링이 적절히 고려되어 있습니다. 인터페이스 설계가 명확하고 단순합니다.

app/build.gradle.kts (1)

19-31: 모듈러 아키텍처로의 전환이 잘 구성되어 있습니다.

기존의 제네릭 모듈들을 OAuth 특화 모듈로 교체하고, 새로운 기능별 모듈들을 추가한 것이 프로젝트 구조를 더 명확하게 만들었습니다. 각 기능이 독립적으로 관리될 수 있어 유지보수성이 향상될 것입니다.

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

19-33: 플레이스홀더 스크린 구현이 깔끔합니다.

기본적인 화면 구조가 잘 구성되어 있고, 향후 실제 기능 구현 시 확장하기 좋은 구조입니다.

core/datastore/src/main/java/com/teamsolply/solply/datastore/SolplyTokenData.kt (1)

6-10: 토큰 데이터 구조가 명확하게 정의되었습니다.

accessToken과 refreshToken을 명시적으로 포함하고 기본값을 빈 문자열로 설정한 것이 적절합니다. @serializable 어노테이션으로 직렬화도 지원됩니다.

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

19-33: 코드 구조가 일관되고 깔끔합니다.

다른 feature 스크린들과 일관된 패턴을 따르고 있어 코드 가독성과 유지보수성이 좋습니다.

settings.gradle.kts (1)

35-45: 모듈 구조 개선이 잘 이루어졌습니다.

OAuth 기능을 위한 전용 모듈(domain:oauth, data:oauth, local:oauth)과 새로운 기능별 모듈들(onboarding, place, course, maps, mypage)로 분리한 것이 Clean Architecture 원칙에 잘 부합합니다. 기존의 범용 모듈에서 기능별로 세분화된 모듈 구조로 변경한 것은 코드의 응집성과 유지보수성을 크게 향상시킬 것입니다.

feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt (2)

9-9: 패키지 구조 변경이 적절합니다.

OauthRoutepresentation 패키지에서 루트 oauth 패키지로 이동한 것은 모듈 구조 단순화에 도움이 됩니다.


18-26: 온보딩 네비게이션 연결이 잘 구현되었습니다.

OAuth 인증 성공 후 온보딩으로의 자연스러운 사용자 플로우를 위한 navigateToOnBoarding 콜백 추가가 적절합니다. 사용자 경험 측면에서 논리적인 흐름을 제공합니다.

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

19-33: 초기 구현이 잘 되어 있습니다.

기본적인 Compose 구조와 레이아웃이 올바르게 구성되어 있습니다. 향후 실제 마이페이지 기능 구현을 위한 좋은 시작점입니다.

data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt (1)

11-18: 토큰 저장 로직이 잘 구현되었습니다.

도메인 엔티티(TokenEntity)를 데이터 모델(SolplyTokenData)로 변환하는 매핑과 runCatching을 통한 에러 핸들링이 적절합니다. Clean Architecture 원칙에 부합하는 좋은 구현입니다.

local/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthLocalDataSourceImpl.kt (1)

11-13: DataStore 활용이 적절합니다.

암호화된 토큰 저장을 위한 DataStore 사용과 updateData 메서드를 통한 안전한 데이터 업데이트가 올바르게 구현되었습니다.

data/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthDataModule.kt (1)

11-17: 깔끔한 DI 모듈 구현입니다.

Dagger Hilt의 모범 사례를 잘 따르고 있으며, SingletonComponent 스코프와 @BINDS 어노테이션을 올바르게 사용했습니다.

core/datastore/src/main/java/com/teamsolply/solply/datastore/di/DataStoreModule.kt (2)

8-8: 데이터 모델 변경이 올바르게 반영되었습니다.

SolplyLocalData에서 SolplyTokenData로의 변경이 적절히 적용되었습니다.


24-24: DataStore 타입 변경을 의존 컴포넌트에서 확인해주세요.

SolplySecureDataStoreSerializer와 이 DataStore를 사용하는 모든 컴포넌트가 SolplyTokenData 타입을 올바르게 처리하는지 확인이 필요합니다.

다음 스크립트로 DataStore 사용처를 확인해보세요:

#!/bin/bash
# Description: DataStore<SolplyTokenData> 사용처와 SolplySecureDataStoreSerializer 확인

# DataStore<SolplyTokenData> 사용처 검색
rg -A 3 "DataStore<SolplyTokenData>"

# SolplySecureDataStoreSerializer에서 SolplyTokenData 처리 확인  
rg -A 5 -B 5 "SolplyTokenData" --type kotlin
local/oauth/src/main/java/com/teamsolply/solply/oauth/di/AuthLocalDataModule.kt (1)

14-16: DI 바인딩이 올바르게 구현되었습니다.

Dagger Hilt의 모범 사례를 잘 따르고 있습니다.

feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (2)

1-1: 패키지 구조 개선이 적절합니다.

presentation 패키지에서 oauth로 이동한 것이 모듈 구조에 더 적합합니다.


29-29: 네비게이션 파라미터 추가가 적절합니다.

OAuth 성공 후 온보딩으로의 네비게이션 처리가 올바르게 구현되었습니다.

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

1-1: 패키지 리팩토링이 적절하게 수행되었습니다.

home에서 maps로의 패키지 및 기능 분리가 명확하고 일관성 있게 처리되었습니다.

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

7-17: MVI 패턴을 올바르게 구현했습니다.

BaseViewModel을 상속받아 일관된 아키텍처를 유지하고 있으며, Hilt를 통한 의존성 주입과 sealed interface를 활용한 타입 안전성 확보가 잘 되어 있습니다. 온보딩 버튼 클릭 시 장소 선택으로 이동하는 로직이 명확하게 구현되어 있습니다.

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

8-8: 새로운 네비게이션 의존성이 적절하게 추가되었습니다.

모듈화된 아키텍처에 맞춰 각 feature 모듈의 네비게이션 함수들을 올바르게 import하고 있습니다.

Also applies to: 12-15


33-35: 네비게이션 스택 관리가 개선되었습니다.

findStartDestination() 대신 navController.graph.id를 직접 사용하고 inclusive = false를 명시적으로 설정한 것은 네비게이션 스택 관리를 더 명확하게 만듭니다.


42-44: 탭 네비게이션이 모듈 구조에 맞게 업데이트되었습니다.

HOME에서 PLACE와 COURSE로 변경된 것이 새로운 feature 모듈 구조와 일치합니다.


47-53: 명시적인 네비게이션 함수들이 잘 구현되었습니다.

navigateToOnboardingnavigateToPlace 함수들이 NavOptions를 적절히 활용하여 타입 안전한 네비게이션을 제공하고 있습니다. 각 feature 모듈의 네비게이션 확장 함수를 올바르게 호출하고 있습니다.

feature/mypage/src/main/java/com/teamsolply/solply/mypage/navigation/MypageNavigation.kt (1)

1-29: 일관된 네비게이션 패턴을 잘 구현했습니다.

다른 feature 모듈들과 동일한 네비게이션 패턴을 따르고 있어 코드베이스의 일관성이 유지됩니다:

  • @Serializable data object를 사용한 타입 안전한 라우트 정의
  • NavController 확장 함수를 통한 네비게이션 기능 제공
  • NavGraphBuilder 확장 함수를 통한 그래프 구성
  • Route 인터페이스 구현으로 타입 안전성 확보

전체적인 모듈화된 아키텍처에 잘 맞는 구현입니다.

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

1-31: 타입 안전한 네비게이션 구현이 잘 되어 있습니다.

Compose Navigation의 모범 사례를 잘 따르고 있으며, serializable 데이터 객체를 사용한 타입 안전한 라우팅이 적절합니다. 확장 함수를 통한 네비게이션 로직 분리도 깔끔합니다.

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

13-14: 카카오 로그인 Intent 구조가 적절합니다.

accessToken과 선택적 refreshToken을 모두 처리할 수 있는 구조로 되어 있어 좋습니다. 토큰 관리에 필요한 정보를 적절히 캡처하고 있습니다.


19-19: 네비게이션 플로우가 명확하게 정의되었습니다.

OAuth 성공 후 온보딩으로 이동하는 플로우가 side effect를 통해 명확히 분리되어 있어 좋습니다.


1-1: 전체 파일 타입에서 이전 패키지 참조를 재검토해 보겠습니다. 다음 스크립트를 실행해주세요:

#!/bin/bash
# Kotlin뿐 아니라 모든 파일에서 이전 패키지 경로를 검색합니다
rg "com\.teamsolply\.solply\.oauth\.presentation" -n
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1)

16-33: Side Effect 처리와 네비게이션 분리가 잘 되어 있습니다.

LaunchedEffectWithLifecycle을 사용한 side effect 처리와 네비게이션 콜백 분리가 적절합니다. Route와 Screen 컴포저블의 책임 분리도 좋습니다.

feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (1)

11-15: 클래스 선언과 의존성 주입이 올바르게 구현되었습니다.

HiltViewModel 어노테이션과 생성자 주입을 통한 OauthRepository 의존성 주입이 적절하게 설정되어 있습니다.

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

42-50: OAuth 네비게이션 설정이 적절하게 구현되었습니다.

네비게이션 옵션에 launchSingleTop을 설정하여 중복 화면 생성을 방지하는 것이 좋습니다.


63-66: 네비게이션 그래프들이 올바르게 추가되었습니다.

새로운 기능 모듈들(place, course, mypage, maps)의 네비게이션이 적절하게 통합되어 있습니다.


51-62: popUpTo 사용 위치와 inclusive = true 설정을 모두 재검증하기 위해 아래 스크립트를 실행해주세요:

#!/bin/bash
# Kotlin 파일 전역에서 popUpTo 사용 위치 확인
rg -n "popUpTo" --type kotlin

# Kotlin 파일 전역에서 inclusive = true 사용 위치 확인
rg -n "inclusive\\s*=\\s*true" --type kotlin
feature/place/src/main/java/com/teamsolply/solply/place/navigation/PlaceNavigation.kt (4)

1-1: 패키지명이 적절하게 변경되었습니다.

기존 home 패키지에서 place 패키지로 올바르게 리네이밍되었습니다.


12-16: 네비게이션 함수가 일관되게 구현되었습니다.

navigatePlace 함수가 표준 네비게이션 패턴을 따르고 있으며, NavOptions 파라미터를 적절히 활용하고 있습니다.


18-26: 네비게이션 그래프 빌더가 올바르게 구현되었습니다.

placeNavGraph 함수와 Place 객체를 사용한 composable 등록이 적절하게 설정되어 있습니다.


28-29: MainTabRoute 구현이 적절합니다.

Place 객체가 MainTabRoute를 구현하여 탭 네비게이션과의 통합이 올바르게 설정되었습니다.

core/datastore/src/main/java/com/teamsolply/solply/datastore/SolplySecureDataStoreSerializer.kt (3)

14-16: 의존성 주입이 적절하게 추가되었습니다.

@Inject 어노테이션을 통한 생성자 주입이 올바르게 구현되어 있습니다.


33-49: 암호화 키 생성 설정이 보안적으로 적절합니다.

AES-256 GCM 모드 사용과 Android Keystore 활용이 보안 베스트 프랙티스를 따르고 있습니다.


51-52: 기본값 설정이 올바르게 업데이트되었습니다.

SolplyTokenData()를 기본값으로 사용하는 것이 적절합니다.

Comment on lines +1 to +4
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

</manifest> No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Manifest에 package 속성 누락 가능성

AGP 8.x 이상에서는 namespace 지정만으로 충분하지만, 일부 툴링이나 라이브러리(예: Firebase Crashlytics)는 <manifest>package 속성을 여전히 참조합니다. 명시를 권장합니다.

-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.teamsolply.solply.onboarding">
📝 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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.teamsolply.solply.onboarding">
</manifest>
🤖 Prompt for AI Agents
In feature/onboarding/src/main/AndroidManifest.xml at lines 1 to 4, the
<manifest> tag is missing the required package attribute. Add the package
attribute with the correct application package name to the <manifest> element to
ensure compatibility with tools like Firebase Crashlytics that still rely on
this attribute.

Comment on lines +13 to +17
fun PlaceRoute(
paddingValues: PaddingValues
) {
PlaceScreen()
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

paddingValues 매개변수가 사용되지 않고 있습니다.

PlaceRoute에서 paddingValues를 받고 있지만 PlaceScreen에 전달하지 않아 실제로 사용되지 않습니다. 패딩이 적용되지 않을 수 있습니다.

다음과 같이 수정을 제안합니다:

 @Composable
 fun PlaceRoute(
     paddingValues: PaddingValues
 ) {
-    PlaceScreen()
+    PlaceScreen(paddingValues = paddingValues)
 }

그리고 PlaceScreen에서도 paddingValues를 받도록 수정:

 @Composable
 fun PlaceScreen(
+    paddingValues: PaddingValues = PaddingValues(),
     modifier: Modifier = Modifier
 ) {
     Column(
-        modifier.fillMaxSize(),
+        modifier.fillMaxSize().padding(paddingValues),
         verticalArrangement = Arrangement.Center,
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
🤖 Prompt for AI Agents
In feature/place/src/main/java/com/teamsolply/solply/place/PlaceScreen.kt around
lines 13 to 17, the paddingValues parameter is received by PlaceRoute but not
passed to PlaceScreen, so it is unused and padding may not be applied. Modify
PlaceRoute to pass paddingValues to PlaceScreen, and update PlaceScreen to
accept paddingValues as a parameter to properly apply the padding.

Comment on lines +13 to +17
fun MypageRoute(
paddingValues: PaddingValues
) {
MypageScreen()
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

paddingValues 매개변수를 활용해주세요.

MypageRoute에서 받은 paddingValuesMypageScreen에 전달하여 시스템 바나 네비게이션 바와의 겹침 문제를 방지해야 합니다.

다음과 같이 수정을 제안합니다:

@Composable
fun MypageRoute(
    paddingValues: PaddingValues
) {
-    MypageScreen()
+    MypageScreen(paddingValues = paddingValues)
}
📝 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
fun MypageRoute(
paddingValues: PaddingValues
) {
MypageScreen()
}
@Composable
fun MypageRoute(
paddingValues: PaddingValues
) {
MypageScreen(paddingValues = paddingValues)
}
🤖 Prompt for AI Agents
In feature/mypage/src/main/java/com/teamsolply/solply/mypage/MypageScreen.kt
around lines 13 to 17, the paddingValues parameter received by MypageRoute is
not being used. To fix this, pass the paddingValues parameter to the
MypageScreen function call to ensure proper layout handling and avoid overlap
with system bars or navigation bars.


class OauthRepositoryImpl @Inject constructor(
private val oauthLocalDataSource: OauthLocalDataSource
) : OauthRepository {
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

OauthRepository 인터페이스 import가 누락되었습니다.

클래스가 OauthRepository를 구현하고 있지만 해당 인터페이스의 import문이 누락되어 있습니다. 컴파일 오류가 발생할 수 있습니다.

다음 import를 추가해주세요:

+import com.teamsolply.solply.oauth.repository.OauthRepository

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt
at line 10, the OauthRepository interface is implemented but its import
statement is missing. Add the appropriate import statement for OauthRepository
at the top of the file to resolve the compilation error.

Comment on lines +8 to +10
class OauthLocalDataSourceImpl @Inject constructor(
private val oauthLocalDataSource: DataStore<SolplyTokenData>
) : OauthLocalDataSource {
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

변수명이 혼란을 야기할 수 있습니다.

클래스가 구현하는 인터페이스명(OauthLocalDataSource)과 동일한 이름으로 DataStore 인스턴스를 명명한 것은 혼란을 야기할 수 있습니다.

더 명확한 변수명으로 변경을 제안합니다:

class OauthLocalDataSourceImpl @Inject constructor(
-    private val oauthLocalDataSource: DataStore<SolplyTokenData>
+    private val tokenDataStore: DataStore<SolplyTokenData>
) : OauthLocalDataSource {
    override suspend fun setAuthLocalData(jwtToken: SolplyTokenData) {
-        oauthLocalDataSource.updateData { jwtToken }
+        tokenDataStore.updateData { jwtToken }
    }
}
📝 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
class OauthLocalDataSourceImpl @Inject constructor(
private val oauthLocalDataSource: DataStore<SolplyTokenData>
) : OauthLocalDataSource {
class OauthLocalDataSourceImpl @Inject constructor(
private val tokenDataStore: DataStore<SolplyTokenData>
) : OauthLocalDataSource {
override suspend fun setAuthLocalData(jwtToken: SolplyTokenData) {
tokenDataStore.updateData { jwtToken }
}
}
🤖 Prompt for AI Agents
In
local/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthLocalDataSourceImpl.kt
around lines 8 to 10, the variable name oauthLocalDataSource for the
DataStore<SolplyTokenData> instance is confusing because it matches the
interface name OauthLocalDataSource. Rename this variable to a clearer name such
as solplyTokenDataStore or tokenDataStore to avoid confusion and improve code
readability.

Comment on lines +13 to 17
fun MapsRoute(
paddingValues: PaddingValues
) {
HomeScreen()
MapsScreen()
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

paddingValues 파라미터를 실제로 활용해야 합니다.

MapsRoute에서 paddingValues 파라미터를 받고 있지만 MapsScreen에 전달하지 않고 있습니다. UI 레이아웃의 일관성을 위해 패딩 값을 적용하는 것이 좋습니다.

다음과 같이 수정하는 것을 권장합니다:

fun MapsRoute(
    paddingValues: PaddingValues
) {
-    MapsScreen()
+    MapsScreen(paddingValues = paddingValues)
}

그리고 MapsScreen에서도 해당 파라미터를 받아 적용하세요:

@Composable
fun MapsScreen(
+    paddingValues: PaddingValues = PaddingValues(),
    modifier: Modifier = Modifier
) {
    Column(
-        modifier.fillMaxSize(),
+        modifier.fillMaxSize().padding(paddingValues),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
📝 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
fun MapsRoute(
paddingValues: PaddingValues
) {
HomeScreen()
MapsScreen()
}
// In MapsRoute.kt
fun MapsRoute(
paddingValues: PaddingValues
) {
MapsScreen(paddingValues = paddingValues)
}
// In MapsScreen.kt
@Composable
fun MapsScreen(
paddingValues: PaddingValues = PaddingValues(),
modifier: Modifier = Modifier
) {
Column(
modifier
.fillMaxSize()
.padding(paddingValues),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
// ... existing content ...
}
}
🤖 Prompt for AI Agents
In feature/maps/src/main/java/com/teamsolply/solply/maps/MapsScreen.kt around
lines 13 to 17, the paddingValues parameter is received by MapsRoute but not
passed to MapsScreen. To fix this, modify MapsRoute to pass paddingValues to
MapsScreen, and update MapsScreen to accept and apply this paddingValues
parameter to ensure consistent UI layout.

Comment on lines +7 to +9
data class OnBoardingState(
val g: String = ""
) : UiState
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

OnBoardingState의 불필요한 필드를 제거하세요.

OnBoardingStateg: String = "" 필드가 의미가 불분명하고 사용되지 않는 것으로 보입니다. 실제로 필요한 상태가 아니라면 제거하거나, 필요하다면 명확한 이름으로 변경해야 합니다.

다음과 같이 수정하는 것을 권장합니다:

data class OnBoardingState(
-    val g: String = ""
+    // 실제 필요한 상태 필드가 없다면 빈 data class로 유지
) : UiState

또는 실제 온보딩 상태를 나타내는 필드가 필요하다면:

data class OnBoardingState(
-    val g: String = ""
+    val isCompleted: Boolean = false,
+    val currentStep: Int = 0
) : UiState

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt
around lines 7 to 9, the OnBoardingState data class contains an unclear and
unused field 'g: String = ""'. Remove this field entirely if it is not needed,
or if a state field is required, replace it with a clearly named and meaningful
property that reflects the actual onboarding state.

Comment on lines +30 to +43
private fun saveJwtToken(accessToken: String, refreshToken: String?) {
viewModelScope.launch {
refreshToken?.let { checkedRefreshToken ->
val token = TokenEntity(
accessToken = accessToken,
refreshToken = checkedRefreshToken
)
oauthRepository.saveJwtToken(token)
.onSuccess {
postSideEffect(OauthSideEffect.NavigateToOnBoarding)
}
}
}
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

토큰 저장 로직에 에러 핸들링을 추가해주세요.

현재 코드는 refreshToken이 null이 아닌 경우만 처리하고 있지만, repository.saveJwtToken()이 실패하는 경우에 대한 처리가 누락되어 있습니다.

다음과 같이 에러 핸들링을 개선하는 것을 권장합니다:

 private fun saveJwtToken(accessToken: String, refreshToken: String?) {
     viewModelScope.launch {
-        refreshToken?.let { checkedRefreshToken ->
+        if (refreshToken.isNullOrEmpty()) {
+            postSideEffect(OauthSideEffect.ShowLoginError("토큰 정보가 유효하지 않습니다."))
+            return@launch
+        }
+        
+        try {
             val token = TokenEntity(
                 accessToken = accessToken,
-                refreshToken = checkedRefreshToken
+                refreshToken = refreshToken
             )
             oauthRepository.saveJwtToken(token)
                 .onSuccess {
                     postSideEffect(OauthSideEffect.NavigateToOnBoarding)
                 }
-        }
+                .onFailure { throwable ->
+                    postSideEffect(OauthSideEffect.ShowLoginError(throwable.message ?: "토큰 저장에 실패했습니다."))
+                }
+        } catch (e: Exception) {
+            postSideEffect(OauthSideEffect.ShowLoginError("예상치 못한 오류가 발생했습니다."))
+        }
     }
 }
🤖 Prompt for AI Agents
In feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt
between lines 30 and 43, the saveJwtToken function lacks error handling for the
repository.saveJwtToken() call. Modify the coroutine to handle failure cases by
adding an onFailure block to the saveJwtToken call, ensuring that any errors
during token saving are caught and handled appropriately, such as logging the
error or posting a side effect to notify the UI.

@leeseokchan00 leeseokchan00 merged commit 653b216 into develop Jun 25, 2025
1 check passed
@coderabbitai coderabbitai bot mentioned this pull request Jul 15, 2025
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.

[Feature] 모듈 세팅

2 participants