3월, 2022의 게시물 표시

Android Koin 적용하기: Compose와 ViewModel 의존성 주입

이 글은 2022년에 작성한 내용을 2026년 기준으로 전면 개정한 글입니다. 기존 URL은 유지하면서 스크린샷 위주의 Koin 3.2 설정 노트를 최신 Android·Compose 환경에서 실행할 수 있는 의존성 주입 가이드로 다시 작성했습니다. Android Koin 적용하기: Compose와 ViewModel 의존성 주입 안드로이드 앱이 커지면 화면마다 필요한 객체를 직접 만들지 않고 외부에서 주입받는 구조가 편해집니다. Koin은 Kotlin 전용 의존성 주입 라이브러리로, 복잡한 애너테이션 처리 없이 DSL로 모듈을 선언하고 런타임에 객체를 제공합니다. 이 글에서는 최신 Android에서 Koin을 설정하고 ViewModel, Jetpack Compose, 테스트까지 한 흐름으로 적용합니다. 2026년 현재 Koin 4.2 계열은 BOM과 컴파일러 플러그인을 권장하고, 안드로이드 프로젝트는 version catalog를 기본 빌드 설정으로 사용합니다. 2022년 원문이 다루던 Gradle 파일 형식 변경 문제는 더 이상 별개의 이슈가 아니며, 최신 권장 구조에서 처음부터 설정하는 방법을 다룹니다. 먼저 보는 핵심 Koin BOM으로 라이브러리 버전을 맞추고, Repository는 singleOf , ViewModel은 viewModelOf 로 선언합니다. Compose에서는 koinViewModel() 로 ViewModel을 받고 collectAsStateWithLifecycle() 로 상태를 수집하는 흐름이 기본입니다. 핵심 질문 이 글의 답 최신 Android에서 Koin은 어떻게 추가하나? version catalog에 Koin BOM과 아티팩트를 선언 ViewModel은 어떻게 주입하나? koinViewModel() 로 Compose에서, by viewModel() 로 Activity/Fragment에서 Compose 화면에 의존성을 어떻게 넣나? koinInject() 또는 ViewMod...

Socket.IO 채팅 만들기 2편: Android 인증, 방 입장과 메시지 복구

이 글은 2022년에 작성한 Android Socket.IO 채팅 예제를 현재 구조에 맞춰 전면 개정한 글입니다. 기존 URL과 post ID는 유지합니다. 1편에서 Node.js 서버와 기본 이벤트를 연결했다면, 2편에서는 실제 앱에 필요한 인증, 채팅방, 메시지 확인 응답과 재연결을 다룹니다. 단순히 socket.connect() 가 성공했다고 채팅 기능이 완성되는 것은 아닙니다. 모바일 네트워크는 Wi-Fi와 LTE 사이를 이동하고, 앱은 백그라운드로 내려가며, 연결이 끊긴 동안 메시지가 발생할 수 있습니다. 먼저 보는 핵심 토큰은 연결 시 auth 로 전달하고 서버 미들웨어에서 검증합니다. 방 입장은 서버가 권한을 확인한 뒤 join() 하며, 중요한 메시지는 ACK와 데이터베이스 ID를 사용합니다. 재연결은 전송 보장이 아니라 복구를 시작하는 신호입니다. 서버와 Android 클라이언트 버전 맞추기 Android에서 널리 쓰는 Java 클라이언트 io.socket:socket.io-client:2.1.1 은 Socket.IO 서버 3.x와 4.x에 대응합니다. 공식 Java 클라이언트 호환성 표 를 먼저 확인하세요. kotlin dependencies { implementation ( "io.socket:socket.io-client:2.1.1" ) { exclude ( group = "org.json" , module = "json" ) } } Android가 제공하는 org.json 과 중복되지 않도록 제외합니다. Manifest에는 인터넷 권한이 필요합니다. xml <uses-permission android:name= "android.permission.INTERNET" /> 개발 중인 로컬 HTTP 서버에 접속하려고 usesCleartextTraffic="true...

Android RecyclerView 여러 아이템 타입 구현: sealed class와 ViewBinding

이 글은 2022년에 작성한 RecyclerView 다중 아이템 예제를 현재 Android 개발 방식에 맞춰 전면 개정한 글입니다. 기존 URL과 주제는 유지하면서 스크린샷 대신 복사해 적용할 수 있는 Kotlin 코드, ListAdapter , DiffUtil , ViewBinding을 사용합니다. 채팅 목록에는 내가 보낸 메시지와 상대방 메시지가 서로 다른 모양으로 나타납니다. 피드에는 본문뿐 아니라 날짜 구분선, 광고, 로딩 상태가 함께 들어갑니다. 이렇게 하나의 RecyclerView 에 여러 레이아웃을 표시하려면 데이터의 종류와 화면의 종류를 명확히 연결해야 합니다. 핵심은 세 가지입니다. sealed interface 로 화면에 나타날 데이터 종류를 제한한다. getItemViewType() 에서 각 데이터 종류를 정수 타입으로 변환한다. onCreateViewHolder() 와 onBindViewHolder() 에서 같은 규칙을 사용한다. 먼저 보는 핵심 데이터 타입을 기준으로 ViewHolder를 선택하고, ViewBinding으로 각 레이아웃을 안전하게 참조합니다. 목록 갱신은 notifyDataSetChanged() 대신 ListAdapter 와 DiffUtil 에 맡깁니다. 질문 답 여러 레이아웃은 어디서 구분하나? getItemViewType() 레이아웃은 언제 생성하나? onCreateViewHolder() 데이터는 언제 표시하나? onBindViewHolder() 목록 변경은 어떻게 계산하나? ListAdapter 와 DiffUtil.ItemCallback 클릭 시 position을 저장해도 되나? 저장하지 말고 현재 바인딩한 item을 전달 완성할 예제 예제 목록에는 다음 세 종류의 행이 들어갑니다. 날짜를 표시하는 헤더 내가 보낸 메시지 상대방이 보낸 메시지 데이터가 isMine: Boolean 같은 플래그 하나에 의존하도록 만들 수...