[Android] XML + MVI - Compose 전환을 위한 아키텍처 준비
·
Mobile/Android
왜 XML에서 MVI를 쓰는가많은 팀이 Compose로 전환을 계획하지만, 기존 XML 코드베이스를 하루아침에 바꿀 수는 없다.이럴 때 MVI를 미리 도입하면 두 가지 이점이 있다. 첫째, 아키텍처를 먼저 정비할 수 있다. 화면 로직이 ViewModel에 집중되고 UI는 상태를 그리는 역할만 하게 된다.둘째, Compose 전환 비용이 크게 줄어든다. ViewModel, State, Action, SideEffect는 그대로 유지하고, XML 렌더링 코드만 Composable로 교체하면 된다. 이 글의 목표는 두 번째 효과를 코드 레벨에서 정량적으로 보여주는 것이다. 그 전에 먼저 XML 환경에서 MVI를 어떻게 구현하는지 정리한다.MVI 3요소 — XML 맥락에서 다시 보기MVI는 화면 상태를 세 가지..
문서가 쌓일수록 AI가 똑똑해진다 - Android 프로젝트 하네스 엔지니어링 적용기
·
개발 이야기
이 글은 운영 중인 Android 학습 서비스 프로젝트에 AI 기반 개발 워크플로우를 도입하면서 겪은 시행착오와 그 해결 과정을 기록한 것이다. 개발자뿐 아니라 AI 도구에 관심 있는 모든 분을 위해 썼다. 시작 - AI가 매번 다른 코드를 만들었다팀에 AI 코딩 도구를 처음 도입했을 때 기대는 단순했다.반복적인 작업을 줄이고, 정해진 패턴의 구현 속도를 높이는 것.초반 몇 번은 실제로 만족스러웠다.코드가 빠르게 나왔고, 팀 구조와 어느 정도 맞았다. 그런데 같은 요청을 다시 하면 이전과 구조가 달라졌다.어제는 이 방식으로 만들었던 코드가 오늘은 다른 방식으로 나왔다.팀원이 같은 도구를 써도 각자 다른 결과물이 나왔다.신규 입사자가 AI에게 "이 화면 만들어줘"라고 요청하면, 팀이 1년 동안 만들어온 컨..
[Kotlin] Mutex로 한 번에 하나만 - 선조회와 보장 조회로 사용자 경험 살리기
·
Language/Kotlin
로딩이 3초면 사용자는 떠난다현재 진행 중인 프로젝트의 북마크 화면에서 시간을 탭하면 강의 화면으로 이동한다.이때 강의 화면에는 강의 목록도 함께 표시해야 하므로, 이전 화면에서 Intent를 통해 데이터를 넘겨줘야 했다. 문제는 강의 목록이 600건 이상인 경우였다.API 응답을 기다리는 동안 사용자는 로딩 화면만 몇 초씩 바라봐야 했고, 이 경험은 "느린 앱"이라는 인상을 남기기에 충분했다. 해결 방향은 단순했다.사용자가 버튼을 누르기 전에 미리 데이터를 불러와 두자. 하지만 "미리 불러오기"와 "버튼을 눌렀을 때 불러오기"가 동시에 일어나면 어떻게 될까?이 글은 그 동시성 문제를 Mutex, 선조회(prefetch), 보장 조회(ensure) 세 가지 도구로 풀어낸 이야기다. 1. 코루틴이니까 괜..
[Android] Serializable / Parcelable
·
Mobile/Android
왜 직렬화가 필요한가컴포넌트 간 데이터 전달안드로이드는 Activity, Fragment 같은 컴포넌트 단위로 동작한다.화면 이동 시 객체 데이터를 함께 전달해야 하는 상황이 빈번한데, 컴포넌트 간 통신은 Intent나 Bundle을 통해 이루어진다.문제는 Bundle이 객체의 참조를 저장하는 것이 아니라, 재생성에 필요한 데이터만 저장한다는 점이다.data class User( val name: String, val age: Int)val intent = Intent(this, DetailActivity::class.java)intent.putExtra("user", userObject) // 컴파일 에러 — User가 직렬화 불가능data class User( val name: String, val ..
[Android] Intent / Bundle
·
Mobile/Android
왜 필요한가안드로이드 컴포넌트는 서로 직접 호출할 수 없다안드로이드에서 화면을 이동하거나 서비스를 실행할 때, 우리가 직접 new DetailActivity()처럼 생성자를 호출하지 않는다.val intent = Intent(this, DetailActivity::class.java)startActivity(intent)Activity, Service, BroadcastReceiver 같은 컴포넌트는 시스템이 생성하고 관리한다. 우리는 시스템에 "이 컴포넌트를 실행해줘"라고 요청만 하는 것이고, 그 요청서 역할을 하는 게 Intent이다.데이터도 함께 전달해야 한다화면을 이동할 때 단순히 "저 화면 열어줘"로 끝나지 않는 경우가 많다. 목록에서 아이템을 눌러 상세 화면으로 갈 때, 어떤 아이템인지 데이터..
[Android] MVI - SideEffect: Channel vs SharedFlow
·
Mobile/Android
1. SideEffectMVI(Model-View-Intent) 패턴은 UI를 단일 방향 데이터 흐름으로 설명한다.Action → ViewModel → State → UI State는 UI가 "지금 어떻게 생겼는가"를 기술하는 불변 스냅샷이다.data class LoginState( val email: String = "", val password: String = "", val isLoading: Boolean = false, val errorMessage: String? = null)그런데 어떤 이벤트들은 State로 표현하는 것이 어색하다.로그인 성공 → 홈 화면으로 이동삭제 완료 → 스낵바 표시네트워크 오류 → 토스트 표시이것들의 공통점은 "딱 한 번 발생하고 사라지는" 이벤..