스팀 앱 개발기 #139 - 개발 완료: Main2Activity 클래스를 추가하고 내비게이션 라이브러리 변경
개발 완료: Main2Activity 클래스를 추가하고 내비게이션 라이브러리 변경
No. 139
2026. 02. 17 (화) | Written by @dorian-mobileapp
이번 작업도 오랜 고민을 하고 나서야 시작했습니다. 내비게이션 라이브러리를 Jetpack Navigation에서 Navigation Compose로 변경하는 것이 간단하지 않기 때문입니다. 수작업으로는 단기간에 할 수 있는 게 아니죠. AI의 도움이 필요하다고 판단했습니다. Gemini Code Assistant에게 방법을 문의했고 답변을 참고하여 Main2Activity 클래스를 작성했습니다.
작업 내용
- Main2Activity 클래스 정의
- Jetpack Compose 기반 화면 구성
- Navigation Compose 기반으로 내비게이션 구현
- 지금은 3개 탭 클릭만으로 화면 이동 가능
- 나머지 화면 이동은 단계적으로 구현 예정
다음 예정 작업
- 프로필 화면에서 계정 상세 화면 이동
GitHub Commit
보다 자세한 코드는 아래 commit을 참고하세요.
- Created Main2Activity class to implement navigation with Jetpack Compose (It shows tab screens only)
지난 스팀 앱 개발기
- #138 - 개발 완료: Hilt 라이브러리 활용한 의존성 주입 구현
- #137 - 개발 완료: libs.versions.toml 파일 생성
- #136 - 개발 완료: 사용자 히스토리 화면에서 스팀파워 보상을 SP로 보여주기
- #135 - 개발 완료: 태그 및 포스트 리스트 화면에서 텍스트의 HTML 태그 제거
- #134 - 개발 완료: (1) 태그/포스트 리스트 화면의 포스트 항목에 댓글 개수 보여주기 (2) 댓글 리스트를 Jetpack Compose로 리뉴얼
- #133 - 개발 완료: (1) 검색 버튼 클릭시 키보드 숨기기 (2) 버그 수정: 팔로잉 계정 수 오류
- #132 - 개발 완료: 포스트 이미지 페이저 화면에 XML 대신 Jetpack Compose 적용
- #131 - 개발 완료: 프로필 이미지 화면에 XML 대신 Jetpack Compose 적용
- #130 - 개발 완료: 태그 화면에 XML 대신 Jetpack Compose 적용
- #129 - 개발 완료: 지갑 화면에 XML 대신 Jetpack Compose 적용
- #128 - 개발 완료: 포스트 리스트 화면에 XML 대신 Jetpack Compose 적용
- #127 - 개발 완료: 프로필 화면에 XML 대신 Jetpack Compose 적용
- #126 - 개발 완료: 계정 히스토리 화면에 XML 대신 Jetpack Compose 적용
- #125 - 개발 완료: 댓글 리스트 바텀시트에 XML 대신 Jetpack Compose 적용
- #124 - 개발 완료: 포스트 화면에 XML 대신 Jetpack Compose 적용
- #123 - 개발 완료: 계정 상세 화면
- #122 - 개발 완료: 포스트 화면에서 댓글 리스트 보여주기
- #121 - 개발 완료: 사용자 히스토리 화면에서 항목 클릭시 링크 팝업 띄우기
- #120 - 개발 완료: 사용자 히스토리 화면
- #119 - 개발 완료: Comments, Replies 화면
- #118 - 개발 완료: 포스트(Posts) 화면
- #117 - 개발 완료: 블로그 화면
- #116 - 개발 완료: 프로필 화면
- #115 - 개발: 프로필 화면 구현에 필요한 ProfileViewModel 클래스 개발
- #114 - 수정: 태그 화면의 포스트 리스트 항목 레이아웃 변경
- #113 - 오류 수정: 태그 리스트 로딩 중 다른 화면 이동하면 앱 비정상 종료
- #112 - 포스트 화면에서 보팅 리스트 화면으로 연결
- #111 - 시작 화면 추가
- #110 - 오류 수정: 지갑 화면 시작시 오류 토스트 뜸
- #109 - 개선: 태그 입력하고 검색 버튼 클릭 또는 엔터 키 누르면 키보드 닫기
- #108 - 개선: 태그 검색창에 엔터 키 적용
- #107 - 버그 수정: 태그 화면 복귀시 포스트 리스트 다시 로딩됨
- #106 - 포스트 화면 개발
- #105 - 포스트 화면의 로직 처리를 담당할 PostViewModel 클래스 개발
- #104 - 포스트 내용 읽기 기능을 Repository, Use Case 패턴에 적용
- #103 - 포스트 내용을 읽기 위한 bridge.get_discussion API 연동 코드 작성
- #102 - 포스트 내용을 읽기 위한 bridge.get_discussion API
- #101 - build.gradle에서 라이브러리 이름과 버전 통합
- #1 ~ #100
Layout provided by Steemit Enhancer hommage by ayogom
안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.
안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @dorian-mobileapp님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!
Upvoted! Thank you for supporting witness @jswit.
안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.
!ask 안드로이드에서 Navigation Compose에 대해 소개해 주세요.
안드로이드 Navigation Compose는 Jetpack Compose 환경에서 화면 전환(네비게이션)을 선언적으로 구성할 수 있게 해주는 Jetpack 라이브러리입니다. 기존 View 기반의
NavController + NavHostFragment패턴을 Compose에 맞게 확장한 형태라고 보면 이해가 쉽습니다.---
## 1) 왜 Navigation Compose를 쓰나요?
- Compose와 자연스럽게 결합: 화면을
@Composable로 만들고, 목적지(destination)도 Composable로 등록합니다.- 단일 Activity + 여러 화면 구조에 적합: 화면 전환과 back stack을 표준 방식으로 관리합니다.
- 상태 기반 UI와 궁합: “어떤 화면을 보여줄지”를 네비게이션 상태로 관리할 수 있습니다.
- 딥링크/백스택/인자 전달 등 앱에서 자주 쓰는 패턴을 기본 제공
---
## 2) 기본 구성요소(핵심 개념)
- NavController: 화면 이동을 실행하고 back stack을 관리하는 컨트롤러
- Compose에서는
rememberNavController()로 생성- NavHost: 네비게이션 그래프를 담는 컨테이너(어떤 route들이 있는지 정의)
- composable(route): 각 화면 목적지를 등록하는 DSL
- route / arguments: 목적지 식별자 및 전달값
---
## 3) 가장 기본 예시
kotlin<BR/>@Composable<BR/>fun AppNav() {<BR/> val navController = rememberNavController()<BR/><BR/> NavHost(<BR/> navController = navController,<BR/> startDestination = home<BR/> ) {<BR/> composable(home) {<BR/> HomeScreen(<BR/> onGoDetail = { id -> navController.navigate(detail/$id) }<BR/> )<BR/> }<BR/><BR/> composable(detail/{id}) { backStackEntry -><BR/> val id = backStackEntry.arguments?.getString(id) ?: <BR/> DetailScreen(<BR/> id = id,<BR/> onBack = { navController.popBackStack() }<BR/> )<BR/> }<BR/> }<BR/>}<BR/>---
## 4) 인자(arguments) 전달 방식 (권장 형태)
문자열로 직접 파싱하는 것보다,
navArgument로 타입을 명시하는 방식이 안전합니다.kotlin<BR/>composable(<BR/> route = detail/{id},<BR/> arguments = listOf(navArgument(id) { type = NavType.IntType })<BR/>) { entry -><BR/> val id = entry.arguments?.getInt(id) ?: 0<BR/> DetailScreen(id = id)<BR/>}<BR/>---
## 5) Compose에서 자주 쓰는 네비게이션 패턴
### (1) 뒤로 가기
-
navController.popBackStack()- 또는 특정 화면까지 pop:
popBackStack(route, inclusive = false)### (2) 중복 이동 방지 / 단일 탑(singleTop)
예: 같은 화면을 반복해서 쌓지 않게
kotlin<BR/>navController.navigate(home) {<BR/> launchSingleTop = true<BR/>}<BR/>### (3) 탭(바텀 네비게이션) + 백스택 관리
BottomBar 탭 구조는 각 탭별 back stack/상태 복원이 관건인데, Navigation Compose는
popUpTo,saveState,restoreState조합을 자주 사용합니다.---
## 6) 어떤 때 주의해야 하나요?
- route를 문자열로 관리하면 오타/리팩토링에 취약 → sealed class/객체로 route 상수화 권장
- 화면 간 데이터 전달은 단순 ID 정도만 넘기고, 상세 데이터는 ViewModel/Repository에서 로드하는 방식이 보통 더 안정적
- 큰 앱에서는 중첩 그래프(nested navigation graph), 딥링크, 멀티 모듈 구성 등을 함께 고려해야 합니다.
---
원하시면:
1) BottomNavigation + 여러 스택 유지 예제,
2) 중첩 그래프/인증 플로우(로그인 전/후) 구성,
3) Navigation + Hilt ViewModel 스코프
같은 실전 패턴으로 더 구체적인 샘플도 정리해 드릴게요.
command: !ask is powered by witness @justyy and his contributions are: https://steemyy.com
More commands are coming!.
!ask currently supports:
default=ChatGPT: prefix question with chatgpt, qwen, llama, deepseek, or grok if you like, e.g. !ask deepseek Your Question