Skip to content

Conversation

@uson1004
Copy link
Member

@uson1004 uson1004 commented Oct 28, 2025

๊ฐœ์š”

https://drive.google.com/file/d/1kPvDZ2Ta0tqk69P0ZkUZwY8VD3ph81UC/view?usp=share_link
๋ฉด์ ‘ ํ›„๊ธฐ ์ž‘์„ฑ ํ”Œ๋กœ์šฐ ์˜์ƒ์ž…๋‹ˆ๋‹ค
์šฉ๋Ÿ‰ ์ œํ•œ์œผ๋กœ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ๋กœ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค

    Screenshot_20251028_151253 Screenshot_20251028_151323

์ž‘์—… ๋‚ด์šฉ

  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ
  • ๋ฆฌ๋ทฐ ์กฐํšŒ, ๋ฆฌ๋ทฐ ๊ฒ€์ƒ‰, ๋ฆฌ๋ทฐ ํ•„ํ„ฐ๋ง์„ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค
  • ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐํด๋ž˜์Šค ํ˜•ํƒœ์˜ ์ธ์ž๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค
  • ๋ฐ”ํ…€ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค
  • ReviewState, Proccess ์ด๋„˜ ํด๋ž˜์Šค ์ถ”๊ฐ€

ํ•  ๋ง

compose ui์—์„œ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ๋ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค

Summary by CodeRabbit

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

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

    • ํ›„๊ธฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (์ธํ„ฐ๋ทฐ ์œ ํ˜•, ์œ„์น˜, ๊ธฐ์ˆ , ๋ฉด์ ‘๊ด€ ์ˆ˜ ๊ธฐ๋ก)
    • ํ›„๊ธฐ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ (์ „๊ณต, ์—ฐ๋„, ์ธํ„ฐ๋ทฐ ์œ ํ˜•, ์ง€์—ญ๋ณ„)
    • ํ›„๊ธฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • ํ•˜๋‹จ ๋„ค๋น„๊ฒŒ์ด์…˜์— ํ›„๊ธฐ ๋ฉ”๋‰ด ์ถ”๊ฐ€
  • ๊ฐœ์„ ์‚ฌํ•ญ

    • ํ›„๊ธฐ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ํ™”๋ฉด ๊ฐœ์„ 
    • ์ง€์› ์ƒํƒœ ์—…๋ฐ์ดํŠธ (์ƒˆ ์ƒํƒœ ์ถ”๊ฐ€)
    • API ํ•„ํ„ฐ๋ง ์˜ต์…˜ ํ™•๋Œ€

@uson1004 uson1004 self-assigned this Oct 28, 2025
@uson1004 uson1004 requested a review from a team as a code owner October 28, 2025 07:09
@uson1004 uson1004 added ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. labels Oct 28, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 28, 2025

๐Ÿ“ Walkthrough

๐Ÿฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์š”์•ฝ

์›Œํฌ์Šค๋ฃจ

post-review ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ์ „๋ฐ˜์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ฆฌ๋ทฐ ์ƒ์„ธ ์กฐํšŒ ๋ฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ™”๋ฉด์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ์œผ๋ฉฐ, ์ธํ„ฐ๋ทฐ ํƒ€์ž…๊ณผ ์œ„์น˜ ๋“ฑ ์ƒˆ๋กœ์šด ํ•„ํ„ฐ๋ง ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ๋ฅผ ๊ฐœํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ

๊ณตํ†ต ์š”์†Œ ์š”์•ฝ
์•ฑ ๋ชจ๋“ˆ ๊ธฐ๋ณธ ์„ค์ •
app/build.gradle.kts, app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt
post-review ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์—…๋ฐ์ดํŠธ (companyName, companyId ์ถ”๊ฐ€, reviewId ํƒ€์ž… String โ†’ Long ๋ณ€๊ฒฝ)
๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฆฌํŒฉํ† ๋ง
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt, app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt, app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt
4๊ฐœ์˜ post-review ๋ชฉ์ ์ง€ ์ถ”๊ฐ€, onPostReviewClick ์„œ๋ช… ๋ณ€๊ฒฝ, ๋ฆฌ๋ทฐ ํ•„ํ„ฐ/๊ฒ€์ƒ‰ ์ฝœ๋ฐฑ ์ถ”๊ฐ€
UI ๋ฆฌ์†Œ์Šค
app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt, app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt, app/src/main/res/drawable/ic_review.xml, app/src/main/res/values/strings.xml
Review ๋ฉ”๋‰ด ์•„์ดํ…œ ์ถ”๊ฐ€, ๋ฆฌ๋ทฐ ์•„์ด์ฝ˜ ๋ฐ ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€
๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Enum
core/common/src/main/java/team/retum/common/enums/*.kt
ApplyStatus ์ƒ์ˆ˜ ์ˆ˜์ •, InterviewLocation/InterviewType/ReviewProcess ์ƒˆ๋กœ์šด enum ์ถ”๊ฐ€
๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ๋ฆฌ์†Œ์Šค ํ‚ค
core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt
REVIEW_DATA ์ƒ์ˆ˜ ์ถ”๊ฐ€
๋ฐ์ดํ„ฐ ๊ณ„์ธต
core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt, core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt
fetchReviews ๋ฉ”์„œ๋“œ ํ™•์žฅ (ํŽ˜์ด์ง€๋„ค์ด์…˜, ์œ„์น˜/ํƒ€์ž… ํ•„ํ„ฐ๋ง ์ถ”๊ฐ€), fetchQuestions/fetchReviewsCount/fetchMyReviews ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
๋””์ž์ธ ์‹œ์Šคํ…œ
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt, core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt, core/design-system/src/main/res/drawable/ic_*.xml
์ƒ‰์ƒ ๊ฐ’ ์ˆ˜์ •, Asterisk ์•„์ด์ฝ˜ ์ถ”๊ฐ€, ic_success.xml ์ƒˆ๋กœ ์ถ”๊ฐ€
๋„๋ฉ”์ธ ๊ณ„์ธต - Entity
core/domain/src/main/java/team/retum/usecase/entity/*.kt
FetchReviewDetailEntity/FetchReviewsEntity ํ•„๋“œ ์žฌ์ •์˜, MyReviews/QuestionsEntity/ReviewsCountEntity ์ƒˆ๋กœ ์ถ”๊ฐ€, PostReviewEntity ํ™•์žฅ
๋„๋ฉ”์ธ ๊ณ„์ธต - UseCase
core/domain/src/main/java/team/retum/usecase/usecase/review/*.kt
FetchMyReviewUseCase/FetchQuestionsUseCase/FetchReviewsCountUseCase ์ถ”๊ฐ€, FetchReviewsUseCase ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์žฅ
๋„คํŠธ์›Œํฌ ๊ณ„์ธต
core/network/src/main/java/team/retum/network/api/ReviewApi.kt, core/network/src/main/java/team/retum/network/datasource/review/*.kt, core/network/src/main/java/team/retum/network/di/RequestUrls.kt
fetchReviews ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ, 3๊ฐœ์˜ ์ƒˆ๋กœ์šด API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€, URL ๊ฒฝ๋กœ ์ˆ˜์ •
๋„คํŠธ์›Œํฌ ๊ณ„์ธต - ์‘๋‹ต ๋ชจ๋ธ
core/network/src/main/java/team/retum/network/model/request/PostReviewRequest.kt, core/network/src/main/java/team/retum/network/model/response/*.kt
PostReviewRequest ํ•„๋“œ ํ™•์žฅ, FetchMyReviewResponse/FetchQuestionsResponse/FetchReviewsCountResponse ์ƒˆ๋กœ ์ถ”๊ฐ€, ๊ธฐ์กด ์‘๋‹ต ๋ชจ๋ธ ํ•„๋“œ ์ˆ˜์ •
๊ธฐ๋Šฅ ๋ชจ๋“ˆ - Company
feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt, feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt, feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt
navigateToReviewDetails ์„œ๋ช… ๋ณ€๊ฒฝ (String,String โ†’ Long), fetchReviews ํ˜ธ์ถœ ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์žฅ
๊ธฐ๋Šฅ ๋ชจ๋“ˆ - Home
feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt
SEND/PROCESSING ์ƒํƒœ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ๋งคํ•‘ ์ถ”๊ฐ€
๊ธฐ๋Šฅ ๋ชจ๋“ˆ - MyPage
feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt, feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt
onPostReviewClick ์„œ๋ช… ๋ณ€๊ฒฝ (Long โ†’ String,Long)
๊ธฐ๋Šฅ ๋ชจ๋“ˆ - Post-Review (์‹ ๊ทœ)
feature/post-review/*
์ „์ฒด post-review ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ์‹ ๊ทœ ์ถ”๊ฐ€ (๋นŒ๋“œ ์„ค์ •, ๋ชจ๋ธ, ๋„ค๋น„๊ฒŒ์ด์…˜, UI ํ™”๋ฉด, ViewModel, ๋ฆฌ์†Œ์Šค)
๊ธฐ๋Šฅ ๋ชจ๋“ˆ - Review (๋ฆฌํŒฉํ† ๋ง)
feature/review/build.gradle.kts, feature/review/src/main/java/team/retum/review/navigation/*.kt, feature/review/src/main/java/team/retum/review/ui/*.kt, feature/review/src/main/java/team/retum/review/viewmodel/*.kt
๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ ๊ฐœํŽธ (PostReviewNavigation ์ œ๊ฑฐ, ReviewFilter/SearchReviews/Review ์ถ”๊ฐ€), UI ํ™”๋ฉด ๋ฆฌํŒฉํ† ๋ง (PostReviewScreen/ReviewsScreen ์ œ๊ฑฐ, ReviewFilterScreen/SearchReviewScreen ์ถ”๊ฐ€), ViewModel ๊ต์ฒด (ReviewsViewModel โ†’ ReviewViewModel/SearchReviewsViewModel/ReviewFilterViewModel)
์„ค์ • ํŒŒ์ผ
settings.gradle.kts
:feature:post-review ๋ชจ๋“ˆ ์ถ”๊ฐ€

์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

sequenceDiagram
    actor User
    participant App as App Layer
    participant Nav as Navigation
    participant PostReview as Post-Review Feature
    participant Domain as Domain Layer
    participant Network as Network Layer

    User->>App: ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์‹œ์ž‘
    App->>Nav: navigateToPostReview(companyName, companyId)
    Nav->>PostReview: PostReview ํ™”๋ฉด ํ‘œ์‹œ
    
    User->>PostReview: ์ธํ„ฐ๋ทฐ ํƒ€์ž… ์„ ํƒ
    PostReview->>PostReview: onNextClick()
    
    User->>PostReview: ์œ„์น˜/๊ธฐ์ˆ /๊ฐœ์ˆ˜ ์ž…๋ ฅ
    PostReview->>PostReview: ์„ ํƒ์‚ฌํ•ญ ์ˆ˜์ง‘
    
    User->>PostReview: ์งˆ๋ฌธ/๋‹ต๋ณ€ ์ž…๋ ฅ
    PostReview->>PostReview: ์ตœ์ข… ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
    
    User->>PostReview: ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ
    PostReview->>Domain: PostReviewUseCase ํ˜ธ์ถœ
    Domain->>Network: POST /reviews
    Network-->>Domain: Success/BadRequest
    
    alt ์„ฑ๊ณต
        Domain-->>PostReview: Success
        PostReview->>Nav: navigateToPostReviewComplete()
        Nav->>PostReview: ์™„๋ฃŒ ํ™”๋ฉด ํ‘œ์‹œ (1.5์ดˆ ํ›„)
        PostReview->>Nav: navigateToPostReview()
    else ์‹คํŒจ
        Domain-->>PostReview: BadRequest
        PostReview->>User: ์—๋Ÿฌ ํ† ์ŠคํŠธ ํ‘œ์‹œ
    end
Loading

์˜ˆ์ƒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†Œ์š” ์‹œ๊ฐ„

๐ŸŽฏ 4 (๋ณต์žกํ•จ) | โฑ๏ธ ~60๋ถ„

์ถ”๊ฐ€ ๊ฒ€ํ†  ํ•„์š” ์˜์—ญ:

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ํ๋ฆ„: MainNavigation, RootNavigation, RootScreen์˜ ์ฝœ๋ฐฑ ์ „ํŒŒ ๊ตฌ์กฐ์™€ post-review ๋ชจ๋“ˆ์˜ ์ƒˆ๋กœ์šด 4๋‹จ๊ณ„ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ๋ฆ„ ๊ฒ€์ฆ
  • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ณ€๊ฒฝ: ReviewProcess enum ์ƒ์ˆ˜ ์™„์ „ ๊ต์ฒด๋กœ ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ, FetchReviewDetailEntity ํ•„๋“œ ๋Œ€ํญ ์žฌ์ •์˜์˜ ์˜ํ–ฅ๋„ ๊ฒ€ํ† 
  • API ๋ณ€๊ฒฝ: fetchReviews ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜์—์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ „ํ™˜๋˜๋ฉฐ ๋ชจ๋“  ํ˜ธ์ถœ๋ถ€ ๊ฒ€์ฆ ํ•„์š”
  • Post-Review ๋ชจ๋“ˆ: ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์˜ ์ „์ฒด ๊ตฌ์กฐ, PostReviewViewModel ์ƒํƒœ ๊ด€๋ฆฌ, 4๊ฐœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ชฉ์ ์ง€ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • Review ๋ชจ๋“ˆ ๋ฆฌํŒฉํ† ๋ง: ReviewsScreen/PostReviewScreen ์ œ๊ฑฐ์™€ ์ƒˆ๋กœ์šด ReviewScreen/SearchReviewScreen/ReviewFilterScreen์˜ ๊ธฐ๋Šฅ ๋™๋“ฑ์„ฑ ํ™•์ธ
  • ํƒ€์ž… ๋ณ€๊ฒฝ: reviewId Stringโ†’Long, navigateToReviewDetails ์„œ๋ช… ๋ณ€๊ฒฝ(String,Stringโ†’Long) ๋“ฑ์˜ ๊ด‘๋ฒ”์œ„ํ•œ ํƒ€์ž… ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์ผ๊ด€์„ฑ ๊ฒ€์ฆ

๊ด€๋ จ PR

์ถ”์ฒœ ๋ฆฌ๋ทฐ์–ด

  • parkuiery
  • rladmsdh
  • Tmdhoon2

์‹œ

๐Ÿ‡ ํ›„๊ธฐ ๊ธฐ๋Šฅ์ด ํ”ผ์–ด๋‚ฌ๋„ค์š”,

๋„ค ๋‹จ๊ณ„๋กœ ๋‚˜๋‰œ ํ™”๋ฉด๋“ค์ด ์ถค์„ ์ถ˜๋‹ค๋„ค์š” โœจ

์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๊ณ , ๊ธฐ์ˆ  ๊ณ ๋ฅด๊ณ ,

์œ„์น˜์™€ ๊ฐœ์ˆ˜๊นŒ์ง€ ๋‹ด์•„๋‚ด๋‹ˆ

๋ฉด์ ‘ ํ›„๊ธฐ๊ฐ€ ๋”์šฑ ์ž์„ธํ•ด์กŒ์–ด์š”! ๐ŸŽ‰

Pre-merge checks and finishing touches

โŒ Failed checks (2 warnings)
Check name Status Explanation Resolution
Docstring Coverage โš ๏ธ Warning Docstring coverage is 0.57% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check โš ๏ธ Warning PR ์„ค๋ช…์ด ํ•„์ˆ˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉฐ, ์š”๊ตฌ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค. PR ์„ค๋ช…์„ ํ…œํ”Œ๋ฆฟ ํ˜•์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•˜์„ธ์š”: '๊ฐœ์š”' ์„น์…˜์— ๋ณ€๊ฒฝ์‚ฌํ•ญ ์š”์•ฝ ์ถ”๊ฐ€, '์ž‘์—… ๋‚ด์šฉ' ์„น์…˜์„ ๊ตฌ์กฐํ™”ํ•˜๊ณ , ํ•„์š”์‹œ 'ํ•  ๋ง' ์„น์…˜์„ ๋ณด๊ฐ•ํ•˜์„ธ์š”.
โœ… Passed checks (1 passed)
Check name Status Explanation
Title Check โœ… Passed PR ์ œ๋ชฉ "๐Ÿ”— :: (#468) ๋ฉด์ ‘ํ›„๊ธฐ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง"์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์ฃผ์š” ๋ชฉ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. raw_summary ๋ถ„์„ ๊ฒฐ๊ณผ, ์ด PR์€ ์ƒˆ๋กœ์šด feature/post-review ๋ชจ๋“ˆ ์ƒ์„ฑ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ/์กฐํšŒ/๊ฒ€์ƒ‰/ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„, ๊ธฐ์กด ๋ฆฌ๋ทฐ ํ™”๋ฉด ์žฌ๊ตฌ์กฐํ™” ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ œ๋ชฉ์˜ "๋ฉด์ ‘ํ›„๊ธฐ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง"์ด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์ ˆํžˆ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ œ๋ชฉ์€ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ตฌ์ฒด์ ์ด๋ฉฐ, ํŒ€์›์ด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์Šค์บ”ํ•  ๋•Œ PR์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โœจ Finishing touches
  • ๐Ÿ“ Generate docstrings
๐Ÿงช Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/468-๋ฉด์ ‘ํ›„๊ธฐ-๊ธฐ๋Šฅ-๋ฆฌํŒฉํ† ๋ง

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

โค๏ธ Share

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 28, 2025

Note

Docstrings generation - SKIPPED
Skipped regeneration as there are no new commits. Docstrings already generated for this pull request at #474.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 28, 2025

Note

Unit test generation is an Early Access feature. Expect some limitations and changes as we gather feedback and continue to improve it.


Generating unit tests... This may take up to 20 minutes.

Copy link
Contributor

@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: 29

Caution

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

โš ๏ธ Outside diff range comments (2)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)

22-24: reviewId ํƒ€์ž… ๋ถˆ์ผ์น˜(Long vs String) ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•จ

๋‚ด๋น„๊ฒŒ์ด์…˜/UI ๊ณ„์ธต์—์„œ๋Š” Long ์‚ฌ์šฉ(ReviewItems, ReviewDetailsNavigation), ViewModel๊ณผ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ๋Š” String ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ReviewDetailsScreen 62์ค„์—์„œ .toString() ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ํ˜•๋ณ€ํ™˜ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ์ „์—ญ์œผ๋กœ Long์œผ๋กœ ํ†ต์ผํ•˜๊ฑฐ๋‚˜, ๊ฒฝ๊ณ„ ๋ณ€ํ™˜ ๋กœ์ง์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 39-61, feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt:62

app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (1)

37-41: navArgument ์„ค์ • ์˜คํƒ€๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ ์†Œ์ง€(ํ•„์ˆ˜ ์ˆ˜์ •)

navArgument(APPLICATION_ID) { NavType.StringType }๋Š” type = ...์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์ œ๋กœ Long์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ LongType์œผ๋กœ ์ผ์น˜์‹œํ‚ค๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

-        arguments = listOf(navArgument(APPLICATION_ID) { NavType.StringType }),
+        arguments = listOf(navArgument(APPLICATION_ID) { type = NavType.LongType }),
@@
-            applicationId = it.arguments?.getString(APPLICATION_ID)?.toLong(),
+            applicationId = it.arguments?.getLong(APPLICATION_ID),
๐Ÿงน Nitpick comments (55)
core/network/src/main/java/team/retum/network/api/InterestsApi.kt (1)

1-3: ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์šฉ๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์„ธ์š”.

์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ˜„์žฌ ๋น„์–ด์žˆ์–ด ์‹ค์ œ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. PR์˜ ๋ชฉ์ ์ด ๋ฉด์ ‘ ํ›„๊ธฐ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง์ธ๋ฐ, InterestsApi๋ผ๋Š” ๋„ค์ด๋ฐ๊ณผ์˜ ์—ฐ๊ด€์„ฑ๋„ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”:

  • ์ด๊ฒƒ์ด ์˜๋„์ ์ธ ํ”Œ๋ ˆ์ด์Šคํ™€๋” ์ฝ”๋“œ์ธ์ง€ ํ™•์ธ
  • ์ถ”ํ›„ ๊ตฌํ˜„ ์˜ˆ์ •์ด๋ผ๋ฉด TODO ์ฃผ์„์ด๋‚˜ ๋ฌธ์„œํ™” ์ถ”๊ฐ€
  • ์ด API๊ฐ€ PR์˜ ๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜๋Š”์ง€ ์„ค๋ช…

ํ–ฅํ›„ ๊ตฌํ˜„ํ•  API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด ๋ง์”€ํ•ด์ฃผ์„ธ์š”.

core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (1)

18-18: ๋ฆฌ์ŠคํŠธ ํ”„๋กœํผํ‹ฐ ๋„ค์ด๋ฐ ๊ฐ€๋…์„ฑ ๊ฐœ์„  ์ œ์•ˆ

List ํƒ€์ž…์ด๋ฏ€๋กœ qnaResponse โ†’ qnaResponses(๋˜๋Š” qnas)๋กœ์˜ ๋ณต์ˆ˜ํ˜• ๋„ค์ด๋ฐ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํŒŒ๊ธ‰์ด ํฌ๋ฉด ๋ณด๋ฅ˜ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์„ ํ˜ธ ์‹œ ์ตœ์†Œ ๋ณ€๊ฒฝ diff:

-    @Json(name = "qn_as") val qnaResponse: List<QnAs>,
+    @Json(name = "qn_as") val qnaResponses: List<QnAs>,
feature/post-review/.gitignore (1)

1-1: ๋ชจ๋“ˆ .gitignore์˜ /build ๊ทœ์น™์€ ๋ฃจํŠธ์—์„œ ์ด๋ฏธ ๋ฌด์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๊ฒ€์ฆ ๊ฒฐ๊ณผ, ๋ฃจํŠธ .gitignore(3์ค„)์˜ build/ ๊ทœ์น™์ด ๋ชจ๋“  ์ˆ˜์ค€์˜ build ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด๋ฏธ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“ˆ ๋‹จ์œ„ /build ๊ทœ์น™ 21๊ฐœ ๋ชจ๋‘ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์˜ /build ์ถ”๊ฐ€๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“ˆ๋ณ„ ๋ช…์‹œ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์œ ์ง€ํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1)

6-14: reviewId ํƒ€์ž… ํ•ฉ์น˜๊ธฐ (Long vs String) ๊ถŒ์žฅ

๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์€ Long(reviewId)์ธ๋ฐ, feature/review์˜ ViewModel ์ƒํƒœ๋Š” String(reviewId)์ž…๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜์„ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜, ์ „์—ญ์ ์œผ๋กœ Long์œผ๋กœ ํ†ต์ผํ•˜๋Š” ์ชฝ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ํ˜ผ์žฌ๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜/UseCase ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๋Ÿฐํƒ€์ž„ ์ด์Šˆ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Moshi codegen์ด core:network ๋ชจ๋“ˆ์—์„œ KSP/kapt๋กœ ํ™œ์„ฑํ™”๋ผ ์žˆ๋Š”์ง€ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค(๋ฆฌํ”Œ๋ ‰์…˜ ํšŒํ”ผ ์„ฑ๋Šฅ ์ด์ ).

์˜ต์…˜: ๋„คํŠธ์›Œํฌ ์ผ์‹œ ํ•„๋“œ ๋ˆ„๋ฝ์— ๊ฒฌ๊ณ ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

core/design-system/src/main/res/drawable/ic_success.xml (1)

6-8: ์•„์ด์ฝ˜ ์ƒ‰์ƒ ํ•˜๋“œ์ฝ”๋”ฉ ์ง€์–‘ (ํ‹ดํŠธ ๊ธฐ๋ฐ˜ ์ œ์–ด ๊ถŒ์žฅ)

๋””์ž์ธ์‹œ์Šคํ…œ์—์„œ ์ผ๊ด€๋œ ํ…Œ๋งˆ ํ‹ดํŠธ๋ฅผ ์“ฐ๋ ค๋ฉด path์˜ fillColor๋ฅผ ๋ฌด์ฑ„์ƒ‰(์˜ˆ: #000000)์œผ๋กœ ๋‘๊ณ  ์‚ฌ์šฉ์ฒ˜(Icon/Image)์—์„œ tint๋ฅผ ์ ์šฉํ•˜๋Š” ํŽธ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ๋ณ€๊ฒฝ:

-      android:fillColor="#2F53FF"/>
+      android:fillColor="#000000"/>
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)

48-51: ์•„์ด์ฝ˜ ์ ‘๊ทผ์„ฑ: contentDescription ์ฒ˜๋ฆฌ

ํ•ด๋‹น ํ™”์‚ดํ‘œ๊ฐ€ ์žฅ์‹ ๋ชฉ์ ์ด๋ฉด contentDescription = null ๊ถŒ์žฅ. ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด stringResource๋กœ ์ง€์—ญํ™”๋œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜ˆ์‹œ:

-                contentDescription = "long arrow",
+                contentDescription = null,
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)

26-32: ์‹คํŒจ/๋กœ๋”ฉ ์ƒํƒœ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ๊ถŒ์žฅ

onFailure ์ฒ˜๋ฆฌ์™€ ๋กœ๋”ฉ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ƒํƒœ์— ํฌํ•จํ•ด UI๊ฐ€ ์ ์ ˆํžˆ ๋Œ€์‘ํ•˜๋„๋ก ํ•ด์ฃผ์„ธ์š”(์Šค๋‚ต๋ฐ”, ์—๋Ÿฌ ๋ทฐ ๋“ฑ).

๊ฐ„๋‹จ ์˜ˆ์‹œ:

     internal fun fetchReviewDetails() {
         viewModelScope.launch(Dispatchers.IO) {
-            fetchReviewDetailsUseCase(state.value.reviewId).onSuccess {
-                setState { state.value.copy(reviewDetail = it) }
-            }
+            fetchReviewDetailsUseCase(state.value.reviewId)
+                .onSuccess { setState { state.value.copy(reviewDetail = it /*, isLoading = false*/) } }
+                .onFailure { /* setState { state.value.copy(error = it, isLoading = false) } */ }
         }
     }
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (2)

45-49: ์ค‘์ฒฉ ์ปดํฌ์ €๋ธ”์— ์™ธ๋ถ€ modifier ์žฌ์‚ฌ์šฉ ์ง€์–‘

๋‚ด๋ถ€ Row์—์„œ๋Š” Modifier๋ฅผ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ œ์•ฝ/weight ์ „ํŒŒ ๋ฐฉ์ง€).

-        Row(
-            modifier = modifier
+        Row(
+            modifier = Modifier
             .weight(1f)
             .clickable(onClick = { onReviewDetailClick(reviewId) }),

51-77: a11y ๋ฐ ํ† ํฐ ์‚ฌ์šฉ ๊ฐœ์„ : contentDescription/์ƒ‰์ƒ

  • AsyncImage์˜ contentDescription์€ stringResource๋กœ ์ง€์—ญํ™”ํ•˜๊ฑฐ๋‚˜ ์žฅ์‹์ด๋ฉด null ์ฒ˜๋ฆฌ ๊ถŒ์žฅ.
  • ๋ณด์กฐ ํ…์ŠคํŠธ ์ƒ‰์€ onPrimary๋ณด๋‹ค onSurfaceVariant๊ฐ€ ํ† ํฐ ์˜๋ฏธ์— ๋งž์Šต๋‹ˆ๋‹ค.
-                contentDescription = "company profile",
+                contentDescription = null, // ๋˜๋Š” stringResource(R.string.cd_company_profile)

...
-                    color = JobisTheme.colors.onPrimary,
+                    color = JobisTheme.colors.onSurfaceVariant,
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (3)

33-42: ๊ฒ€์ƒ‰ ๋””๋ฐ”์šด์Šค ํŒŒ์ดํ”„๋ผ์ธ: flatMapLatest๋กœ ์ด์ „ ์š”์ฒญ ์ทจ์†Œ

ํ˜„์žฌ๋Š” ๋งค ํ‚ค์›Œ๋“œ๋งˆ๋‹ค ๋ณ„๋„ ์ฝ”๋ฃจํ‹ด์„ ๋„์›Œ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ์ด์ „ ์š”์ฒญ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์ค‘์— ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. flatMapLatest ๊ธฐ๋ฐ˜์œผ๋กœ ์ทจ์†Œ ๊ฐ€๋Šฅ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ ํŠธ๋ฆฌ๋ฐ๋„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.

-    @OptIn(FlowPreview::class)
-    private fun debounceName() {
-        viewModelScope.launch {
-            state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect {
-                if (!it.isNullOrBlank()) {
-                    fetchReviews()
-                }
-            }
-        }
-    }
+    @OptIn(FlowPreview::class, kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+    private fun debounceName() {
+        viewModelScope.launch {
+            state
+                .map { it.keyword?.trim() }
+                .distinctUntilChanged()
+                .debounce(SEARCH_DEBOUNCE_MILLIS)
+                .flatMapLatest { kw ->
+                    kotlinx.coroutines.flow.flow {
+                        if (kw.isNullOrBlank()) {
+                            // ๋นˆ ํ‚ค์›Œ๋“œ: ๊ฒฐ๊ณผ ์ดˆ๊ธฐํ™”
+                            setState { state.value.copy(reviews = emptyList(), showRecruitmentsEmptyContent = false) }
+                            return@flow
+                        }
+                        val result = fetchReviewsUseCase(
+                            companyId = null, page = null, location = null,
+                            interviewType = null, keyword = kw, year = null, code = null
+                        )
+                        emit(result)
+                    }
+                }
+                .collect { res ->
+                    res.onSuccess {
+                        setState {
+                            state.value.copy(
+                                showRecruitmentsEmptyContent = it.reviews.isEmpty(),
+                                reviews = it.reviews,
+                            )
+                        }
+                    }
+                    // TODO: onFailure ์ฒ˜๋ฆฌ๋„ ์ถ”๊ฐ€ ๊ถŒ์žฅ
+                }
+        }
+    }

56-61: ๋นˆ ํ‚ค์›Œ๋“œ ์ดˆ๊ธฐํ™” ๋ฐ ์‹คํŒจ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ๊ถŒ์žฅ

ํ‚ค์›Œ๋“œ๊ฐ€ ๋น„์›Œ์กŒ์„ ๋•Œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”, ์‹คํŒจ ์‹œ ์—๋Ÿฌ ์ƒํƒœ ๋ฐ˜์˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„ flatMapLatest ์˜ˆ์‹œ์— ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.


70-73: ๋„ค์ด๋ฐ ์ •ํ•ฉ์„ฑ: showRecruitmentsEmptyContent โ†’ showReviewsEmptyContent

๋ฆฌ๋ทฐ ๊ฒ€์ƒ‰ ํ™”๋ฉด์ด๋ผ๋ฉด ํ”„๋กœํผํ‹ฐ๋ช…์„ ๋ฆฌ๋ทฐ ๋งฅ๋ฝ์œผ๋กœ ๋งž์ถ”๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ์— ์ข‹์Šต๋‹ˆ๋‹ค. ์ „ํŒŒ ์˜ํ–ฅ์ด ํฌ๋‹ˆ ํ›„์† PR์—์„œ ์ ์ง„ ์ ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (3)

172-189: ํ•ญ๋ชฉ ๋ Œ๋”๋ง์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

forEachIndexed๋ฅผ ์‚ฌ์šฉํ•œ ํ•ญ๋ชฉ ๋ Œ๋”๋ง์ด ์ž‘๋™ํ•˜์ง€๋งŒ, Compose์—์„œ๋Š” Row์™€ items.joinToString()์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ items.flatMapIndexed๋กœ ๊ตฌ๋ถ„์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ์„ ์–ธ์ ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Row(
    modifier = Modifier
        .fillMaxWidth()
        .padding(top = 10.dp),
    horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
    items.forEachIndexed { index, item ->
        JobisText(
            text = item,
            style = JobisTypography.SubBody,
            color = JobisTheme.colors.inverseOnSurface,
        )
        if (index < items.size - 1) {
            JobisText(
                text = "โ€ข",
                style = JobisTypography.SubBody,
                color = JobisTheme.colors.inverseOnSurface,
            )
        }
    }
}

ํ˜„์žฌ ์ฝ”๋“œ๋„ ์ •์ƒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.


266-349: ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง์— ์•ˆ์ •์ ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

forEachIndexed๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ ํ•ญ๋ชฉ์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์ƒํƒœ ๋ณด์กด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด LazyColumn๊ณผ items() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๊ฐ ํ•ญ๋ชฉ์— key ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

FetchReviewDetailEntity.QnAs์— ๊ณ ์œ  ID๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// LazyColumn ์‚ฌ์šฉ ์˜ˆ์‹œ
LazyColumn {
    items(
        items = review,
        key = { it.id } // ๊ณ ์œ  ID๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
    ) { reviewItem ->
        // ์นด๋“œ ๋ Œ๋”๋ง ๋กœ์ง
    }
}

60-64: ViewModel์—์„œ ID๋ฅผ Long ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ฆฌํŒฉํ„ฐ๋งํ•˜์„ธ์š”.

๊ฒ€์ฆ ๊ฒฐ๊ณผ, ReviewDetailsViewModel.setReviewId()๋Š” String์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, ReviewDetails ํ•จ์ˆ˜์˜ reviewId ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Long์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด 62๋ฒˆ์งธ ์ค„์—์„œ ๋ถˆํ•„์š”ํ•œ toString() ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ID๋Š” ๋ณธ์งˆ์ ์œผ๋กœ Long ํƒ€์ž…์ด๋ฏ€๋กœ, ViewModel์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋„ String ๋Œ€์‹  Long์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๊ฐœ์„ ๋˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฌธ์ž์—ด ๋ณ€ํ™˜์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • ReviewDetailsViewModel.setReviewId() ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ String์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ
  • ์ƒํƒœ์˜ reviewId ํ•„๋“œ๋„ Long ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ
  • ReviewDetailsScreen.kt 62๋ฒˆ์งธ ์ค„์—์„œ reviewId.toString() ์ œ๊ฑฐ
feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (1)

204-204: TODO ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€์› ํ›„ ํ™ˆ ํ™”๋ฉด ์ง„์ž… ์‹œ UI ์ฆ‰์‹œ ๋ฐ˜์˜๊ณผ ๊ด€๋ จ๋œ TODO ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

์ด TODO ํ•ญ๋ชฉ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ด์Šˆ ์ƒ์„ฑ์ด๋‚˜ ๊ตฌํ˜„์„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์‹ ๊ฐ€์š”?

core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (2)

16-16: TODO ์ฃผ์„ ์ฒ˜๋ฆฌ ํ•„์š”

์ด๋ฆ„ ํ†ต์ผ์— ๋Œ€ํ•œ TODO๊ฐ€ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ด๋ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ด์Šˆ๋กœ ์ถ”์ ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”.

์ด์Šˆ ์ƒ์„ฑ์„ ์›ํ•˜์‹œ๋ฉด ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


6-14: @Immutable ์–ด๋…ธํ…Œ์ด์…˜ ์ผ๊ด€์„ฑ ๊ฐœ์„  ๊ถŒ์žฅ

์ค‘์ฒฉ๋œ QuestionEntity์—๋งŒ @Immutable ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค QuestionsEntity๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋™์ผํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ๊ฐœ์„ ํ•˜์„ธ์š”:

+@Immutable
 data class QuestionsEntity(
     val questions: List<QuestionEntity>,
 ) {
core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1)

12-14: ๋‹ค์ˆ˜์˜ nullable ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋กœ ๋ฆฌํŒฉํ† ๋ง ๊ถŒ์žฅ

7๊ฐœ์˜ nullable ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๊ณ  ํ˜ธ์ถœ ์‹œ ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฌถ๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค(์˜ˆ: ReviewFilters)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋ง์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

data class ReviewFilters(
    val page: Int? = null,
    val location: InterviewLocation? = null,
    val interviewType: InterviewType? = null,
    val keyword: String? = null,
    val year: Int? = null,
    val companyId: Long? = null,
    val code: Long? = null,
)

class FetchReviewsUseCase @Inject constructor(
    private val reviewRepository: ReviewRepository,
) {
    suspend operator fun invoke(filters: ReviewFilters = ReviewFilters()) = runCatching {
        reviewRepository.fetchReviews(
            filters.page,
            filters.location,
            filters.interviewType,
            filters.keyword,
            filters.year,
            filters.companyId,
            filters.code
        ).toEntity()
    }
}
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (2)

77-89: ๋ฆฌ์ŠคํŠธ ํ‚ค ์ง€์ • ๋ฐ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ items ์‚ฌ์šฉ ๊ถŒ์žฅ

์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ items(size)๋Š” ํ•ญ๋ชฉ ๋ณ€๊ฒฝ ์‹œ ์ƒํƒœ ์žฌ์‚ฌ์šฉ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. reviewId๋กœ key๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ DSL์„ ์“ฐ์„ธ์š”.

-        LazyColumn {
-            items(state.reviews.size) {
-                val review = state.reviews[it]
-                ReviewItems(
-                    companyImageUrl = review.companyLogoUrl,
-                    companyName = review.companyName,
-                    reviewId = review.reviewId,
-                    writer = review.writer,
-                    major = review.major,
-                    onReviewDetailClick = onReviewDetailClick,
-                )
-            }
-        }
+        LazyColumn {
+            items(
+                items = state.reviews,
+                key = { it.reviewId },
+            ) { review ->
+                ReviewItems(
+                    companyImageUrl = review.companyLogoUrl,
+                    companyName = review.companyName,
+                    reviewId = review.reviewId,
+                    writer = review.writer,
+                    major = review.major,
+                    onReviewDetailClick = onReviewDetailClick,
+                )
+            }
+        }

ํ•„์š” ์‹œ import ์ถ”๊ฐ€:

import androidx.compose.foundation.lazy.items

65-75: a11y/i18n: contentDescription ๋ฆฌ์†Œ์Šคํ™” ๊ถŒ์žฅ

"filter", "search" ํ•˜๋“œ์ฝ”๋”ฉ ๋Œ€์‹  string ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผ์„ฑ๊ณผ ํ˜„์ง€ํ™”๋ฅผ ๋ณด์™„ํ•˜์„ธ์š”.

-            JobisIconButton(
-                drawableResId = JobisIcon.Filter,
-                contentDescription = "filter",
+            JobisIconButton(
+                drawableResId = JobisIcon.Filter,
+                contentDescription = stringResource(R.string.cd_filter),
                 onClick = onReviewFilterClick,
                 tint = JobisTheme.colors.onPrimary,
             )
-            JobisIconButton(
-                drawableResId = JobisIcon.Search,
-                contentDescription = "search",
+            JobisIconButton(
+                drawableResId = JobisIcon.Search,
+                contentDescription = stringResource(R.string.cd_search),
                 onClick = onSearchReviewClick,
             )

(๋ฆฌ์†Œ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ ํ•„์š”)

feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (2)

52-65: ๋ฆฌ์ŠคํŠธ๋Š” items(list, key) ์‚ฌ์šฉ์œผ๋กœ ์•ˆ์ • ํ‚ค ์ œ๊ณต ๋ฐ ๊ฐ„๊ฒฐํ™” ๊ถŒ์žฅ

ํ˜„์žฌ index ๊ธฐ๋ฐ˜ items(size) ์‚ฌ์šฉ์€ ์Šคํฌ๋กค/์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ ์žฌ์กฐํ•ฉ ๋น„์šฉ์ด ์ปค์ง‘๋‹ˆ๋‹ค. reviewId๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ ์šฉ ์˜ˆ์‹œ:

@@
-        if (!state.showRecruitmentsEmptyContent) {
-            LazyColumn {
-                items(state.reviews.size) {
-                    val review = state.reviews[it]
-                    ReviewItems(
-                        companyImageUrl = review.companyLogoUrl,
-                        companyName = review.companyName,
-                        reviewId = review.reviewId,
-                        writer = review.writer,
-                        major = review.major,
-                        onReviewDetailClick = onReviewDetailClick,
-                    )
-                }
-            }
+        if (!state.showRecruitmentsEmptyContent) {
+            LazyColumn {
+                items(
+                    items = state.reviews,
+                    key = { it.reviewId },
+                ) { review ->
+                    ReviewItems(
+                        companyImageUrl = review.companyLogoUrl,
+                        companyName = review.companyName,
+                        reviewId = review.reviewId,
+                        writer = review.writer,
+                        major = review.major,
+                        onReviewDetailClick = onReviewDetailClick,
+                    )
+                }
+            }

์ถ”๊ฐ€: ์•„๋ž˜ import ํ•„์š”

import androidx.compose.foundation.lazy.items

52-52: ํ”„๋กœํผํ‹ฐ ๋„ค์ด๋ฐ ๋ถˆ์ผ์น˜

showRecruitmentsEmptyContent๋Š” ๋ฆฌ๋ทฐ ํ™”๋ฉด ๋งฅ๋ฝ๊ณผ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. showReviewsEmptyContent ๋“ฑ ์˜๋ฏธ ๋งž๋Š” ์ด๋ฆ„์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt (1)

10-18: @immutable๋ฅผ ์ƒ์œ„ ์—”ํ‹ฐํ‹ฐ์—๋„ ๋ถ€์—ฌ ๊ณ ๋ ค

UI์—์„œ ์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง์ ‘ ์†Œ๋น„ํ•œ๋‹ค๋ฉด, FetchReviewsEntity์—๋„ @Immutable์„ ๋ถ€์—ฌํ•˜๋ฉด Compose ์ตœ์ ํ™”์— ๋„์›€๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚ด๋ถ€ Review์—๋งŒ ์ง€์ •๋˜์–ด ์žˆ์–ด ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (2)

22-27: Companion object์— ์„ ํƒ๊ฐ’ ์ €์žฅ์€ ์ „์—ญ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ

์ „์—ญ var(code/year/interviewType/location)๋Š” ํ”„๋กœ์„ธ์Šค ์ƒ๋ช…์ฃผ๊ธฐ/๋ณต์› ์‹œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํƒœ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. SavedStateHandle, ๊ณต์œ  ViewModel, ๋˜๋Š” ๋‹จ์ผ AppliedFilters ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


33-47: ์—๋Ÿฌ ํ•ธ๋“ค๋ง/๋นˆ ์ƒํƒœ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ๊ถŒ์žฅ

fetchCodeUseCase ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ/๋ฆฌํŠธ๋ผ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. .onFailure ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ ๋ฐ˜์˜์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.

core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1)

3-13: Immutable ์–ด๋…ธํ…Œ์ด์…˜ ์ผ๊ด€์„ฑ

์ด ํŒŒ์ผ์€ javax.annotation.concurrent.Immutable, ๋‹ค๋ฅธ ํŒŒ์ผ์€ androidx.compose.runtime.Immutable๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์ „๋ฐ˜ ์ผ๊ด€๋œ ์–ด๋…ธํ…Œ์ด์…˜(๊ฐ€๋Šฅํ•˜๋ฉด Compose์˜ @Immutable) ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (3)

81-83: ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ž์—ด -> stringResource๋กœ i18n ์ •๋ฆฌ

์—ฌ๋Ÿฌ UI ํ…์ŠคํŠธ๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด/์ ‘๊ทผ์„ฑ/์ผ๊ด€์„ฑ ์œ„ํ•ด stringResource๋กœ ์ด์ „ํ•˜์„ธ์š”.

์˜ˆ์‹œ(ํŒจํ„ด ๋™์ผ ์ ์šฉ):

- title = "ํ•„ํ„ฐ ์„ค์ •",
+ title = stringResource(R.string.review_filter_title),
@@
- text = "์ „๊ณต",
+ text = stringResource(R.string.major),
@@
- title = "๊ฐœ์ธ ๋ฉด์ ‘",
+ title = stringResource(R.string.interview_type_individual),

ํ•„์š”ํ•œ ํ‚ค๋ฅผ strings.xml์— ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

Also applies to: 133-136, 167-170, 198-201, 230-233, 203-216, 235-253


106-118: ํ•˜๋‹จ ๊ณ ์ • ๋ฒ„ํŠผ ์‹œ์Šคํ…œ ์ธ์…‹/์˜ค๋ฒ„๋žฉ ์ฒ˜๋ฆฌ

์Šคํฌ๋กค ์ฝ˜ํ…์ธ ์™€ ๋ฒ„ํŠผ์ด ๊ฒน์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. navigationBarsPadding()๊ณผ ์—ฌ๋ฐฑ์„ ์ฃผ๊ณ , ์Šคํฌ๋กค ์˜์—ญ ํ•˜๋‹จ์— Spacer๋ฅผ ๋„ฃ์–ด ๊ฐ€๋ ค์ง์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

-        JobisButton(
+        JobisButton(
             text = stringResource(id = R.string.appliance),
             onClick = {
@@
-            modifier = Modifier.align(Alignment.BottomCenter),
+            modifier = Modifier
+                .align(Alignment.BottomCenter)
+                .navigationBarsPadding()
+                .padding(bottom = 16.dp),
             color = ButtonColor.Primary,
         )

์Šคํฌ๋กค ์˜์—ญ ๋์— ์—ฌ์œ  ๊ณต๊ฐ„๋„ ์ถ”๊ฐ€:

// ReviewFilterScreen ๋‚ด๋ถ€ Column ๋งจ ์•„๋ž˜
Spacer(modifier = Modifier.height(96.dp))

109-113: UI์—์„œ ViewModel.Companion์— ์ง์ ‘ ์“ฐ๊ธฐ ์ง€์–‘

UI๊ฐ€ ReviewFilterViewModel.Companion.*์— ์ง์ ‘ ์ ‘๊ทผํ•ด ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉ ๋กœ์ง์€ ViewModel ๋ฉ”์„œ๋“œ(์˜ˆ: applyAndClose(onBackPressed))๋กœ ์บก์Аํ™”ํ•˜์„ธ์š”. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ๊ณผ ์ถ”์ ์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

๊ฐ„๋‹จ ์˜ˆ์‹œ:

// ViewModel
fun apply(onApplied: () -> Unit) = setState {
    // ํ•„์š” ์‹œ ์˜์†ํ™”/์ €์žฅ ํ›„
    state.value // no-op; ํ˜น์€ ์ €์žฅ ๋กœ์ง
}.also { onApplied() }

// UI
onClick = { reviewFilterViewModel.apply(onBackPressed) }
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)

67-73: ์ดˆ๊ธฐ answers ๊ธธ์ด ํ•˜๋“œ์ฝ”๋”ฉ(3) ์ œ๊ฑฐ ๊ถŒ์žฅ

์งˆ๋ฌธ ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ 3๊ฐœ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์–ด ์ดํ›„ ๋‹จ๊ณ„์—์„œ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘๊ณ , fetch ์„ฑ๊ณต ์‹œ ์งˆ๋ฌธ ์ˆ˜์— ๋งž์ถฐ ๋™๊ธฐํ™”ํ•˜์„ธ์š”.

         fun getInitialState() = PostNextReviewState(
             questions = emptyList(),
             buttonEnabled = false,
             answer = "",
-            answers = listOf("", "", ""),
+            answers = emptyList(),
             qnaElements = emptyList(),
         )

59-65: PostNextReviewState์—์„œ unused ํ•„๋“œ answer ์ œ๊ฑฐ ํ•„์š”

๊ฒ€์ฆ ๊ฒฐ๊ณผ, PostNextReviewState.answer ํ•„๋“œ๋Š” PostNextReviewViewModel์˜ ์–ด๋А ๋ฉ”์„œ๋“œ์—์„œ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋งŒ ๋˜๊ณ (line 70) ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ๊ฑฐํ•˜์„ธ์š”.

๊ด€๋ จ ์ฝ”๋“œ:

  • fetchQuestions(), setQuestion(), onNextClick() ๋ชจ๋‘ answer ํ•„๋“œ ๋ฏธ์‚ฌ์šฉ
  • ๋Œ€์‹  answers: List<String> ํ•„๋“œ๊ฐ€ ์‹ค์ œ ๋‹ต๋ณ€ ๊ด€๋ฆฌ์— ์‚ฌ์šฉ๋จ
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)

26-28: ์ค‘๋ณต ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐฉ์ง€ ์˜ต์…˜ ์ถ”๊ฐ€

ํƒญ ์žฌ์„ ํƒ ๋“ฑ์—์„œ ๋™์ผ ๋ชฉ์ ์ง€ ์ค‘๋ณต ์Œ“์ž„์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด launchSingleTop(๋ฐ ํ•„์š” ์‹œ restoreState)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

-fun NavController.navigateToReview() {
-    navigate(NAVIGATION_REVIEW)
-}
+fun NavController.navigateToReview() {
+    navigate(NAVIGATION_REVIEW) {
+        launchSingleTop = true
+        restoreState = true
+    }
+}
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)

62-66: contentDescription ํ•˜๋“œ์ฝ”๋”ฉ

i18n/์ ‘๊ทผ์„ฑ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด stringResource๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์„ธ์š”.

-            Image(
-                painter = painterResource(team.retum.design_system.R.drawable.ic_success),
-                contentDescription = "review_make_success",
-            )
+            Image(
+                painter = painterResource(team.retum.design_system.R.drawable.ic_success),
+                contentDescription = stringResource(R.string.content_description_review_make_success),
+            )
core/network/src/main/java/team/retum/network/api/ReviewApi.kt (1)

36-38: ID ํƒ€์ž… ์ผ๊ด€์„ฑ

reviewId: String์€ ๋‹ค๋ฅธ API์—์„œ Long์„ ์ฃผ๋กœ ์“ฐ๋Š” ํŒจํ„ด๊ณผ ์ƒ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์Šคํ‚ค๋งˆ์— ๋งž๋‹ค๋ฉด ์œ ์ง€, ์•„๋‹ˆ๋ผ๋ฉด Long์œผ๋กœ ํ†ต์ผ์„ ๊ฒ€ํ† ํ•ด์ฃผ์„ธ์š”.

core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (1)

20-37: ํŒŒ๋ผ๋ฏธํ„ฐ ํŒจ์Šค์Šค๋ฃจ LGTM

๋ฐ์ดํ„ฐ์†Œ์Šค์— ๋„ค์ด๋ฐ ์•„๊ทœ๋จผํŠธ๋กœ ์ •ํ™•ํžˆ ์œ„์ž„๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด ๋„๋ฉ”์ธ/๋„คํŠธ์›Œํฌ ๊ณ„์ธต๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๋ฅผ ๋งž์ถ”๋ฉด ๊ฐ€๋…์„ฑ์ด ์กฐ๊ธˆ ๋” ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (2)

30-38: URL ์ธ์ฝ”๋”ฉ์—์„œ ๋ฌธ์ž์…‹ ์ƒ์ˆ˜ ์‚ฌ์šฉ

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์‹  ํ‘œ์ค€ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

+import java.nio.charset.StandardCharsets
@@
-    return URLEncoder.encode(json, "UTF-8")
+    return URLEncoder.encode(json, StandardCharsets.UTF_8.toString())
@@
-    val decoded = URLDecoder.decode(this, "UTF-8")
+    val decoded = URLDecoder.decode(this, StandardCharsets.UTF_8.toString())

๋˜ํ•œ Json ์„ค์ •์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ(encodeDefaults/ignoreUnknownKeys ๋“ฑ)ํ•˜๋ฉด ๋ฒ„์ „ ๋ณ€๊ฒฝ ์‹œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ) private val json = Json { encodeDefaults = true }.


19-27: ๋„ค์ด๋ฐ ์ผ๊ด€์„ฑ(qnaElements vs qnas)

๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์€ qnas, UI ๋ชจ๋ธ์€ qnaElements๋กœ ํ˜ผ์žฌ๋˜์–ด ํ˜ผ๋™์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ํ•œ์ชฝ์œผ๋กœ ๋งž์ถ”๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (3)

576-582: onValueChange ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํ˜ธํ™˜์„ฑ ํ™•์ธ

setKeyword๊ฐ€ (String?) -> Unit, onValueChange๋Š” (String) -> Unit์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํƒ€์ž… ์ถ”๋ก ์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด ๋žŒ๋‹ค๋กœ ๊ฐ์‹ธ๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

-            onValueChange = setKeyword,
+            onValueChange = { setKeyword(it) },

362-373: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ i18n ์ฒ˜๋ฆฌ

"๋‹ต๋ณ€"๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ string ๋ฆฌ์†Œ์Šค๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”. ์ ‘๊ทผ์„ฑ ๋ฒˆ์—ญ/์ผ๊ด€์„ฑ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

-                JobisText(
-                    text = "๋‹ต๋ณ€",
+                JobisText(
+                    text = stringResource(id = R.string.answer),

Also applies to: 466-477, 691-702


169-191: ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง: items(size) ๋Œ€์‹  items(data) + key ๊ถŒ์žฅ

์„ฑ๋Šฅ/์žฌ๊ตฌ์„ฑ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด key๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”.

-            if (state.myReview.isNotEmpty()) {
-                items(state.myReview.size) {
-                    val myReview = state.myReview[it]
+            if (state.myReview.isNotEmpty()) {
+                items(
+                    items = state.myReview,
+                    key = { it.id } // ๊ฐ€์šฉํ•œ ๊ณ ์œ  ํ‚ค๊ฐ€ ์žˆ๋‹ค๋ฉด
+                ) { myReview ->
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (2)

151-158: answers ์ธ๋ฑ์‹ฑ ์•ˆ์ „ํ™” ๋ฐ VM ์œ„์ž„

answers[page] ์ง์ ‘ ์ธ๋ฑ์‹ฑ์€ ํฌ๋ž˜์‹œ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ ์ ‘๊ทผ์„ ์“ฐ๊ฑฐ๋‚˜(๊ถŒ์žฅ), TODO๋Œ€๋กœ VM๋กœ ์ƒํƒœ๋ฅผ ์˜ฎ๊ธฐ์„ธ์š”.

์•ˆ์ „ ์ ‘๊ทผ ์˜ˆ์‹œ:

-                    value = { answers[page] }, // TODO :: viewModel๋กœ ๋กœ์ง ์ด๋™
+                    value = { answers.getOrElse(page) { "" } }, // TODO :: viewModel๋กœ ๋กœ์ง ์ด๋™
                     onValueChange = { // TODO :: ''
-                        answers[page] = it
+                        if (page < answers.size) {
+                            answers[page] = it
+                        }
                     },

131-134: ๋ฌธ์ž์—ด ํ•˜๋“œ์ฝ”๋”ฉ(i18n) ์ œ๊ฑฐ ์ œ์•ˆ

"Q. ", "๋‹ค์Œ"์€ stringResource๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

์˜ˆ์‹œ:

-                        text = "Q. " + questions[page].question,
+                        text = stringResource(R.string.prefix_question) + " " + questions[page].question,
...
-                    text = "๋‹ค์Œ",
+                    text = stringResource(R.string.next),

Also applies to: 161-163

core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt (1)

16-24: ์ค‘๋ณต/๋ชจํ˜ธํ•œ ํ•„๋“œ ๋„ค์ด๋ฐ(question/answer)

์ตœ์ƒ์œ„ question/answer์™€ qnaResponse[].question/answer๊ฐ€ ๊ณต์กดํ•ด ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์šฉ์–ด๋ฅผ ๋ฐ˜์˜ํ•ด ์ด๋ฆ„์„ ๊ตฌ์ฒดํ™”(์˜ˆ: overallQuestion, overallAnswer)ํ•˜๊ฑฐ๋‚˜ KDoc์œผ๋กœ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์„ธ์š”.

Also applies to: 41-45

feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (3)

69-92: postReview ์‹คํŒจ ์ฒ˜๋ฆฌ ๋ฒ”์œ„ ํ™•์žฅ ์ œ์•ˆ

BadRequestException ์™ธ ์˜ˆ์™ธ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ/์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋“ฑ ๊ณตํ†ต ์—๋Ÿฌ๋ฅผ ๊ตฌ๋ถ„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋กœ๊น…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จ ์˜ˆ์‹œ:

.onFailure {
    when (it) {
        is BadRequestException -> postSideEffect(PostReviewSideEffect.BadRequest)
        else -> postSideEffect(PostReviewSideEffect.BadRequest) // ํ˜น์€ ๋ณ„๋„ SideEffect ์ถ”๊ฐ€
    }
}

94-103: ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ dead code ์ œ๊ฑฐ

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” addReview ๋ธ”๋ก์€ ์ œ๊ฑฐํ•ด ์ฃผ์„ธ์š”. ํžˆ์Šคํ† ๋ฆฌ๋Š” Git์ด ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.


220-238: ์„ ํƒํ˜• ํ•„๋“œ์˜ ์ดˆ๊ธฐ๊ฐ’ ํ‘œํ˜„ ๊ฐœ์„  ์ œ์•ˆ

interviewLocation์ด ๊ธฐ๋ณธ๊ฐ’ DAEJEON์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด โ€œ๋ฏธ์„ ํƒโ€ ํ‘œํ˜„์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. InterviewLocation? = null๋กœ ๋ฐ”๊พธ๊ณ  UI์—์„œ ๋ช…์‹œ์  ์„ ํƒ์„ ์œ ๋„ํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.

feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)

22-27: ์œ ํšจํ•˜์ง€ ์•Š์€ reviewId ๊ฐ€๋“œ ์ถ”๊ฐ€ ๊ถŒ์žฅ

nullable ์‹œ 0์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์ž˜๋ชป๋œ ์ƒ์„ธ ์ง„์ž…์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋“œ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์•ˆ์ „ํ™”ํ•˜์„ธ์š”.

-        val reviewId = it.arguments?.getLong(ResourceKeys.REVIEW_ID) ?: 0
+        val reviewId = it.arguments?.getLong(ResourceKeys.REVIEW_ID) ?: run {
+            onBackPressed()
+            return@composable
+        }
app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (2)

27-31: ์ฝœ๋ฐฑ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ช…ํ™•์„ฑ

onPostReviewClick: (String, Long) ํŒŒ๋ผ๋ฏธํ„ฐ ์˜๋ฏธ๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: companyName, companyId?). ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ํƒ€์ž… alias ๋˜๋Š” data class๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 54-58


35-41: ๋ผ์šฐํŠธ ํŒจํ„ด ๋ณ€๊ฒฝ ์‹œ 3๊ฐœ ์œ„์น˜ ๋™๊ธฐํ™” ํ•„์š”

ํ˜„์žฌ ๋ผ์šฐํŠธ ํŒจํ„ด "root{applicationId}"๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๊ตฌ๋ถ„์ž ์—†์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ถ™์ด๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋Œ€๋กœ "root/{applicationId}"๋กœ ๊ฐœ์„ ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ 3๊ฐœ ์œ„์น˜๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • RootNavigation.kt 36์ค„: route = "$NAVIGATION_ROOT/{$APPLICATION_ID}"
  • RootNavigation.kt 66์ค„: navigate("$NAVIGATION_ROOT/$applicationId")
  • JobisNavigator.kt 235์ค„: navController.currentDestination?.route == "$NAVIGATION_ROOT/{$APPLICATION_ID}"

๋ชจ๋‘ ํ•จ๊ป˜ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ผ์šฐํŠธ ๋งค์นญ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt (2)

15-23: ์˜ต์…”๋„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต์œผ๋กœ ํ˜ธ์ถœ๋ถ€ ๊ฐ„์†Œํ™”

๋‹ค์ˆ˜๊ฐ€ nullable์ธ ๋งŒํผ ๊ธฐ๋ณธ๊ฐ’์„ = null๋กœ ์ œ๊ณตํ•˜๋ฉด ํ˜ธ์ถœ๋ถ€ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค(ํŠนํžˆ ํ•„ํ„ฐ ์ผ๋ถ€๋งŒ ์ „๋‹ฌ ์‹œ).

-    suspend fun fetchReviews(
-        page: Int?,
-        location: InterviewLocation?,
-        interviewType: InterviewType?,
-        keyword: String?,
-        year: Int?,
-        companyId: Long?,
-        code: Long?,
-    ): FetchReviewsResponse
+    suspend fun fetchReviews(
+        page: Int? = null,
+        location: InterviewLocation? = null,
+        interviewType: InterviewType? = null,
+        keyword: String? = null,
+        year: Int? = null,
+        companyId: Long? = null,
+        code: Long? = null,
+    ): FetchReviewsResponse

25-32: ๋ฆฌ๋ทฐ ID ํƒ€์ž… ์ผ๊ด€ํ™” ์ œ์•ˆ

๋„ค๋น„๊ฒŒ์ด์…˜/ํ™”๋ฉด์—์„œ reviewId: Long๋กœ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. fetchReviewDetail(reviewId: String)๋„ Long์œผ๋กœ ํ†ต์ผํ•˜๋ฉด ๋ณ€ํ™˜ ๋น„์šฉ/์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-    suspend fun fetchReviewDetail(reviewId: String): FetchReviewDetailResponse
+    suspend fun fetchReviewDetail(reviewId: Long): FetchReviewDetailResponse

๋˜ํ•œ code๋Š” ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•˜๋‹ˆ jobCode ๋“ฑ ๋„๋ฉ”์ธ ๋ช…์‹œ๋กœ ๊ต์ฒด๋ฅผ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.

feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (2)

92-97: ํ•˜๋“œ์ฝ”๋”ฉ ํ…์ŠคํŠธ๋ฅผ stringResource๋กœ ์ด์ „

๊ตญ์ œํ™”/๋ฒˆ์—ญ/ํ…Œ์ŠคํŠธ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋กœ ์ด์ „ํ•ด ์ฃผ์„ธ์š”.

์˜ˆ์‹œ:

-            text = "๋ฐ›์•˜๋˜ ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”!",
+            text = stringResource(R.string.post_expect_title),
@@
-                text = "์งˆ๋ฌธ",
+                text = stringResource(R.string.question),
@@
-            hint = "๋ฐ›์•˜๋˜ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”.",
+            hint = stringResource(R.string.post_expect_question_hint),
@@
-            hint = "์˜ˆ์ƒ ์งˆ๋ฌธ ๋‹ต๋ณ€์„ ์„ฑ์‹ฌ์„ฑ์˜๊ป ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”!",
+            hint = stringResource(R.string.post_expect_answer_hint),
@@
-            text = "๊ฑด๋„ˆ๋›ธ๋ž˜์š”.",
+            text = stringResource(R.string.skip),
@@
-            text = "์™„๋ฃŒ",
+            text = stringResource(R.string.complete),

(๋ฆฌ์†Œ์Šค ํ‚ค๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.)

Also applies to: 101-110, 111-116, 120-129, 130-136, 138-147, 149-153


44-57: sideEffect ์ˆ˜์ง‘ ํŒจํ„ด ์ •๋ฆฌ(์„ ํƒ)

๋‘ ๊ฐœ์˜ LaunchedEffect(Unit)๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ฑฐ๋‚˜ collectLatest/์ˆ˜๋ช…์ฃผ๊ธฐ ์ธ์ง€ ์ˆ˜์ง‘์œผ๋กœ ์ผ์›ํ™”ํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์•ˆ์ „์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

LaunchedEffect(Unit) {
    launch { postExpectReviewViewModel.sideEffect.collect { /* ... */ } }
    launch { postReviewViewModel.sideEffect.collect { /* ... */ } }
}

Also applies to: 59-65

app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)

213-218: ๋ถˆ์šฉ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”

๊ฒ€์ฆ ๊ฒฐ๊ณผ, JobisNavigator.navigateToReview(companyId, companyName)์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ •๋ง๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์ € ํ•จ์ˆ˜ NavController.navigateToReview()๋Š” ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, ๋ž˜ํผ ํ•จ์ˆ˜๋Š” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ 2๊ฐœ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํŒจํ„ด๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, **์˜ต์…˜ A(ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ญ์ œ)**๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

-    fun navigateToReview(
-        companyId: Long,
-        companyName: String,
-    ) {
-        navController.navigateToReview()
-    }
+    fun navigateToReview() {
+        navController.navigateToReview()
+    }
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between ac5b061 and 6f55f18.

โ›” Files ignored due to path filters (1)
  • feature/bookmark/src/main/res/drawable/ic_empty_bookmark.png is excluded by !**/*.png
๐Ÿ“’ Files selected for processing (88)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (3 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (3 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (2 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (5 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt (2 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt (1 hunks)
  • app/src/main/res/drawable/ic_review.xml (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
  • build.gradle.kts (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/InterviewType.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt (1 hunks)
  • core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt (1 hunks)
  • core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (2 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt (1 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt (1 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1 hunks)
  • core/design-system/src/main/res/drawable/ic_asterisk.xml (1 hunks)
  • core/design-system/src/main/res/drawable/ic_success.xml (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt (2 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/api/InterestsApi.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/api/ReviewApi.kt (2 hunks)
  • core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt (2 hunks)
  • core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/request/PostReviewRequest.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchQuestionsResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt (1 hunks)
  • feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt (1 hunks)
  • feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt (1 hunks)
  • feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt (3 hunks)
  • feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1 hunks)
  • feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1 hunks)
  • feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (1 hunks)
  • feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt (1 hunks)
  • feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt (3 hunks)
  • feature/post-review/.gitignore (1 hunks)
  • feature/post-review/build.gradle.kts (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/res/values/strings.xml (1 hunks)
  • feature/review/build.gradle.kts (2 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (2 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (2 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1 hunks)
  • feature/review/src/main/res/values/strings.xml (1 hunks)
  • settings.gradle.kts (1 hunks)
๐Ÿ’ค Files with no reviewable changes (6)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt
  • feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt
  • feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt
  • feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt
  • feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt
  • feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt
๐Ÿงฐ Additional context used
๐Ÿงฌ Code graph analysis (30)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
  • JobisCard (43-81)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
  • PostReviewComplete (29-47)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)
  • ReviewFilter (47-66)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)
  • PostExpectReview (34-76)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (4)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (4)
  • setYear (27-29)
  • setCode (23-25)
  • setLocation (35-37)
  • clearReview (39-44)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisLargeTopAppBar (153-181)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
  • JobisIconButton (74-93)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
  • ReviewItems (25-81)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (6)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
  • navigateToPostExpectReview (149-151)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
  • navigateToPostExpectReview (31-33)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (2)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
  • navigateToPostReview (35-37)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1)
  • SearchReview (19-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)
  • PostReview (66-135)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)
  • Review (24-50)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1)
  • setButtonEnabled (22-27)
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/post-review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (2)
  • android (8-10)
  • implementation (15-17)
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
  • review (10-24)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (3)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
  • setButtonEnabled (130-140)
  • onNextClick (187-197)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
  • onNextClick (47-55)
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (7)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
  • postReview (15-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
  • postNextReview (17-31)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
  • postExpectReview (15-29)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
  • postReviewComplete (10-22)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
  • reviewDetails (13-29)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
  • reviewFilter (10-18)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
  • searchReview (10-22)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (1)
  • ReviewDetails (47-78)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
  • JobisCheckBox (21-66)
app/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
  • implementation (15-17)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1)
  • PostNextReview (45-82)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (9)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
  • navigateToPostNextReview (141-143)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
  • navigateToPostNextReview (33-35)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisLargeTopAppBar (153-181)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (6)
  • setButtonClear (179-185)
  • setInterviewType (151-158)
  • setInterviewLocation (160-167)
  • setChecked (142-149)
  • setKeyword (59-67)
  • setSelectedTech (104-105)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
  • JobisIconButton (74-93)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
  • JobisCheckBox (21-66)
feature/review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
  • implementation (15-17)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
  • ReviewItems (25-81)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
  • EmptyContent (21-56)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/tab/TabBar.kt (1)
  • TabBar (21-68)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
  • JobisCard (43-81)
๐Ÿช› detekt (1.23.8)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt

[warning] 38-38: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.

(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)

coderabbitai bot added a commit that referenced this pull request Oct 28, 2025
Docstrings generation was requested by @uson1004.

* #473 (comment)

The following files were modified:

* `app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt`
* `app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt`
* `app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt`
* `app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt`
* `core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt`
* `core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt`
* `core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt`
* `core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt`
* `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt`
* `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt`
* `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt`
* `core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt`
* `core/network/src/main/java/team/retum/network/api/ReviewApi.kt`
* `core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt`
* `core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt`
* `feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt`
* `feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt`
* `feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt`
* `feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt`
* `feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt`
* `feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt`
* `feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt`
* `feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt`
* `feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt`
* `feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt`
* `feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt`
* `feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt`
* `feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt`
* `feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt`
* `feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt`
* `feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt`
* `feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt`
* `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt`
* `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt`
* `feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt`
* `feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt`
* `feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt`
* `feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt`
* `feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt`
* `feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt`
* `feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt`
* `feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt`
* `feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt`
* `feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt`
* `feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt`
* `feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt`
* `feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt`
* `feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt`
Copy link
Contributor

@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: 17

โ™ป๏ธ Duplicate comments (18)
core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1)

12-13: DOC_FAILED ์ƒํƒœ์˜ UI ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ

๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ์—์„œ ์ด๋ฏธ ์ง€์ ๋˜์—ˆ๋“ฏ์ด, ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ DOC_FAILED ์ƒํƒœ๊ฐ€ ApplyCompanyItem.kt์˜ ์ƒ‰์ƒ ๋งคํ•‘์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PROCESSING ์ƒํƒœ๋Š” UI์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ์œผ๋‚˜, DOC_FAILED๋Š” else ๋ถ„๊ธฐ๋กœ ๋น ์ ธ ์˜๋„ํ•˜์ง€ ์•Š์€ onPrimary ์ƒ‰์ƒ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1)

48-54: DOC_FAILED ์ƒํƒœ๊ฐ€ ์—ฌ์ „ํžˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ, ApplyStatus.DOC_FAILED๊ฐ€ when ํ‘œํ˜„์‹์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•„ else ๋ถ„๊ธฐ๋ฅผ ํ†ตํ•ด onPrimary ์ƒ‰์ƒ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. DOC_FAILED("์„œ๋ฅ˜ ํƒˆ๋ฝ")๋Š” ์˜๋ฏธ์ƒ FAILED("ํƒˆ๋ฝ")์™€ ์œ ์‚ฌํ•˜๋ฏ€๋กœ error ์ƒ‰์ƒ์œผ๋กœ ๋งคํ•‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

-        ApplyStatus.FAILED, ApplyStatus.REJECTED -> JobisTheme.colors.error
+        ApplyStatus.FAILED, ApplyStatus.DOC_FAILED, ApplyStatus.REJECTED -> JobisTheme.colors.error
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (2)

12-27: ์ค‘์ฒฉ setState ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
setAnswer์™€ setQuestion์ด setState ๋ธ”๋ก ์•ˆ์—์„œ ๋‹ค์‹œ setButtonEnabled๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋˜ ๋‹ค๋ฅธ setState๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. BaseViewModel.setState๋Š” MutableStateFlow.update๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด ํŒจํ„ด์€ ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ์ด ๊ฐ’์„ ๋ฎ์–ด์จ ์ƒํƒœ ํ”Œ๋ฆฌ์ปค๋‚˜ ๋ ˆ์ด์Šค๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์˜ setState ์•ˆ์—์„œ ํ•„๋“œ์™€ buttonEnabled๋ฅผ ๋™์‹œ์— ๊ณ„์‚ฐยท๋ฐ˜์˜ํ•˜๋„๋ก ์ •๋ฆฌํ•ด ์ฃผ์„ธ์š”.

-    internal fun setAnswer(answer: String) = setState {
-        setButtonEnabled(answer = answer)
-        state.value.copy(answer = answer)
-    }
-
-    internal fun setQuestion(question: String) = setState {
-        setButtonEnabled(question = question)
-        state.value.copy(question = question)
-    }
-
-    private fun setButtonEnabled(
-        answer: String = state.value.answer,
-        question: String = state.value.question,
-    ) = setState {
-        state.value.copy(buttonEnabled = answer.isNotBlank() && question.isNotBlank())
-    }
+    internal fun setAnswer(answer: String) {
+        val question = state.value.question
+        setState {
+            state.value.copy(
+                answer = answer,
+                buttonEnabled = answer.isNotBlank() && question.isNotBlank(),
+            )
+        }
+    }
+
+    internal fun setQuestion(question: String) {
+        val answer = state.value.answer
+        setState {
+            state.value.copy(
+                question = question,
+                buttonEnabled = answer.isNotBlank() && question.isNotBlank(),
+            )
+        }
+    }

29-36: setEmpty๊ฐ€ ์ƒํƒœ๋ฅผ ์‹ค์ œ๋กœ ๋น„์šฐ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
setEmpty๊ฐ€ copy๋งŒ ํ˜ธ์ถœํ•˜๊ณ  setState๋กœ ์ ์šฉํ•˜์ง€ ์•Š์•„ onNextClick์ด ์ด์ „ ์งˆ๋ฌธ/๋‹ต๋ณ€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”๋„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ƒํƒœ๋ฅผ ๋น„์šฐ๊ณ  ๋ฒ„ํŠผ๋„ ๊บผ์ง€๊ฒŒ ๋งŒ๋“  ๋’ค ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

-    internal fun setEmpty() {
-        with(state.value) {
-            copy(
-                question = "",
-                answer = "",
-            )
-        }
-        onNextClick()
-    }
+    internal fun setEmpty() {
+        setState {
+            state.value.copy(
+                question = "",
+                answer = "",
+                buttonEnabled = false,
+            )
+        }
+        onNextClick()
+    }
feature/post-review/src/main/res/values/strings.xml (1)

30-30: ์ด์ „ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์ด๋ฏธ ๋ฐ˜์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

"์ž˜๋ชป๋œ ์š”์ฒญ์ด์—์š”"๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (3)

22-23: navArgument ํƒ€์ž… ๋ช…์‹œ ํ•„์š” ๋ฐ companyId๋Š” LongType ์‚ฌ์šฉ

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. navArgument ๋ธ”๋ก์— type =์„ ๋ช…์‹œํ•˜๊ณ , companyId๋Š” LongType์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ˆ˜๋™ ํŒŒ์‹ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

-            navArgument(ResourceKeys.COMPANY_NAME) { NavType.StringType },
-            navArgument(ResourceKeys.COMPANY_ID) { NavType.StringType },
+            navArgument(ResourceKeys.COMPANY_NAME) { type = NavType.StringType },
+            navArgument(ResourceKeys.COMPANY_ID) { type = NavType.LongType },

29-30: companyName URI ์ธ์ฝ”๋”ฉ ๋ฐ companyId ํƒ€์ž… ์•ˆ์ „์„ฑ ๊ฐœ์„ 

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค:

  1. ๊ณต๋ฐฑ์ด๋‚˜ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ํšŒ์‚ฌ๋ช…์€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฒฝ๋กœ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.
  2. companyId๋ฅผ String์œผ๋กœ ๋ฐ›์•„ ํŒŒ์‹ฑํ•˜๋ฉด์„œ 0L ๋””ํดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํŒจ๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

+import android.net.Uri
-import kotlin.text.toLongOrNull
@@
-            companyName = it.arguments?.getString(ResourceKeys.COMPANY_NAME) ?: "",
-            companyId = it.arguments?.getString(ResourceKeys.COMPANY_ID)?.toLongOrNull() ?: 0L,
+            companyName = requireNotNull(it.arguments).getString(ResourceKeys.COMPANY_NAME).orEmpty(),
+            companyId = requireNotNull(it.arguments).getLong(ResourceKeys.COMPANY_ID),

35-39: navigateToPostReview์—์„œ companyName URI ์ธ์ฝ”๋”ฉ ํ•„์š”

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. companyName์„ URI ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณต๋ฐฑ์ด๋‚˜ ํŠน์ˆ˜๋ฌธ์ž๋กœ ์ธํ•ด ๋„ค๋น„๊ฒŒ์ด์…˜์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

+import android.net.Uri
@@
 fun NavController.navigateToPostReview(companyName: String, companyId: Long) {
-    navigate("$NAVIGATION_POST_REVIEW/$companyName/$companyId") {
+    navigate("$NAVIGATION_POST_REVIEW/${Uri.encode(companyName)}/$companyId") {
         popUpTo(NAVIGATION_POST_NEXT_REVIEW) { inclusive = false }
         popUpTo(NAVIGATION_POST_EXPECT_REVIEW) { inclusive = false }
     }
 }
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)

19-29: ์งˆ๋ฌธ ๋กœ๋“œ ์‹คํŒจ ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์‹คํŒจ ์‹œ ์ƒํƒœ๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•„ UX๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

         viewModelScope.launch(Dispatchers.IO) {
             fetchQuestionsUseCase().onSuccess {
                 setState {
                     state.value.copy(
                         questions = it.questions,
+                        answers = List(it.questions.size) { "" },
+                        qnaElements = emptyList(),
+                        buttonEnabled = false,
                     )
                 }
+            }.onFailure {
+                setState {
+                    state.value.copy(
+                        questions = emptyList(),
+                        answers = emptyList(),
+                        qnaElements = emptyList(),
+                        buttonEnabled = false,
+                    )
+                }
+                // TODO: ์‹คํŒจ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ/ํ† ์ŠคํŠธ ๋…ธ์ถœ
             }
         }

47-61: answers ๊ธธ์ด ๊ฒ€์ฆ ๋ฐ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋กœ์ง ๋ˆ„๋ฝ

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ, ์งˆ๋ฌธ ์ˆ˜์™€ answers ๊ธธ์ด๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋ฉด zip์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ ค๋‚˜๊ฐ€ ๋ฐ์ดํ„ฐ ์œ ์‹ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๋‹ต๋ณ€์ด ์ฑ„์›Œ์กŒ์„ ๋•Œ๋งŒ ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธธ์ด ๊ฒ€์ฆ๊ณผ ๋ฒ„ํŠผ ํ™œ์„ฑํ™”๋ฅผ ํ•จ๊ป˜ ๋ฐ˜์˜ํ•ด์ฃผ์„ธ์š”:

     internal fun setQuestion() {
         setState {
             with(state.value) {
-                val updatedQuestions = questions.map { it.id }
-                copy(
-                    qnaElements = updatedQuestions.zip(answers).map { (q, a) ->
-                        PostReviewContent(
-                            question = q,
-                            answer = a,
-                        )
-                    },
-                )
+                val ids = questions.map { it.id }
+                val pairs = ids.zip(answers)
+                val allAnswered = answers.size == ids.size && answers.all { it.isNotBlank() }
+                copy(
+                    qnaElements = pairs.map { (q, a) -> PostReviewContent(question = q, answer = a) },
+                    answers = answers,
+                    buttonEnabled = allAnswered,
+                )
             }
         }
     }
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (2)

55-55: answers ๋ฆฌ์ŠคํŠธ ๊ณ ์ • ํฌ๊ธฐ๋กœ ์ธํ•œ ํฌ๋ž˜์‹œ ๊ฐ€๋Šฅ์„ฑ

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ ์ˆ˜(state.questions.size)์™€ answers ํฌ๊ธฐ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋ฉด answers[page]์—์„œ IndexOutOfBoundsException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

-    val answers = remember { mutableStateListOf("", "", "") }
+    val answers = remember(state.questions) {
+        mutableStateListOf(*Array(state.questions.size) { "" })
+    }

๋˜๋Š” toMutableStateList() ์‚ฌ์šฉ:

+import androidx.compose.runtime.toMutableStateList
@@
-    val answers = remember { mutableStateListOf("", "", "") }
+    val answers = remember(state.questions) {
+        List(state.questions.size) { "" }.toMutableStateList()
+    }

166-166: ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ ํ•„์š”

์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ 3์ด ์•„๋‹ ๊ฒฝ์šฐ ํ๋ฆ„์ด ๊นจ์ง‘๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

                     onClick = {
                         setQuestion()
                         coroutineScope.launch {
-                            if (pagerState.currentPage != 2) pagerState.animateScrollToPage(pagerState.currentPage + 1) else onPostExpectReviewClick()
+                            val lastPageIndex = pagerState.pageCount - 1
+                            if (pagerState.currentPage < lastPageIndex) {
+                                pagerState.animateScrollToPage(pagerState.currentPage + 1)
+                            } else {
+                                onPostExpectReviewClick()
+                            }
                         }
                     },
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)

88-154: ํ•˜๋‹จ ๋ฐฐ์น˜๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก Column ์— ์ „์ฒด ๋†’์ด๋ฅผ ๋ถ€์—ฌํ•˜์„ธ์š”

Spacer(weight = 1f) ๋กœ ๋ฒ„ํŠผ์„ ํ•˜๋‹จ์— ๋ถ™์ด๋ ค๋ฉด ๋ถ€๋ชจ Column ์ด ๊ฐ€์šฉ ๋†’์ด๋ฅผ ์ฐจ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Modifier.fillMaxSize() ๊ฐ€ ์—†์–ด ๋ฒ„ํŠผ์ด ์ค‘๊ฐ„์— ๋จธ๋ฌด๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ์กด ์ง€์ ๊ณผ ๋™์ผํ•˜๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

-import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
@@
-    Column {
+    Column(
+        modifier = Modifier.fillMaxSize(),
+    ) {
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)

33-39: ๋ผ์šฐํŠธ ์ธ์ฝ”๋”ฉ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹คํŒจ

JSON ์•ˆ์— /, ?, % ๋“ฑ์ด ํฌํ•จ๋˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ๋ชฉ์ ์ง€ ๋งค์นญ์ด ์‹คํŒจํ•˜๊ณ , ์˜ˆ์™ธ๋ฅผ ๋ฉ”์‹œ์ง€ ์—†์ด ๋˜์ ธ ๋””๋ฒ„๊น…๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Uri.encode/Uri.decode์™€ ๋ช…์‹œ์ ์ธ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

+import android.net.Uri
@@
 fun NavController.navigateToPostNextReview(reviewData: PostReviewData) {
-    navigate("$NAVIGATION_POST_NEXT_REVIEW/${reviewData.toJsonString()}")
+    val payload = Uri.encode(reviewData.toJsonString())
+    navigate("$NAVIGATION_POST_NEXT_REVIEW/$payload")
 }
 
 internal fun NavBackStackEntry.getReviewData(): PostReviewData {
-    val reviewData = arguments?.getString(ResourceKeys.REVIEW_DATA) ?: throw NullPointerException()
-    return reviewData.toReviewData()
+    val encoded = requireNotNull(arguments?.getString(ResourceKeys.REVIEW_DATA)) {
+        "Missing '${ResourceKeys.REVIEW_DATA}' argument for $NAVIGATION_POST_NEXT_REVIEW"
+    }
+    return Uri.decode(encoded).toReviewData()
 }
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)

704-708: ํžŒํŠธ ๋ฌธ์ž์—ด์„ ํ•„๋“œ ์šฉ๋„์— ๋งž๊ฒŒ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”.

๋ฉด์ ‘๊ด€ ์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ์— ์—ฌ์ „ํžˆ search ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด UX๊ฐ€ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฉด์ ‘๊ด€ ์ˆ˜์— ๋งž๋Š” ์ƒˆ๋กœ์šด string ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.

-            hint = stringResource(id = R.string.search),
+            hint = stringResource(id = R.string.hint_interviewer_count),

โ€ป hint_interviewer_count ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€๋„ ํ•จ๊ป˜ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (3)

107-116: [DUPLICATE] Compose SnapshotStateList๋ฅผ IO ์Šค๋ ˆ๋“œ์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ฌธ์ œ

Line 114์—์„œ techs.addAll(it.codes)๋ฅผ Dispatchers.IO์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์Šค๋ƒ…์ƒท ์ถฉ๋Œ ๋ฐ ํฌ๋ž˜์‹œ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ด๋ฏธ ์ง€์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ StateFlow๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”:

 internal fun fetchCodes(keyword: String?) =
     viewModelScope.launch(Dispatchers.IO) {
         fetchCodeUseCase(
             keyword = keyword,
             type = CodeType.JOB,
             parentCode = null,
         ).onSuccess {
-            techs.addAll(it.codes)
+            withContext(Dispatchers.Main) {
+                techs.addAll(it.codes)
+            }
         }
     }

130-140: [DUPLICATE] ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋กœ์ง ์—ญ์ „ ๋ฐ NPE ์œ„ํ—˜

Line 137์—์„œ !state.value.keyword?.isNotEmpty()!!๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์—ญ์ „๋œ ๋กœ์ง์ด๋ฉฐ, keyword๊ฐ€ null์ผ ๊ฒฝ์šฐ NPE ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ด๋ฏธ ์ง€์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ • ์ ์šฉ:

 else -> {
-   setState { state.value.copy(buttonEnabled = !state.value.keyword?.isNotEmpty()!!) }
+   setState {
+       state.value.copy(
+           buttonEnabled = !state.value.keyword.isNullOrEmpty()
+       )
+   }
 }

187-197: [DUPLICATE] interviewerCount ํŒŒ์‹ฑ ์‹œ ํฌ๋ž˜์‹œ ์œ„ํ—˜

Line 191์—์„œ count.toInt()๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ ์‹œ NumberFormatException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ด๋ฏธ ์ง€์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ ํŒŒ์‹ฑ ์ ์šฉ:

 internal fun onNextClick() {
     with(state.value) {
+        val parsedCount = count.toIntOrNull()
+        if (parsedCount == null || parsedCount <= 0) {
+            postSideEffect(PostReviewSideEffect.BadRequest)
+            return
+        }
         postSideEffect(PostReviewSideEffect.MoveToNext(
             companyId = companyId,
-            interviewerCount = count.toInt(),
+            interviewerCount = parsedCount,
             jobCode = selectedTech ?: 0,
             interviewType = interviewType,
             location = interviewLocation,
         ))
     }
 }
๐Ÿงน Nitpick comments (10)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)

33-47: ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ถ”๊ฐ€๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

fetchCodeUseCase ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋นˆ ๋ชฉ๋ก๋งŒ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋กœ๊น…์„ ๊ณ ๋ คํ•˜์„ธ์š”.

             fetchCodeUseCase(
                 keyword = null,
                 type = CodeType.JOB,
                 parentCode = null,
             ).onSuccess {
                 setState {
                     state.value.copy(
                         majorList = it.codes,
                     )
                 }
+            }.onFailure {
+                // ๋กœ๊น… ๋˜๋Š” ์—๋Ÿฌ ์ƒํƒœ ์ฒ˜๋ฆฌ ๊ณ ๋ ค
             }
feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (1)

30-38: deprecated API ์‚ฌ์šฉ์„ ํ”ผํ•˜์„ธ์š”.

URLEncoder.encode(String, String) ๋ฐ URLDecoder.decode(String, String)๋Š” deprecated API์ž…๋‹ˆ๋‹ค. StandardCharsets๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„๋Œ€์ ์ด๊ณ  ์•ˆ์ „ํ•œ API๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

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

+import java.nio.charset.StandardCharsets
+
 internal fun PostReviewData.toJsonString(): String {
     val json = Json.encodeToString(this)
-    return URLEncoder.encode(json, "UTF-8")
+    return URLEncoder.encode(json, StandardCharsets.UTF_8)
 }
 
 internal fun String.toReviewData(): PostReviewData {
-    val decoded = URLDecoder.decode(this, "UTF-8")
+    val decoded = URLDecoder.decode(this, StandardCharsets.UTF_8)
     return Json.decodeFromString<PostReviewData>(decoded)
 }
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)

77-89: items() ํ™•์žฅ ํ•จ์ˆ˜ ๋Œ€์‹  itemsIndexed() ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

items(state.reviews.size)์™€ ์ธ๋ฑ์Šค ์ ‘๊ทผ ๋Œ€์‹ , LazyColumn์˜ itemsIndexed() ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

+import androidx.compose.foundation.lazy.itemsIndexed
+
-        LazyColumn {
-            items(state.reviews.size) {
-                val review = state.reviews[it]
+        LazyColumn {
+            itemsIndexed(state.reviews) { _, review ->
                 ReviewItems(
                     companyImageUrl = review.companyLogoUrl,
                     companyName = review.companyName,
                     reviewId = review.reviewId,
                     writer = review.writer,
                     major = review.major,
                     onReviewDetailClick = onReviewDetailClick,
                 )
             }
         }
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)

38-38: TODO ์ฃผ์„: API ์š”์ฒญ ์ตœ์ ํ™” ํ•„์š”

๋นˆ๋ฒˆํ•œ API ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹ฑ, ์š”์ฒญ ์ค‘๋ณต ์ œ๊ฑฐ, ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐœ์„  ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์—ด์–ด๋“œ๋ฆด๊นŒ์š”?

feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)

33-60: ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋น„๋ฉด ๊ฒฐ๊ณผ๋„ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ์„ธ์š”

๊ฒ€์ƒ‰์–ด๋ฅผ ๋ชจ๋‘ ์ง€์šฐ๋ฉด fetchReviews() ๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ด์ „ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์–ด ํ™”๋ฉด๊ณผ ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋ถˆ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์ผ ๋•Œ๋Š” ๋ฆฌ์ŠคํŠธ์™€ ๋นˆ ์ƒํƒœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŽธ์ด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

         viewModelScope.launch {
-            state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect {
-                if (!it.isNullOrBlank()) {
-                    fetchReviews()
-                }
+            state.map { it.keyword }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS).collect { keyword ->
+                if (keyword.isNullOrBlank()) {
+                    setState {
+                        state.value.copy(
+                            reviews = emptyList(),
+                            showRecruitmentsEmptyContent = false,
+                        )
+                    }
+                } else {
+                    fetchReviews()
                 }
             }
         }
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (5)

113-122: ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ๋งŽ์•„ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์‚ฌ์šฉ ๊ถŒ์žฅ

8๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

data class StudentInfoData(
    val writer: String,
    val major: String,
    val year: Int,
    val companyName: String,
    val location: InterviewLocation,
    val type: InterviewType,
    val interviewerCount: Int,
    val selectedTabIndex: Int,
)

@Composable
private fun StudentInfo(data: StudentInfoData) {
    // implementation
}

133-140: ๋ณต์žกํ•œ ๋ฌธ์ž์—ด ํฌ๋งทํŒ… ๋กœ์ง ๋‹จ์ˆœํ™” ๊ถŒ์žฅ

์ค‘์ฒฉ๋œ stringResource ํ˜ธ์ถœ๊ณผ ์กฐ๊ฑด๋ฌธ์ด ๊ฐ€๋…์„ฑ์„ ์ €ํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ง์„ ๋ณ„๋„๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

val reviewType = if (selectedTabIndex != 0) {
    stringResource(id = R.string.reviewed_question)
} else {
    stringResource(id = R.string.interview_review)
}

JobisText(
    text = stringResource(
        id = R.string.review_writer_title,
        writer,
        reviewType,
    ),
    style = JobisTypography.PageTitle,
)

254-258: ํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌ ๋ช…์‹œ ๊ถŒ์žฅ

maxLines = 3์„ ์„ค์ •ํ–ˆ์ง€๋งŒ JobisText์˜ ๊ธฐ๋ณธ overflow ์†์„ฑ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ TextOverflow.Ellipsis๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

JobisText์˜ ๊ธฐ๋ณธ๊ฐ’์ด Ellipsis์ด๋ฏ€๋กœ ํ˜„์žฌ๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ, ๋ช…์‹œ์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Text(
    text = buildAnnotatedString { /* ... */ },
    style = JobisTypography.Description,
    modifier = Modifier
        .padding(top = 12.dp)
        .fillMaxWidth(0.5f),
    maxLines = 3,
    overflow = TextOverflow.Ellipsis, // ๋ช…์‹œ์  ์ง€์ •
)

274-274: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” index ๋ณ€์ˆ˜ ์ œ๊ฑฐ ๊ถŒ์žฅ

forEachIndexed๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ index ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. forEach๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

-    review.forEachIndexed { index, reviewItem ->
+    review.forEach { reviewItem ->

344-350: ๋‹ต๋ณ€ ํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌ ๊ฒ€ํ† 

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

ํ™•์žฅ ์ƒํƒœ์—์„œ๋Š” ์ „์ฒด ๋‹ต๋ณ€์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

                            JobisText(
                                text = reviewItem.answer,
                                color = JobisTheme.colors.inverseOnSurface,
                                style = JobisTypography.Description,
                                textAlign = TextAlign.Center,
-                                maxLines = 3,
+                                // ํ™•์žฅ๋œ ์ƒํƒœ์—์„œ๋Š” ์ „์ฒด ํ…์ŠคํŠธ ํ‘œ์‹œ
                            )
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between ac5b061 and 13a317c.

โ›” Files ignored due to path filters (1)
  • feature/bookmark/src/main/res/drawable/ic_empty_bookmark.png is excluded by !**/*.png
๐Ÿ“’ Files selected for processing (86)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (3 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (3 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (2 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (5 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt (2 hunks)
  • app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt (1 hunks)
  • app/src/main/res/drawable/ic_review.xml (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/InterviewType.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt (1 hunks)
  • core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt (1 hunks)
  • core/data/src/main/java/team/retum/data/repository/review/ReviewRepository.kt (1 hunks)
  • core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (2 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisColor.kt (1 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt (1 hunks)
  • core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1 hunks)
  • core/design-system/src/main/res/drawable/ic_asterisk.xml (1 hunks)
  • core/design-system/src/main/res/drawable/ic_success.xml (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/FetchReviewDetailEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/FetchReviewsEntity.kt (2 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsCountUseCase.kt (1 hunks)
  • core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/api/ReviewApi.kt (2 hunks)
  • core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSourceImpl.kt (2 hunks)
  • core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/request/PostReviewRequest.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchQuestionsResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt (1 hunks)
  • core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt (1 hunks)
  • feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt (1 hunks)
  • feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt (1 hunks)
  • feature/company/src/main/java/team/retum/company/ui/CompanyDetailsScreen.kt (3 hunks)
  • feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1 hunks)
  • feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1 hunks)
  • feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (1 hunks)
  • feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt (1 hunks)
  • feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt (3 hunks)
  • feature/post-review/.gitignore (1 hunks)
  • feature/post-review/build.gradle.kts (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/model/PostReviewData.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (1 hunks)
  • feature/post-review/src/main/res/values/strings.xml (1 hunks)
  • feature/review/build.gradle.kts (2 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (2 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (2 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt (0 hunks)
  • feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1 hunks)
  • feature/review/src/main/res/values/strings.xml (1 hunks)
  • settings.gradle.kts (1 hunks)
๐Ÿ’ค Files with no reviewable changes (6)
  • feature/review/src/main/java/team/retum/review/navigation/PostReviewNavigation.kt
  • feature/review/src/main/java/team/retum/review/viewmodel/PostReviewViewModel.kt
  • feature/review/src/main/java/team/retum/review/viewmodel/ReviewsViewModel.kt
  • feature/review/src/main/java/team/retum/review/ui/PostReviewScreen.kt
  • feature/review/src/main/java/team/retum/review/navigation/ReviewsNavigation.kt
  • feature/review/src/main/java/team/retum/review/ui/ReviewsScreen.kt
๐Ÿงฐ Additional context used
๐Ÿงฌ Code graph analysis (31)
app/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
  • implementation (15-17)
feature/review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
  • implementation (15-17)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (1)
  • SearchReview (19-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (1)
  • PostReviewComplete (29-47)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (4)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (4)
  • setYear (23-25)
  • setCode (19-21)
  • setLocation (31-33)
  • clearReview (35-44)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisLargeTopAppBar (153-181)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
  • JobisIconButton (74-93)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
  • ReviewItems (25-81)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
  • JobisCard (43-81)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (5)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
  • navigateToPostExpectReview (149-151)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
  • navigateToPostExpectReview (31-33)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (2)
  • setAnswer (31-41)
  • setQuestion (47-61)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewCompleteScreen.kt (2)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
  • navigateToPostReview (35-40)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostExpectReviewScreen.kt (1)
  • PostExpectReview (34-76)
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
  • review (10-24)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostNextReviewScreen.kt (1)
  • PostNextReview (45-81)
feature/post-review/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (2)
  • android (8-10)
  • implementation (15-17)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
  • JobisCheckBox (21-66)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (5)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/tab/TabBar.kt (1)
  • TabBar (21-68)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/card/JobisCard.kt (1)
  • JobisCard (43-81)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
  • EmptyContent (21-56)
feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewScreen.kt (1)
  • Review (24-50)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (1)
  • setButtonEnabled (22-27)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (1)
  • PostReview (66-135)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)
  • ReviewFilter (47-66)
feature/review/src/main/java/team/retum/review/ui/SearchReviewScreen.kt (4)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisSmallTopAppBar (124-144)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)
  • ReviewItems (25-81)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/empty/EmptyContent.kt (1)
  • EmptyContent (21-56)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostExpectReviewViewModel.kt (3)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (2)
  • setState (60-64)
  • postSideEffect (106-110)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (2)
  • setButtonEnabled (130-140)
  • onNextClick (187-197)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostNextReviewViewModel.kt (1)
  • onNextClick (63-71)
feature/review/src/main/java/team/retum/review/viewmodel/SearchReviewsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/post-review/src/main/java/team/retum/post/review/ui/PostReviewScreen.kt (9)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)
  • navigateToPostNextReview (141-143)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
  • navigateToPostNextReview (33-35)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
  • JobisLargeTopAppBar (153-181)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/text/JobisText.kt (1)
  • JobisText (24-45)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisButton.kt (1)
  • JobisButton (322-340)
feature/post-review/src/main/java/team/retum/post/review/viewmodel/PostReviewViewModel.kt (6)
  • setButtonClear (179-185)
  • setInterviewType (151-158)
  • setInterviewLocation (160-167)
  • setChecked (142-149)
  • setKeyword (59-67)
  • setSelectedTech (104-105)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/button/JobisIconButton.kt (1)
  • JobisIconButton (74-93)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/textfield/JobisTextField.kt (1)
  • JobisTextField (355-436)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/checkbox/CheckBox.kt (1)
  • JobisCheckBox (21-66)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (1)
  • ReviewDetails (48-75)
feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewViewModel.kt (1)
  • fetchReviewsUseCase (14-63)
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (1)
core/common/src/main/java/team/retum/common/base/BaseViewModel.kt (1)
  • setState (60-64)
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (7)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewNavigation.kt (1)
  • postReview (15-33)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt (1)
  • postNextReview (17-31)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostExpectReviewNavigation.kt (1)
  • postExpectReview (15-29)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostReviewCompleteNavigation.kt (1)
  • postReviewComplete (10-22)
feature/review/src/main/java/team/retum/review/navigation/ReviewDetailsNavigation.kt (1)
  • reviewDetails (13-29)
feature/review/src/main/java/team/retum/review/navigation/ReviewFilterNavigation.kt (1)
  • reviewFilter (10-18)
feature/review/src/main/java/team/retum/review/navigation/SearchReviewsNavigation.kt (1)
  • searchReview (10-22)
๐Ÿช› detekt (1.23.8)
feature/post-review/src/main/java/team/retum/post/review/navigation/PostNextReviewNavigation.kt

[warning] 38-38: A call to the default constructor of an exception was detected. Instead one of the constructor overloads should be called. This allows to provide more meaningful exceptions.

(detekt.exceptions.ThrowingExceptionsWithoutMessageOrCause)

๐Ÿ”‡ Additional comments (50)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/review/ReviewContent.kt (2)

22-23: ์ข‹์€ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค!

reviewId ํƒ€์ž…์„ String์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  onClick ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ (Long) -> Unit์œผ๋กœ ๋‹จ์ˆœํ™”ํ•œ ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ID์— Long ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ‘œ์ค€์ ์ด๋ฉฐ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜์—๋Š” ๋ฆฌ๋ทฐ ID๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ API๊ฐ€ ๋”์šฑ ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


27-27: ๊ตฌํ˜„์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

onClick ํ•ธ๋“ค๋Ÿฌ์— reviewId๋งŒ ์ „๋‹ฌํ•˜๋„๋ก ๊ตฌํ˜„์ด ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. writer ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์—ฌ์ „ํžˆ UI ํ‘œ์‹œ์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1)

85-90: ๋ฆฌ๋ทฐ API ๊ฒฝ๋กœ ๋ฆฌํŒฉํ† ๋ง ํ™•์ธ ์™„๋ฃŒ
์ƒ์„ธยท๋ชฉ๋กยท์งˆ๋ฌธยท์ง‘๊ณ„ยท๋‚ด ๋ฆฌ๋ทฐ ๊ฒฝ๋กœ๊ฐ€ ๊ณตํ†ต path ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌ๋˜์–ด ์ƒˆ Retrofit ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค. GET/POST ๊ฒฝ๋กœ๋„ ์ƒ์ˆ˜ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด ํ˜ผ์„ ์ด ์ค„์–ด๋“ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

core/common/src/main/java/team/retum/common/enums/ApplyStatus.kt (1)

6-6: SEND ๋ผ๋ฒจ ๋ณ€๊ฒฝ ์˜๋„๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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

feature/home/src/main/java/team/retum/home/ui/ApplyCompanyItem.kt (1)

51-51: LGTM: SEND์™€ PROCESSING ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋จ

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ SEND์™€ PROCESSING ์ƒํƒœ๋ฅผ secondary ์ƒ‰์ƒ์œผ๋กœ ๋งคํ•‘ํ•œ ๊ฒƒ์€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt (2)

61-91: LGTM!

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


94-113: LGTM!

ReviewsFilterState ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. @Immutable ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด Compose ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋ถ€ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/viewmodel/ReviewDetailsViewModel.kt (1)

34-36: LGTM!

setTabIndex ํ•จ์ˆ˜๋Š” ํƒญ ์ธ๋ฑ์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ, ๊ตฌํ˜„์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

feature/bookmark/src/main/java/team/retum/bookmark/ui/BookmarkScreen.kt (1)

135-135: ๋“œ๋กœ์–ด๋ธ” ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ - ์‹œ๊ฐ์  ์ ์ ˆ์„ฑ ๊ฒ€์ฆ ํ•„์š”

ic_empty_bookmark์—์„œ ์„ค๊ณ„ ์‹œ์Šคํ…œ์˜ ์ œ๋„ค๋ฆญ ic_empty๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฆฌ์†Œ์Šค๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋ฉฐ(core/design-system/src/main/res/drawable/ic_empty.png), ์ด ๋ณ€๊ฒฝ์ด BookmarkScreen์—๋งŒ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธ ์‚ฌํ•ญ:

  • ์ œ๋„ค๋ฆญ ic_empty๊ฐ€ ๋ถ๋งˆํฌ ๋นˆ ์ƒํƒœ ์ปจํ…์ŠคํŠธ์— ์‹œ๊ฐ์ ์œผ๋กœ ์ ์ ˆํ•œ์ง€ ๊ฒ€์ฆ
  • ์ด๊ฒƒ์ด ์˜๋„๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ ํ†ตํ•ฉ์ธ์ง€ ํ™•์ธ

contentDescription์€ ์—ฌ์ „ํžˆ "empty bookmark"์ด๋ฏ€๋กœ, ์„ ํƒ๋œ ์•„์ด์ฝ˜์ด ๋ถ๋งˆํฌ ์ปจํ…์ŠคํŠธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

feature/post-review/src/main/res/values/strings.xml (1)

1-58: LGTM!

๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๊ฐ€ ํ™”๋ฉด๋ณ„๋กœ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•œ๊ตญ์–ด ํ‘œ๊ธฐ๋ฒ•๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

app/src/main/java/team/retum/jobisandroidv2/ui/BottomNavigationBar.kt (1)

28-28: LGTM!

ํ•˜๋‹จ ๋„ค๋น„๊ฒŒ์ด์…˜์— Review ๋ฉ”๋‰ด ์•„์ดํ…œ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

settings.gradle.kts (1)

47-47: LGTM!

์ƒˆ๋กœ์šด post-review ๋ชจ๋“ˆ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

app/src/main/res/values/strings.xml (1)

6-6: LGTM!

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

core/design-system/src/main/res/drawable/ic_asterisk.xml (1)

1-9: LGTM!

ํ•„์ˆ˜ ์ž…๋ ฅ ํ‘œ์‹œ๋ฅผ ์œ„ํ•œ ๋ณ„ํ‘œ ์•„์ด์ฝ˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

feature/company/src/main/java/team/retum/company/viewmodel/CompanyDetailsViewModel.kt (1)

45-53: LGTM!

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

app/src/main/java/team/retum/jobisandroidv2/ui/BottomMenu.kt (2)

10-10: LGTM!

NAVIGATION_REVIEW import๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


29-33: LGTM!

Review ํ•˜๋‹จ ๋ฉ”๋‰ด ์•„์ดํ…œ์ด ๊ธฐ์กด ํŒจํ„ด๊ณผ ์ผ๊ด€๋˜๊ฒŒ ์ž˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

core/common/src/main/java/team/retum/common/enums/ReviewProcess.kt (1)

4-8: ๊ฒ€์ฆ ์™„๋ฃŒ - ๋ชจ๋“  ๋ณ€๊ฒฝ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๊ฒฐ๊ณผ, ReviewProcess ์—ด๊ฑฐํ˜•์˜ ์ƒ์ˆ˜ ๋ณ€๊ฒฝ(QUESTION, TECH, FINISH โ†’ INTERVIEW_TYPE, INTERVIEW_LOCATION, TECH_STACK, INTERVIEWER_COUNT, SUMMARY)์ด ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์— ์™„์ „ํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • ์ œ๊ฑฐ๋œ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ง์ ‘ ์ฐธ์กฐ ์—†์Œ
  • ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์ฐธ์กฐ ์—†์Œ
  • ๋ชจ๋“  ์‚ฌ์šฉ์ฒ˜์—์„œ ์ƒˆ๋กœ์šด ์ƒ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ๋จ (PostReviewViewModel.kt, PostReviewScreen.kt)

breaking change์ด์ง€๋งŒ ๋ณ€๊ฒฝ์ด ์™„์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋‚˜ ๋Ÿฐํƒ€์ž„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

core/design-system/src/main/java/team/retum/jobisdesignsystemv2/foundation/JobisIcon.kt (1)

40-40: ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ํŒจํ„ด์„ ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ์•„์ด์ฝ˜ ์ƒ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

core/design-system/src/main/res/drawable/ic_success.xml (1)

1-9: ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ํ˜•์‹์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ์„ฑ๊ณต ์™„๋ฃŒ ํ™”๋ฉด์—์„œ ์‚ฌ์šฉ๋  ์•„์ด์ฝ˜์œผ๋กœ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/model/response/FetchReviewDetailResponse.kt (2)

23-27: ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ๋ฆฌํŒฉํ† ๋ง์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

Detail์—์„œ QnAs๋กœ ๋ช…๋ช…์ด ๊ฐœ์„ ๋˜์—ˆ๊ณ , area ํ•„๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ช…์ด ๋” ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


10-20: ๊ฒ€์ฆ ์™„๋ฃŒ - ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ํ•„๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ชจ๋“  ๊ณ„์ธต์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JSON ํ•„๋“œ๋ช…(review_id, company_name, company_name ๋“ฑ)์ด ๋ชจ๋‘ ์ ์ ˆํ•œ snake_case๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, API โ†’ DataSource โ†’ Repository โ†’ UseCase โ†’ ViewModel ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ toEntity() ํ™•์žฅํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. QnAs ์ค‘์ฒฉ ํด๋ž˜์Šค๋„ ๋ณ„๋„ ๋งคํ•‘ํ•จ์ˆ˜๋กœ ์ง€์›๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

app/build.gradle.kts (1)

118-118: ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด post-review ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์„ ์•ฑ์— ํ†ตํ•ฉํ•˜๋Š” ํ‘œ์ค€์ ์ธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

app/src/main/res/drawable/ic_review.xml (1)

1-9: ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‹จ ๋„ค๋น„๊ฒŒ์ด์…˜์šฉ ๋ฆฌ๋ทฐ ์•„์ด์ฝ˜์ด ์ ์ ˆํ•œ ํฌ๊ธฐ(20dp)์™€ ์ƒ‰์ƒ์œผ๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/entity/ReviewsCountEntity.kt (1)

5-11: ์—”ํ‹ฐํ‹ฐ ์ •์˜์™€ ๋งคํ•‘์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์—”ํ‹ฐํ‹ฐ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ๋„คํŠธ์›Œํฌ ์‘๋‹ต์—์„œ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ๋กœ์˜ ๋งคํ•‘์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. totalPageCount์— Long ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ ๊ฒƒ๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

core/common/src/main/java/team/retum/common/enums/InterviewType.kt (1)

3-7: ๋ฐฑ์—”๋“œ API ์ŠคํŽ™ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ InterviewType ์—ด๊ฑฐํ˜•์€ ๋ช…์‹œ์ ์ธ ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†์œผ๋ฉฐ, Moshi์˜ ๊ธฐ๋ณธ ๋™์ž‘์— ๋”ฐ๋ผ INDIVIDUAL, GROUP, OTHER ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ปค์Šคํ…€ ์–ด๋Œ‘ํ„ฐ๋‚˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์œผ๋ฏ€๋กœ, ๋ฐฑ์—”๋“œ API๊ฐ€ ์‹ค์ œ๋กœ ์ด ํ˜•์‹์„ ๊ธฐ๋Œ€ํ•˜๋Š”์ง€ ๋ฐฑ์—”๋“œ ์ŠคํŽ™์„ ํ†ตํ•ด ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

core/common/src/main/java/team/retum/common/enums/InterviewLocation.kt (1)

3-8: ๋ฐฑ์—”๋“œ API ์ŠคํŽ™์„ ํ†ตํ•ด enum ์ง๋ ฌํ™” ํ˜•์‹ ๊ฒ€์ฆ ํ•„์š”

InterviewLocation enum์€ Moshi์— ์˜ํ•ด enum ์ƒ์ˆ˜๋ช…์ด ๊ทธ๋Œ€๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค (DAEJEON, SEOUL, GYEONGGI, OTHER). InterviewType๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ช…์‹œ์ ์ธ ์ง๋ ฌํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†์œผ๋ฏ€๋กœ, ๋ฐฑ์—”๋“œ๊ฐ€ ์ •ํ™•ํžˆ ์ด ํ˜•์‹์„ ๊ธฐ๋Œ€ํ•˜๋Š”์ง€ API ๋ฌธ์„œ ๋˜๋Š” ๋ฐฑ์—”๋“œ ํŒ€์„ ํ†ตํ•ด ํ™•์ธํ•˜์„ธ์š”.

enum ์ƒ์ˆ˜๋Š” ์ด๋ฏธ ์š”์ฒญ/์‘๋‹ต ํด๋ž˜์Šค(PostReviewRequest.kt, FetchReviewDetailResponse.kt)์—์„œ ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ, ๊ธฐ์กด ๋ฐฑ์—”๋“œ ๊ณ„์•ฝ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์žฌํ™•์ธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/entity/MyReviews.kt (1)

1-23: LGTM!

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

core/network/src/main/java/team/retum/network/model/response/FetchReviewsCountResponse.kt (1)

1-9: LGTM!

๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์‘๋‹ต ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. Moshi ์–ด๋Œ‘ํ„ฐ ์ƒ์„ฑ๊ณผ JSON ๋งคํ•‘์ด ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/navigation/ReviewNavigation.kt (1)

1-28: LGTM!

Jetpack Compose Navigation์„ ํ™œ์šฉํ•œ ๊น”๋”ํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๊ฐ€ ์ ์ ˆํ•˜๋ฉฐ ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ API๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/usecase/review/FetchMyReviewUseCase.kt (1)

1-13: LGTM!

๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ Use Case ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. runCatching์„ ํ†ตํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ์—”ํ‹ฐํ‹ฐ ๋ณ€ํ™˜์ด ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/model/response/FetchMyReviewResponse.kt (1)

1-15: LGTM!

๋„คํŠธ์›Œํฌ ์‘๋‹ต ๋ชจ๋ธ์ด ๊น”๋”ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Moshi ์–ด๋Œ‘ํ„ฐ ์ƒ์„ฑ๊ณผ JSON ํ•„๋“œ ๋งคํ•‘์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/model/response/FetchReviewsResponse.kt (1)

12-17: LGTM!

์‘๋‹ต ๋ชจ๋ธ์˜ ํ•„๋“œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. reviewId์˜ ํƒ€์ž… ๋ณ€๊ฒฝ(String โ†’ Long)๊ณผ ์ƒˆ๋กœ์šด ํ•„๋“œ๋“ค(companyName, companyLogoUrl, major) ์ถ”๊ฐ€๊ฐ€ ํ™•์žฅ๋œ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/ui/component/ReviewItems.kt (1)

26-81: LGTM!

๋ฆฌ๋ทฐ ์•„์ดํ…œ ์ปดํฌ์ €๋ธ”์˜ ๊ตฌํ˜„์ด ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ URL์ด ๋น„์–ด์žˆ์„ ๋•Œ์˜ ํด๋ฐฑ ์ฒ˜๋ฆฌ, ํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ฒ˜๋ฆฌ, ํด๋ฆญ ์ด๋ฒคํŠธ ์ „๋‹ฌ ๋“ฑ์ด ๋ชจ๋‘ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

feature/company/src/main/java/team/retum/company/navigation/CompanyDetailsNavigation.kt (1)

15-15: Long ๊ธฐ๋ฐ˜ ๋ฆฌ๋ทฐ ์‹๋ณ„์ž๋กœ์˜ ์ „ํ™˜์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ทฐ ์ƒ์„ธ ๋„ค๋น„๊ฒŒ์ด์…˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ (String, String)์—์„œ (Long)์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ์ผ๊ด€์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/usecase/review/FetchQuestionsUseCase.kt (1)

7-13: LGTM!

UseCase์˜ ๊ตฌํ˜„์ด ๊ฐ„๊ฒฐํ•˜๊ณ  ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. runCatching์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ Result๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด ์ ์ ˆํ•˜๋ฉฐ, ํ˜ธ์ถœ์ž๊ฐ€ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/entity/QuestionsEntity.kt (1)

16-16: ๋„ค์ด๋ฐ ํŒจํ„ด ์ผ๊ด€์„ฑ ํ™•์ธ ์™„๋ฃŒ - ์ง€์  ์‚ฌํ•ญ ์—†์Œ

ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ toEntity() ํ•จ์ˆ˜ ํŒจํ„ด์„ ๊ฒ€ํ† ํ•œ ๊ฒฐ๊ณผ, QuestionsEntity.kt์˜ ํ•จ์ˆ˜๋ช…๊ณผ ๊ตฌ์กฐ๋Š” ์ด๋ฏธ ํ”„๋กœ์ ํŠธ์˜ ํ‘œ์ค€ ๋„ค์ด๋ฐ ๊ทœ์น™๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. 18๊ฐœ ์ด์ƒ์˜ ์—”ํ‹ฐํ‹ฐ ํŒŒ์ผ์—์„œ internal fun ResponseType.toEntity() = EntityType(...) ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, QuestionsEntity.kt๋„ ๋™์ผํ•œ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TODO ์ฃผ์„์€ ์ œ๊ฑฐํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

Likely an incorrect or invalid review comment.

core/domain/src/main/java/team/retum/usecase/usecase/review/FetchReviewsUseCase.kt (1)

12-14: ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์ž„ ๊ฒ€์ฆ ์™„๋ฃŒ

ํ™•์žฅ๋œ ํ•„ํ„ฐ ์ธ์ž๊ฐ€ repository ๊ณ„์ธต์œผ๋กœ ์ •ํ™•ํžˆ ์ „๋‹ฌ๋˜๊ณ  runCatching ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ํฌ์žฅํ•˜๋Š” ํ๋ฆ„์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

core/data/src/main/java/team/retum/data/repository/review/ReviewRepositoryImpl.kt (1)

20-49: ๋ฐ์ดํ„ฐ์†Œ์Šค ์œ„์ž„์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

repository ๊ณ„์ธต์—์„œ ์ถ”๊ฐ€๋œ ํ•„ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋ถ€ data source ์— ๋„ค์ž„๋“œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ์–ด ๋งคํ•‘ ์˜ค๋ฅ˜ ์œ„ํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

core/domain/src/main/java/team/retum/usecase/entity/PostReviewEntity.kt (1)

7-21: ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋ฉด์ ‘ ํ›„๊ธฐ ์—”ํ‹ฐํ‹ฐ์— ์ƒˆ๋กœ์šด ํ•„๋“œ๋“ค(interviewType, location, jobCode, interviewerCount, question, answer)์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ , PostReviewContentEntity์˜ question ํƒ€์ž…์ด String์—์„œ Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์‹๋ณ„์ž๋กœ์„œ ๋” ์ ํ•ฉํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/datasource/review/ReviewDataSource.kt (1)

27-31: ์ƒˆ๋กœ์šด ๋ฆฌ๋ทฐ ๊ด€๋ จ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

fetchQuestions(), fetchReviewsCount(), fetchMyReviews() ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์˜ API ํ‘œ๋ฉด์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (1)

59-62: ๋ฆฌ๋ทฐ ๊ด€๋ จ ์ฝœ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ „๋‹ฌ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ฝœ๋ฐฑ๋“ค(onReviewFilterClick, onSearchReviewClick, onReviewDetailClick)์ด Root โ†’ RootScreen โ†’ review ์ปดํฌ์ €๋ธ”๋กœ ์ผ๊ด€๋˜๊ฒŒ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, onPostReviewClick์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋„ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋„๋ก ์ ์ ˆํžˆ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 99-101, 135-138, 185-189

app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (1)

201-203: reviewId ํƒ€์ž…์ด Long์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

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

app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (1)

118-133: ํฌ์ŠคํŠธ ๋ฆฌ๋ทฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ฒด์ธ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

postReview โ†’ postNextReview โ†’ postExpectReview โ†’ postReviewComplete ํ๋ฆ„์ด ์ ์ ˆํ•œ ์ฝœ๋ฐฑ๊ณผ ํ•จ๊ป˜ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

core/network/src/main/java/team/retum/network/api/ReviewApi.kt (1)

24-47: ๋ฆฌ๋ทฐ API ํ™•์žฅ์ด ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

fetchReviews๊ฐ€ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐ ๋‹ค์ค‘ ํ•„ํ„ฐ๋ง์„ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋˜์—ˆ๊ณ , ์ƒˆ๋กœ์šด ์—”๋“œํฌ์ธํŠธ๋“ค(fetchQuestions, fetchReviewsCount, fetchMyReviews)์ด ์ถ”๊ฐ€๋˜์–ด ๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ nullable๋กœ ์„ ์–ธ๋˜์–ด ์„ ํƒ์  ํ•„ํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

feature/review/src/main/java/team/retum/review/ui/ReviewFilterScreen.kt (1)

47-66: UI ๊ตฌ์กฐ์™€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ReviewFilter ์ง„์ž…์ ๋ถ€ํ„ฐ ์„ธ๋ถ€ ์„น์…˜๋“ค(Skills, Years, InterviewType, Location)๊นŒ์ง€ ์ž˜ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. FlowRow๋ฅผ ์‚ฌ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ๊ณผ ์ƒ‰์ƒ ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 68-119, 123-373

feature/review/src/main/java/team/retum/review/ui/ReviewDetailsScreen.kt (4)

77-110: ๋ช…์‹œ์  ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋กœ ๊ฐœ์„ ๋œ ๊ตฌ์กฐ

ViewModel ์ƒํƒœ์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ช…์‹œ์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


162-172: ์—ด๊ฑฐํ˜• ๋งคํ•‘ ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋จ

InterviewType๊ณผ InterviewLocation ์—ด๊ฑฐํ˜•์˜ ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ exhaustiveํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์–ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


194-201: ๊น”๋”ํ•œ ์œ„์ž„ ํŒจํ„ด

InterviewReview๊ฐ€ ReviewContent๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


207-207: ๋นˆ ๊ฐ’ ๊ฒ€์ฆ ๋กœ์ง ํ™•์ธ ํ•„์š”

ํ˜„์žฌ !review.answer.isBlank() || !review.question.isBlank() ๋กœ์ง์€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜๋„๊ฐ€ "๋‘˜ ๋‹ค ์กด์žฌํ•ด์•ผ ํ‘œ์‹œ"๋ผ๋ฉด && ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜๋„ํ•œ ๋กœ์ง์ด ๋‹ค์Œ ์ค‘ ์–ด๋А ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”:

  • ํ˜„์žฌ: ์งˆ๋ฌธ ๋˜๋Š” ๋‹ต๋ณ€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ํ‘œ์‹œ
  • ์ œ์•ˆ: ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ‘œ์‹œ (&& ์‚ฌ์šฉ)
// ์ œ์•ˆํ•˜๋Š” ๋ณ€๊ฒฝ
if (!review.answer.isBlank() && !review.question.isBlank()) {
    // show content
}

Comment on lines +22 to +27
companion object {
var code: Long? = null
var year: Int? = null
var interviewType: InterviewType? = null
var location: InterviewLocation? = null
}
Copy link
Contributor

Choose a reason for hiding this comment

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

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

companion object์˜ mutable static state๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

companion object์— var๋กœ ์„ ์–ธ๋œ ํ•„ํ„ฐ ์ƒํƒœ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค:

  • ViewModel ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ƒํƒœ ๊ณต์œ ๋กœ ์ธํ•œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์œ„ํ—˜ (์ •์  ์ฐธ์กฐ๊ฐ€ ๊ณ„์† ์œ ์ง€)
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€๋Šฅ (ํ…Œ์ŠคํŠธ ๊ฐ„ ๊ฒฉ๋ฆฌ ๋ถˆ๊ฐ€)
  • ReviewsFilterState์— ๋™์ผํ•œ ์†์„ฑ์ด ์ด๋ฏธ ์กด์žฌํ•˜์—ฌ ์ค‘๋ณต

๋ชจ๋“  ํ•„ํ„ฐ ์ƒํƒœ๋Š” ReviewsFilterState ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์—ฌ companion object๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”:

-    companion object {
-        var code: Long? = null
-        var year: Int? = null
-        var interviewType: InterviewType? = null
-        var location: InterviewLocation? = null
-    }
-
     init {

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

๐Ÿค– Prompt for AI Agents
In
feature/review/src/main/java/team/retum/review/viewmodel/ReviewFilterViewModel.kt
around lines 22 to 27, remove the companion object that defines mutable static
vars (code, year, interviewType, location) and stop using static state; instead,
add those properties to and manage them via the existing ReviewsFilterState
instance held by the ViewModel (initialize/update/read from the state object,
expose changes via LiveData/StateFlow as appropriate), eliminate any references
to ReviewFilterViewModel.Companion.* across the codebase, and adjust
constructors/usage so each ViewModel instance uses its own ReviewsFilterState to
avoid shared mutable static state.

@Team-return Team-return deleted a comment from coderabbitai bot Nov 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ฉ๋‹ˆ๋‹ค.

Projects

Development

Successfully merging this pull request may close these issues.

๋ฉด์ ‘ํ›„๊ธฐ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง

2 participants