Skip to content

Conversation

@s9hn
Copy link
Member

@s9hn s9hn commented Jan 11, 2026

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 기존 피드 XML -> Feed 모듈로 분리 및 Compose 마이그레이션 진행했슨
  • UI도 새롭게 개편되었슨

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 새로운 피드 기능 모듈 추가 (탭 기반 피드 및 내 활동 보기 포함)
    • 피드 필터링 기능 추가 (장르, 공개 여부 선택 가능)
    • 사용자 프로필 조회 API 추가
    • S3 이미지 자동 로딩 및 밀도 인식 URL 처리
  • Refactor

    • 피드 화면을 Compose 기반으로 마이그레이션
    • 레거시 Fragment 기반 구현 제거
    • 피드 저장소 캐싱 메커니즘 개선
  • Chores

    • 새로운 UI 리소스 및 색상 팔레트 추가
    • 불변 컬렉션 라이브러리 의존성 추가

✏️ Tip: You can customize this high-level summary in your review settings.

@s9hn s9hn changed the title Feat/768 refactor: 피드 Compose 마이그레이션 Jan 11, 2026
@github-actions github-actions bot requested a review from m6z1 January 11, 2026 08:04
@coderabbitai
Copy link

coderabbitai bot commented Jan 11, 2026

Caution

Review failed

The pull request is closed.

개요

피드 화면을 View 기반에서 Jetpack Compose 기반으로 전환하고, 피드 관련 기능을 데이터/도메인/피처 모듈로 분리하는 대규모 리팩토링입니다. 네트워크 API 및 데이터 모델을 확장하고, 새로운 UI 컴포넌트와 디자인 시스템 요소를 추가합니다.

변경사항

응집력 / 파일(들) 변경 요약
피드 UI 마이그레이션
app/src/main/java/com/into/websoso/ui/main/feed/FeedFragment.kt, app/src/main/res/layout/fragment_feed.xml
FeedFragment를 View 기반에서 Compose 기반 FeedRoute로 완전 재작성. 레이아웃 XML 단순화 및 생명주기 관리 개선
피드 ViewModel 제거 및 재구성
app/src/main/java/com/into/websoso/ui/main/feed/FeedViewModel.kt, app/src/main/java/com/into/websoso/ui/main/feed/model/Category.kt, app/src/main/java/com/into/websoso/ui/main/feed/model/CategoryModel.kt, app/src/main/java/com/into/websoso/ui/main/feed/model/FeedUiState.kt
기존 ViewModel 및 카테고리 모델 제거. 새로운 feature 모듈의 FeedViewModel로 대체
피드 액티비티 UX 개선
app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt, app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt, app/src/main/java/com/into/websoso/ui/otherUserPage/OtherUserPageActivity.kt
액티비티 결과 반환에서 Snackbar 기반 피드백으로 변경
네트워크 계층 확장
core/network/src/main/java/com/into/websoso/core/network/datasource/feed/FeedApi.kt, core/network/src/main/java/com/into/websoso/core/network/datasource/feed/model/response/*, core/network/src/main/java/com/into/websoso/core/network/datasource/user/UserApi.kt, core/network/src/main/java/com/into/websoso/core/network/datasource/user/model/*
FeedApi에서 다중 CRUD 엔드포인트 제거 및 쿼리 파라미터 추가. UserApi에 프로필 조회 엔드포인트 추가. DTO에 genreName, rating 필드 추가
데이터 계층 리팩토링
data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt, data/feed/src/main/java/com/into/websoso/data/feed/model/FeedEntity.kt, data/user/src/main/java/com/into/websoso/user/UserRepository.kt, core/datastore/src/main/java/com/into/websoso/core/datastore/datasource/user/DefaultAccountDataSource.kt
FeedRepository의 의존성 단순화 및 내부 캐싱 추가. 사용자 정보 모델 확장 (nickname, gender 필드 추가)
도메인 계층 재구성
domain/feed/src/main/java/com/into/websoso/feed/GetFeedsUseCase.kt, domain/feed/src/main/java/com/into/websoso/feed/GetMyFeedsUseCase.kt, domain/feed/src/main/java/com/into/websoso/feed/mapper/FeedMapper.kt, domain/feed/src/main/java/com/into/websoso/feed/model/Feed.kt, domain/feed/src/main/java/com/into/websoso/feed/model/UserFeeds.kt
GetMyFeedsUseCase 신규 추가. GetFeedsUseCase 시그니처 변경 (Category 제거, feedsOption 매개변수 도입). Feed 모델에 rating 필드 추가. UserFeeds 데이터 구조 신규 정의
Compose 피처 모듈 신규 생성
feature/feed/ (전체 디렉토리)
새로운 feature.feed 모듈 추가: FeedRoute, FeedScreen, FeedViewModel, FeedUiState, 필터 컴포넌트, 모델 클래스 (FeedTab, FeedOrder, NovelCategory, MyFeedFilter, SosoFeedType, FeedUiModel) 및 UI 컴포넌트 (FeedSection, FeedEmptyCase, FeedFilterChip, FeedMoreMenu, MyFeedFilterModal)
디자인 시스템 확장
core/designsystem/src/main/java/com/into/websoso/core/designsystem/theme/Color.kt, core/designsystem/src/main/java/com/into/websoso/core/designsystem/theme/WebsosoTypography.kt, core/designsystem/src/main/java/com/into/websoso/core/designsystem/component/NetworkImage.kt
피드 관련 색상 팔레트 추가 (18개 새로운 색상). title4 타이포그래피 추가. S3Image Compose 컴포넌트 및 rememberS3Url 헬퍼 신규 추가
유틸리티 및 리소스 확장
app/src/main/java/com/into/websoso/core/common/util/ExtentionFuction.kt, core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.kt, core/common/src/main/java/com/into/websoso/core/common/extensions/Extensions.kt, build-logic/src/main/kotlin/websoso.android.compose.gradle.kts
Context.getS3ImageUrl 확장 함수 추가. debouncedClickable Compose 수정자 추가. nullable 타입 확장 (orDefault) 추가. 빌드 설정에 kotlinx-collections-immutable 의존성 추가
드로어블 리소스 신규 추가
core/resource/src/main/res/drawable/ic_*.xml (9개 파일)
ic_drop_down_fill, ic_hot, ic_lock, ic_novel_unselected, ic_pencil_sm, ic_switch, ic_unvisible, ic_visible 벡터 드로어블 신규 추가
모듈 의존성 및 빌드 설정
app/build.gradle.kts, domain/feed/build.gradle.kts, data/feed/build.gradle.kts, feature/feed/build.gradle.kts, gradle/libs.versions.toml, settings.gradle.kts
data.feed, domain.feed, feature.feed 모듈 의존성 추가. feature:feed 모듈 활성화. kotlinx-collections-immutable 라이브러리 버전 정의

예상 코드 리뷰 소요시간

🎯 4 (복잡함) | ⏱️ ~60분

설명: 이 PR은 매우 광범위한 변경사항을 포함합니다. UI 계층의 대규모 마이그레이션(FeedFragment 전체 재작성), 아키텍처 계층 전반의 리팩토링(네트워크, 데이터, 도메인 모듈 분리), 새로운 feature 모듈 추가, 그리고 25개 이상의 새로운 Compose 컴포넌트 및 모델 추가가 포함되어 있습니다. 변경사항이 매우 이질적이며(UI, 데이터 계층, 모듈 구조, 디자인 시스템 등 다양한 영역), 각 영역에 대한 별도의 검토 논리가 필요합니다. 특히 피드백 메커니즘 변경, 캐싱 전략, API 서명 변경, 그리고 새로운 ViewModel 구현에 주의가 필요합니다.

관련된 가능성 있는 PR들

제안된 레이블

🍯 [FEAT], 🏹 궁사 명지

제안된 리뷰어

  • m6z1

🐰 Compose로 재탄생한 피드,
모듈 분리하여 정리하고,
새로운 S3 이미지 입히며,
유저 정보 풍부해지고,
멋진 색상 팔레트도 얻네! ✨

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b6164cb and 908531c.

📒 Files selected for processing (71)
  • app/build.gradle.kts
  • app/src/main/java/com/into/websoso/core/common/util/ExtentionFuction.kt
  • app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt
  • app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt
  • app/src/main/java/com/into/websoso/ui/main/feed/FeedFragment.kt
  • app/src/main/java/com/into/websoso/ui/main/feed/FeedViewModel.kt
  • app/src/main/java/com/into/websoso/ui/main/feed/model/Category.kt
  • app/src/main/java/com/into/websoso/ui/main/feed/model/CategoryModel.kt
  • app/src/main/java/com/into/websoso/ui/main/feed/model/FeedUiState.kt
  • app/src/main/java/com/into/websoso/ui/otherUserPage/OtherUserPageActivity.kt
  • app/src/main/res/layout/fragment_feed.xml
  • build-logic/src/main/kotlin/websoso.android.compose.gradle.kts
  • core/common/src/main/java/com/into/websoso/core/common/extensions/ComposeExtension.kt
  • core/common/src/main/java/com/into/websoso/core/common/extensions/Extensions.kt
  • core/datastore/src/main/java/com/into/websoso/core/datastore/datasource/user/DefaultAccountDataSource.kt
  • core/datastore/src/main/java/com/into/websoso/core/datastore/di/DataStoreModule.kt
  • core/designsystem/build.gradle.kts
  • core/designsystem/src/main/java/com/into/websoso/core/designsystem/component/NetworkImage.kt
  • core/designsystem/src/main/java/com/into/websoso/core/designsystem/theme/Color.kt
  • core/designsystem/src/main/java/com/into/websoso/core/designsystem/theme/WebsosoTypography.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/feed/FeedApi.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/feed/model/response/FeedDetailResponseDto.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/feed/model/response/FeedResponseDto.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/user/UserApi.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/user/model/MyProfileResponseDto.kt
  • core/network/src/main/java/com/into/websoso/core/network/datasource/user/model/UserFeedsResponseDto.kt
  • core/resource/src/main/res/drawable/ic_drop_down_fill.xml
  • core/resource/src/main/res/drawable/ic_hot.xml
  • core/resource/src/main/res/drawable/ic_lock.xml
  • core/resource/src/main/res/drawable/ic_novel_unselected.xml
  • core/resource/src/main/res/drawable/ic_pencil_sm.xml
  • core/resource/src/main/res/drawable/ic_switch.xml
  • core/resource/src/main/res/drawable/ic_unvisible.xml
  • core/resource/src/main/res/drawable/ic_visible.xml
  • data/feed/build.gradle.kts
  • data/feed/src/main/java/com/into/websoso/data/feed/mapper/FeedMapper.kt
  • data/feed/src/main/java/com/into/websoso/data/feed/model/FeedEntity.kt
  • data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt
  • data/user/src/main/java/com/into/websoso/user/UserRepository.kt
  • data/user/src/main/java/com/into/websoso/user/datasource/UserLocalDataSource.kt
  • data/user/src/main/java/com/into/websoso/user/mapper/UserMapper.kt
  • data/user/src/main/java/com/into/websoso/user/model/MyProfileEntity.kt
  • data/user/src/main/java/com/into/websoso/user/model/UserFeedsEntity.kt
  • domain/feed/build.gradle.kts
  • domain/feed/src/main/java/com/into/websoso/feed/GetFeedsUseCase.kt
  • domain/feed/src/main/java/com/into/websoso/feed/GetMyFeedsUseCase.kt
  • domain/feed/src/main/java/com/into/websoso/feed/mapper/FeedMapper.kt
  • domain/feed/src/main/java/com/into/websoso/feed/model/Feed.kt
  • domain/feed/src/main/java/com/into/websoso/feed/model/UserFeeds.kt
  • feature/feed/.gitignore
  • feature/feed/build.gradle.kts
  • feature/feed/consumer-rules.pro
  • feature/feed/proguard-rules.pro
  • feature/feed/src/main/AndroidManifest.xml
  • feature/feed/src/main/java/com/into/websoso/feature/feed/FeedRoute.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/FeedScreen.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/FeedUiState.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/FeedViewModel.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/component/FeedEmptyCase.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/component/FeedFilterChip.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/component/FeedMoreMenu.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/component/FeedSection.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/component/MyFeedFilterModal.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/FeedOrder.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/FeedTab.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/FeedUiModel.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/MyFeedFilter.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/NovelCategory.kt
  • feature/feed/src/main/java/com/into/websoso/feature/feed/model/SosoFeedType.kt
  • gradle/libs.versions.toml
  • settings.gradle.kts

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

❤️ Share

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

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

ktlint

🚫 [ktlint] standard:blank-line-between-when-conditions reported by reviewdog 🐶
Add a blank line between all when-conditions in case at least one multiline when-condition is found in the statement

FeedTab.SOSO_FEED -> if (state.sosoCategory == SosoFeedType.ALL) {


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

val targetFeed = uiState.value.currentData.feeds.find { it.id == selectedFeedId } ?: return


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

val updatedFeeds = state.currentData.feeds.map { feed ->


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

val updatedFeeds = state.currentData.feeds.map { feed ->


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

state.currentData.feeds.filter { it.id != feedId }.toImmutableList()


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

state.currentData.feeds.filter { it.id != feedId }.toImmutableList()


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

val targetFeed = uiState.value.currentData.feeds.find { it.id == feedId } ?: return


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

state.currentData.feeds.filter { it.id != feedId }.toImmutableList()


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

state.currentData.feeds.filter { it.id != feedId }.toImmutableList()


🚫 [ktlint] standard:no-consecutive-blank-lines reported by reviewdog 🐶
Needless blank line(s)


🚫 [ktlint] standard:function-signature reported by reviewdog 🐶
No whitespace expected between opening parenthesis and first parameter name


🚫 [ktlint] standard:function-signature reported by reviewdog 🐶
No whitespace expected between last parameter and closing parenthesis


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline

val contents = if (isMyFeed) persistentListOf("수정하기", "삭제하기")


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }

val contents = if (isMyFeed) persistentListOf("수정하기", "삭제하기")


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline

else persistentListOf("스포일러 신고", "부적절한 표현 신고")


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }

else persistentListOf("스포일러 신고", "부적절한 표현 신고")


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Unexpected newline before '.'


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline

val next = if (isSelected) selectedCategories - category


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }

val next = if (isSelected) selectedCategories - category


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }


🚫 [ktlint] standard:class-signature reported by reviewdog 🐶
Newline expected after opening parenthesis


🚫 [ktlint] standard:class-signature reported by reviewdog 🐶
Newline expected before closing parenthesis


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline


🚫 [ktlint] standard:if-else-bracing reported by reviewdog 🐶
All branches of the if statement should be wrapped between braces if at least one branch is wrapped between braces


🚫 [ktlint] standard:if-else-wrapping reported by reviewdog 🐶
Expected a newline


🚫 [ktlint] standard:multiline-if-else reported by reviewdog 🐶
Missing { ... }


🚫 [ktlint] standard:function-expression-body reported by reviewdog 🐶
Function body should be replaced with body expression


🚫 [ktlint] standard:class-signature reported by reviewdog 🐶
Newline expected after opening parenthesis


🚫 [ktlint] standard:class-signature reported by reviewdog 🐶
Newline expected before closing parenthesis

CreateFeed.RESULT_OK,
OtherUserProfileBack.RESULT_OK,
-> {
-> {

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:indent reported by reviewdog 🐶
Unexpected indentation (24) (should be 20)

onFirstItemClick = { feedId, isMyFeed ->
when (isMyFeed) {
true -> navigateToFeedEdit(feedId)
false -> showDialog<DialogReportPopupMenuBinding>(

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:blank-line-between-when-conditions reported by reviewdog 🐶
Add a blank line between all when-conditions in case at least one multiline when-condition is found in the statement

@@ -0,0 +1,39 @@
package com.into.websoso.core.common.extensions

/**

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:kdoc reported by reviewdog 🐶
A dangling toplevel KDoc is not allowed

debounceTime: Long = 500L,
enabled: Boolean = true,
onClick: () -> Unit,
): Modifier = composed {

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:function-signature reported by reviewdog 🐶
Newline expected before expression body

package com.into.websoso.core.common.extensions

fun Float?.orDefault(defaultValue: Float = 0f) = this ?: defaultValue
fun Long?.orDefault(defaultValue: Long = 0L) = this ?: defaultValue

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:blank-line-before-declaration reported by reviewdog 🐶
Expected a blank line for this declaration

private val getMyFeedsUseCase: GetMyFeedsUseCase,
private val feedRepository: FeedRepository,
) : ViewModel() {

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:no-empty-first-line-in-class-body reported by reviewdog 🐶
Class body should not start with blank line

*/
fun updateTab(tab: FeedTab) {
_uiState.update { it.copy(selectedTab = tab) }
if (uiState.value.currentData.feeds.isEmpty()) fetchNextPage()

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'


Log.d("123123 카테고리", category.toString())
_uiState.update { it.copy(sosoCategory = category) }
if (uiState.value.currentData.feeds.isEmpty()) fetchNextPage()

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

runCatching {
when (state.selectedTab) {
FeedTab.MY_FEED -> getMyFeedsUseCase(lastFeedId = lastFeedId)
FeedTab.SOSO_FEED -> getFeedsUseCase(

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:blank-line-between-when-conditions reported by reviewdog 🐶
Add a blank line between all when-conditions in case at least one multiline when-condition is found in the statement

lastId = result.feeds.lastOrNull()?.id ?: 0,
isLoadable = result.isLoadable,
)
currentState.updateCurrentSource(updatedData = updatedSource)

Choose a reason for hiding this comment

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

🚫 [ktlint] standard:chain-method-continuation reported by reviewdog 🐶
Expected newline before '.'

Copy link
Member

@m6z1 m6z1 left a comment

Choose a reason for hiding this comment

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

고생하셨슨 ~~~! 퇴근!

@s9hn s9hn merged commit 9bbc289 into develop Jan 11, 2026
1 of 3 checks passed
@s9hn s9hn deleted the feat/768 branch January 11, 2026 08:05
@s9hn s9hn restored the feat/768 branch January 21, 2026 12:14
@s9hn s9hn deleted the feat/768 branch January 21, 2026 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: 피드 Compose 마이그레이션

3 participants