반응형

전체 글 43

MVI vs Android App Architecture

Compose를 사용하면서 MVI가 Compose와 아주 찰떡이라는 이야기를 듣고 MVI를 학습하면서 사용해봤다. 그렇다면 구글 권장 아키텍쳐와 MVI의 차이가 무엇일까? 비교해보자 MVI 란?MVI (Model - View - Intent) 는 UI 상태를 단일 상태(SSOT, Single Source of Truth) 로 관리하고,UI 이벤트를 “Intent → Reducer(copy) → State” 흐름으로 처리하는 아키텍처 패턴입니다. Intent사용자가 UI에서 수행하는 액션 (ex. 버튼 클릭, 텍스트 입력 등)Reducer이전 상태(State)를 기반으로 copy() 를 사용해 새로운 상태를 만드는 순수 함수StateUI를 구성하는 불변 데이터 모델 MVI가 강조하는 철학Immutable..

Android 2025.11.06

Navigation3 알아보기

2018년에 나온 Navigation2의 경우 Android UI 환경이 변화하면서 새로운 접근 방식의 필요성을 인식하게 되었고 이에 새로운 라이브러리인 Navigation3가 출시 되었다. Navigation 개념들을 다시한번 복습하면서 Navigation2의 한계와 Navigation3의 특징들을 살펴보자.0. Navigation 기본 개념더보기더보기Navigation은 화면 간 이동(전환)과 백스택 관리를 단순화하기 위한 Android Jetpack 라이브러리입니다.기존 FragmentTransaction을 직접 다루던 복잡한 코드를 선언형 방식으로 바꿔줍니다.Navigation 핵심 원칙사용자가 앱과 상호작용할 때, 언제나 예측 가능하고 일관된 이동 경험을 제공하는 것이 핵심 목표입니다.앱에는 항..

Android 2025.10.21

Android Build-logic & Version Catalog

Gradle 빌드 관리: Build-logic , Version Catalog 정리안녕하세요 이번 글에서는 안드로이드 프로젝트 빌드 관리 핵심 키워드인Build-logic (컨벤션 플러그인)Version Catalog (빌드 카탈로그)를 정리해보겠습니다.1. 필요성멀티 모듈 프로젝트에서 build.gradle.kts 를 열어보면 이런 코드가 수십 개씩 반복됩니다.plugins { id("com.android.library") id("org.jetbrains.kotlin.android")}android { compileSdk = 35 defaultConfig { minSdk = 24 }}dependencies { implementation("androidx.co..

Android 2025.09.03

Android DI - Hilt 톺아보기

Hilt는 Dagger 기반으로 컴파일 타임에 코드 생성 → 런타임 오버헤드 최소화, 타입 안정성을 확보한다. Hilt vs Koin HiltKoin분류Dagger 기반 컴파일 타임 DI 라이브러리Kotlin DSL 기반 런타임 DI 라이브러리설정/문법어노테이션(@Inject, @Module, @Provides, @HiltViewModel)DSL 모듈(module { single { … } viewModel { … } })성능컴파일 시 그래프 생성 → 런타임 오버헤드↓런타임 해석/해결 → 오버헤드↑(대부분 앱에선 체감 미미)안정성타입 안전성↑(빌드 타임 검증)런타임 에러로 뒤늦게 발견될 수 있음빌드 시간어노테이션 처리로 느려질 수 있음빠름(어노테이션 처리 없음)안드로이드 통합Jetpack과 완전한 통합(..

Android 2025.07.30

Android DI(의존성 주입) - 개요

구글의 Android 권장 아키텍처(Architecture Guidelines) 에서는 Android 계층 구조 안에서 결합도를 낮추고, 테스트 가능성과 재사용성을 높이기 위해 DI 사용을 권장한다고 한다. 그렇다면, DI를 알아보자 의존성 주입(DI) : 클래스가 스스로 의존 객체를 생성하지 않고, 외부에서 주입받는 방식 먼저 "의존성"이란 어떤 객체가 다른 객체를 사용할 때 그 객체에 '의존'한다는 의미class Car { private val engine = Engine() // Car는 Engine에 의존하고 있음} 이게 뭐가 문제인가?1. 테스트 어려움Engine()을 직접 생성하므로, 테스트할 때 FakeEngine을 넣기 힘듦 2. 유지보수 어려움Engine에서 TurboEngi..

Android 2025.07.30

constraintHeight_percent와 RecyclerView스크롤 이슈

문제상황) 위 아래로 2개의 ConstraintLayout를 적용한뷰가 1:1의 비율을 유지하기 위해 app:layout_constraintHeight_percent = 0.5를 적용한 상태에서 ConstraintLayout안에있는 RecyclerView의 스크롤이 정상적으로 동작하지 않았다.(처음 스크롤시 버벅거림) 원인) constraint전체에 app:layout_constraintHeight_percent를 적용하고 그안에 리사이클러뷰를 사용하면 스크롤이 중복으로 불리는 이슈가 있다. 해결) layout_constraintHeight_percent를 제거하고 다음과 같이 GuildeLine을 사용해 해결 app:layout_constraintGuide_percent="0.5"

업무 2023.11.30

Camera2 API 개념부터 구현까지

- 개념 하나의 안드로이드 디바이스는 여러개의 카메라를 갖고있다. 각각의 카메라는 CameraDevice라 정의된다. CameraDevice는 Raw데이터에서 Preview, Photo, Record 스트림을 동시에 출력하며 Device마다 각기 다른 pipeline을 갖고있다. 이러한 pipeline은 CameraCaptureSession이 갖고있으며 CaptureRequest를 통해 선택된 pipeline으로 CameraDevice로 부터 나온 frame을 전달받는다. CaptureSession이 살아있는동안 수많은 CaptureRequest를 보낼 수 있다. 각각의 CaptureReuqest는 active configuration을 바꿀 수 있고, 파이프라인도 선택 할 수 있다. 구성요소) Cama..

Android 2023.04.06

안드로이드 커스텀 뷰(Custom View)

Android View를 상속받아서 새로운 뷰를 만드는 것 커스텀뷰를 만드는 방법 1. XML에 레이아웃을 직접 만들어 View를 가져오는 방법 - LayoutInflater 혹은 Binding을 이용해 레이아웃 소스를 addView()해서 사용함 class CustomViewTest @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { private val binding = CustomViewTestBinding.inflate(LayoutInflater.from(context), this, t..

카테고리 없음 2022.11.22

Android Paging3 개념정리 및 사용기

Paging 개념 데이터 목록을 일정한 덩어리로 나눠서 제공하는것 한번에 모든데이터를 불러오면 높은 리소스를 사용하기에 페이징 처리를 하게되면 성능, 메모리, 비용 측면에서 매우 효율적이다. Android Jetpack 라이브러리에서 제공하는것으로 Paging3 라이브러리가 있다. 이를 이용하면 사용자가 로드된 데이터의 끝까지 스크롤할 때 RecyclerView 어댑터가 자동으로 데이터를 요청한다. Paging3에 새로 도입된것 Paging3에서 가장 크게 달라진 점은, 기존 Paging2에서 여러가지 방법으로 DataSource 처리를 하던 부분이 PagingSource 하나로 통합 되었다는 점이다. 그 외 내용으론 아래와 같다. - Paging3 라이브러리는 Android 앱 아키텍처를 따르고 Kot..

Android 2022.07.06
반응형