Skip to content

feat: 7주차 미션_제로#53

Open
jeongkyueun wants to merge 5 commits into
mainfrom
zero-m7
Open

feat: 7주차 미션_제로#53
jeongkyueun wants to merge 5 commits into
mainfrom
zero-m7

Conversation

@jeongkyueun
Copy link
Copy Markdown
Collaborator

@jeongkyueun jeongkyueun commented May 13, 2026

📌 feat: 7주차 미션_제로

🔗 관련 이슈

Closes #48

✨ 변경 사항

기존 XML 기반의 UI 구조를 Compose로 마이그레이션하고, Figma에 맞춘 UI와 내비게이션 로직을 구축했습니다.

주요 구현 사항

1. 기본 UI 및 하단 탭 내비게이션 구조 구축

  • Scaffold 기반 앱 구조 설계

    • 전체 화면 구조를 Scaffold로 구성하여 상단/하단 영역을 일관되게 관리했습니다.
  • BottomBar 구현 (NavigationBar 사용)

    • Figma 디자인을 기반으로 하단 탭 UI를 구현했습니다.
    • 아이콘 + 텍스트 조합의 네비게이션 구조 구현
    • 선택 상태 인디케이터를 투명 처리 (indicatorColor = Color.Transparent)
    • 상단 그림자 효과(Figma: 0px -4px 20px 0px #00000008)를 drawBehind기반으로 구현했습니다.
  • BottomNavItem 기반 구조 설계

    • 하단 탭 아이템을 BottomNavItem으로 분리하여 유지보수성을 높였습니다.
    • NavHost와 연동하여 각 탭별 화면 라우팅 구조를 구성했습니다.

2. 화면 UI 구현 (Screens.kt)

Figma 디자인 기반으로 각 화면 UI를 Compose로 구현했습니다.

홈 화면

  • "Discover"타이틀
  • 날짜 정보 표시
  • 메인 이미지 중심 레이아웃 구성

구매하기 화면

  • 상단 카테고리 탭 구현 (전체, TOPS & T-SHIRTS 등)
  • 활성 탭 상태 인디케이터 적용

위시리스트 화면

  • "위시리스트" 타이틀 및 기본 레이아웃 구성

장바구니 화면

  • 비어 있는 상태 UI (empty state 이미지 + 안내 문구)
  • 하단 고정 "주문하기" 버튼 구현

프로필 화면

  • 중앙 정렬된 "Profile Fragment" 텍스트 배치

3. Navigation 구조 및 화면 전환 로직

  • navigation-compose 기반 NavHost환경을 구축하여 5개 주요 화면을 연결했습니다.

  • 장바구니 → 구매하기 이동 기능 구현

    • CartScreen의 "주문하기" 버튼 클릭 시 콜백 실행
    • navController.navigate(BottomNavItem.Shop.screenRoute)로 화면 이동 처리
  • 하단 탭 상태 동기화 처리

    • popUpTo
    • saveState
    • restoreState

    옵션을 활용하여 화면 상태와 탭 선택 상태를 일관되게 유지했습니다.

4. 디자인 디테일 및 환경 설정

  • 시스템 테마(Dynamic Color)의 영향을 제거하기 위해 dynamicColor = false를 적용했습니다.
  • 앱 전체 배경색을 #FFFFFF로 고정하여 디자인 일관성을 유지했습니다.

적용 파일

  • app/src/main/java/com/example/week7/MainActivity.kt

    • 메인 액티비티 및 NavHost / BottomBar 로직 구현
  • app/src/main/java/com/example/week7/ui/BottomNavItem.kt

    • 하단 네비게이션 아이템 정의
  • app/src/main/java/com/example/week7/ui/Screens.kt

    • 각 탭별 화면 UI 구현

🔍 테스트

  • 테스트 완료
  • 에러 없음

📸 스크린샷 (선택)

구매하기 위시리스트 장바구니 프로필
image image image image image

🚨 추가 이슈

@jeongkyueun jeongkyueun changed the title Zero m7 feat: 7주차 제로 May 13, 2026
@jeongkyueun jeongkyueun changed the title feat: 7주차 제로 feat: 7주차 미션_제로 May 13, 2026
@jeongkyueun jeongkyueun self-assigned this May 17, 2026
@jeongkyueun jeongkyueun added the enhancement New feature or request label May 17, 2026
Copy link
Copy Markdown
Collaborator

@kimdoyeon1234 kimdoyeon1234 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!
NavController + NavHost 구조를 올바르게 이해하고 사용한 점, CartScreen에서 onOrderClick을 람다로 받아서 Events Flow Up 패턴을 잘 적용한 점 좋았어요

다만 이번 미션의 핵심인 Type-safe Navigation이 아직 적용되지 않았어요!
현재 "home", "shop" 같은 문자열로 Route를 관리하고 있는데, @serializable + data object 방식으로 바꿔주세요 :)

// 현재
sealed class BottomNavItem(val screenRoute: String)
composable(BottomNavItem.Home.screenRoute) { ... }

->

@Serializable sealed interface Screen {
    @Serializable data object Home : Screen
    ...
}
composable<Screen.Home> { HomeScreen() }

그리고 현재 Screens.kt 하나에 모든 화면이 들어있어요!
화면마다 파일을 분리해주시면 더 좋을 것 같아요 :)

Type-safe Navigation만 적용해주시면 완성도가 훨씬 올라갈 거예요! 화이팅 !

Comment on lines +10 to +14
object Home : BottomNavItem("홈", R.drawable.ic_housesimple, "home")
object Shop : BottomNavItem("구매하기", R.drawable.ic_listmagnifyingglass, "shop")
object Wishlist : BottomNavItem("위시리스트", R.drawable.ic_heartstraight, "wishlist")
object Cart : BottomNavItem("장바구니", R.drawable.ic_bagsimple, "cart")
object Profile : BottomNavItem("프로필", R.drawable.ic_user, "profile")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

문자열 기반 Route("home", "shop" ...)를 사용하고 있어요!
이번 미션의 핵심인 Type-safe Navigation으로 바꿔주세요 :)

@serializable
sealed interface Screen {
@serializable data object Home : Screen
@serializable data object Shop : Screen
...
}

Comment on lines +127 to +129
composable(BottomNavItem.Home.screenRoute) {
HomeScreen()
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

문자열로 composable을 등록하고 있어요!
Type-safe Navigation 적용 시 아래처럼 바꿔는것도 좋을거 같습니다!

composable<Screen.Home> { HomeScreen() }

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

HomeScreen, ShopScreen, WishlistScreen, CartScreen, ProfileScreen이 Screens.kt 하나에 모두 들어있어요!
화면마다 파일을 분리해주세요 :)

ui/home/HomeScreen.kt
ui/shop/ShopScreen.kt
ui/wishlist/WishlistScreen.kt
ui/cart/CartScreen.kt
ui/profile/ProfileScreen.kt

}

@Composable
fun ShopScreen() {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

나중에 해야 하는 건지는 모르겠지만, 상단탭을 미리 구현해보는 것도 좋을 것 같아요!


fun fetchUserProfile(userId: Int) {
viewModelScope.launch {
try {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

try-catch 구조를 사용해서 예외상황에 날 수 있는 에러까지 잡을 수 있는 구조를 만든것이 좋은 것 같습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 7주차 미션_제로

4 participants