Android 28

[Android] MVI 패턴, 이름을 왜이렇게 헷갈리게 지었어요?

💡 MVI란?MVI는 Model - View - Intent 여기서 말하는 Intent는 Android Intent가 아니라 !!!👉 “사용자의 의도(Intent)부터 상태(State) 변경까지 이어지는 흐름 전체”를 뜻하는 개념적인 용어,,❗️그러니까 MVI의 Intent ≠ UIEvent ≠ 안드로이드 Intent → 절대 헷갈리면 안된다.. MVI 흐름[사용자 행동 (UIEvent)]→ ViewModel이 받음→ 상태(UIState) 변경 or 효과(UIEffect) 발생→ View가 변화됨- 이 흐름의 출발점은 항상 UIEvent- 화면은 항상 UIState 하나로만 관리 🧩 자주 사용되는 타입들 🧠 UIState현재 화면의 상태 (ex. 키워드, 로딩 중, 결과 등)data clas..

📱 Android 2025.05.27

[Android / Compose] Compose Context

까먹기 전에 줍줍..🎯 XML vs Compose의 "생명주기 + context" 구조 차이 XML 기반Activity나 Fragment가 View를 직접 소유View는 Activity가 죽을 때 context도 같이 정리됨 → context를 View 내부에서 써도 큰 문제가 없다 즉, UI는 생명주기를 따라감 Compose 기반UI 자체가 "함수로 구성된 상태 기반 UI"상태에 따라 UI가 수시로 재구성(recomposition) 되기에 Activity와 느슨하게 연결됨그래서 UI 함수 내에서 context를 막 쓰면, 그 시점에 context가 유효하지 않을 수 있음 XML : context가 항상 Activity와 뷰 안에 있고, 생명주기를 같이 가져가니까 자유롭게 써도 괜찮았지만,Comp..

🤖 Compose 2025.05.11

[Android] 클린 아키텍처 적용 시 고민했던 3가지 의문점

새 프로젝트를 시작하며 새로운 디자인 패턴(MVI)를 적용하려고 하다보니, 클린 아키텍처에 대한 고심?이 필요했습니다 들었던 의문점들을 정리해보았어요 🥹 🔒 Q1. Repository는 화면을 따라가야 할까? 데이터 주체를 따라가야 할까? 🔑 A. Repository는 무조건 “데이터 주체” 기준으로 네이밍해야 함!❌ MainRepository, BookScreenRepository ✅ BookRepository, UserRepository:  Repository는 데이터 주체를 중심으로 만들어야 여러 화면에서 재사용 가능하고, 구조가 깔끔하게 유지  🔒 Q2. Repository는 domain 계층인데, 구현체는 왜 data에 있을까? 🔑 A. Repository의 정의는 도메인에 있고, 실제..

📱 Android 2025.04.12

[Android] 앱 배포 실패, 그 원인은 SoLoader ? (ft.giphy)

배포를 하려다가 플레이 콘솔에서 배포 실패가 떴었어요 에러 메시지는 아래와 같았습니다 하나 이상의 앱에 결함이 있는 SoLoader SDK 버전이 포함되어 있으므로 앱이 다운되어 사용성이 저하됩니다 64비트 전용 기기에서 비정상 종료를 일으키는 SoLoader SDK 버전이 앱에 통합되어있습니다 공식문서에도 친절하게 나와있습니다 :) https://support.google.com/googleplay/android-developer/answer/12576726?hl=ko 잘못된 SoLoader 버전이 있는 앱 수정하기 - Play Console 고객센터도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요support.google.com 에러 수정방법 1️⃣ 앱이 SoLoader SDK에 직접 종속..

📱 Android 2024.10.11

[Android / Glide] Glide override / Glide 이미지 크기 조정

overrideoverride는 이미지의 크기를 강제로 지정하여 로드할 때 사용되는 메서드입니다우선 함수 원형을 보자면,paramater로 width, height을 받아서 크기를 조절해줍니다  @NonNull @CheckResult public T override(int width, int height) { if (isAutoCloneEnabled) { return clone().override(width, height); } this.overrideWidth = width; this.overrideHeight = height; fields |= OVERRIDE; return selfOrThrowIfLocked(); } 만약 width, height이 같..

📱 Android 2024.10.08

[Bug / RecyclerView] java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionNotificationHolder

🐛 SwipeRefreshLayout에서 refresh시 발생 주 원인  : 데이터 변경 시 리사이클러뷰의 뷰 홀더와 실 데이터가 불일치 SwipeRefreshLayout에서 refresh 발생 시 Adapter의 아이템을 clear 하고 새로 그렸는데, 이 과정에서 문제가 발생한 거 같다  시도한 방법 1. bindViewHolder할 때 holder.bind(아이템목록[position])을 holder.bind(아이템목록[absoluteAdapterPosition])으로 변경  -> 똑같이 에러 발생 2. refresh후 데이터 가져올 때 clear()를 시키지 않고, 데이터를 가져온 후 기존의 데이터와 바꿈!  -> 성공 🔑 recyclerView는 기존의 뷰 홀더를 재사용하려고 하지만, cl..

🐛 버그 2024.05.20

이미지 수난기

까먹기 않기 위해 우선 적어두고,, 나중에 다시 정리할 예정입니다 1. clipRect(Rect rect)현재 클립 영역을 지정된 사각형으로 설정합니다.지정된 사각형 내부의 영역만 그려집니다.사각형 외부의 영역은 그려지지 않습니다.2. clipOutRect(Rect rect)현재 클립 영역에서 지정된 사각형 영역을 제외합니다.지정된 사각형 외부의 영역만 그려집니다.사각형 내부의 영역은 그려지지 않습니다. public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height) { throw new RuntimeException("Stub!");}  createScaledBitmap 메서드Android의 ..

📱 Android 2024.05.16

[Android] @IgnoredOnParcel

통신을 위해 model을 설계했는데, 클라이언트에서만 사용하는 변수가 필요한 상황입니다 클라이언트에서만 사용될 값을 추가하는데, 만약 이게 서버 통신에서 쓰인다면.. 아찔한 상황입니다 T_T 이럴 경우엔, IgnoredOnParcel 을 사용합니다 @IgnoredOnParcel - Parcelize annotation이랑 함께 사용되는데 특정 필드가 Parcelable 구현에서 제외시킵니다 즉 Parcelable 인터페이스를 구현할 때 고려되지 않으므로, 인텐트에 데이터를 넘기거나 상태를 저장/복원하는 과정에서 이 변수는 무시되고, 클라이언트 상에서만 사용할 수 있습니다 :) @Parcelize data class User( val name: String, val age: Int, @IgnoredOnPa..

📱 Android 2024.02.25

[Android] 4대 Component

Component Application의 구성 요소입니다 Manifest 파일에 등록 필수 🔍 시스템에 컴포넌트를 알려야하기 때문에 일반 클래스와의 차이 일반 클래스: 생명주기 관리 개발자 코드 컴포넌트 클래스 : 안드로이드 시스템에서 생명주기 관리 또, 앱 안에서 독립된 실행단위로 이로 인해 안드로이드는 앱 실행 시점이 다양합니다 안드로이드에선 4개의 Component가 존재하는데, 각각 Component들에 알아보겠습니다 생성방법이나 사용법에 대해선 자세히 다루진 않겠습니다 😭 1. Activity 화면을 구성하고 사용자와 상호작용을 담당하는 컴포넌트 2. Broadcast Receiver 시스템에 어떤 이벤트가 발생 (ex.부팅, 배터리상태, 화면 On/Off)하면 실행되는 컴포넌트 Broadcas..

📱 Android 2022.07.05

[Android] Pattern (MVC, MVP, MVVM)

MVC Model, View, Controller로 구성 🔍 Model - 비즈니스 로직 및 데이터를 다루는 영역 ex) POJO 클래스, SQLite, Room, Realm 🔍 View - 사용자에게 보이는 영역 - Model로 부터 얻은 데이터 표시 ex) Activity, Fragment 🔍 Controller - 모델과 뷰에 의존 - 뷰로 부터 입력 받음 - 특정 이벤트 발생 시 뷰, 데이터 변경 가능 ex) Activity, Fragment 다이어그램 💬 MVC의 장점과 단점은 무엇일까? 장점 - 직관적이다 쉽게 말해 패턴을 몰라도 구조가 단순하고 직관적이라 쉽게 적용할 수 있다 단점 - 컨트롤러가 뷰, 모델에 의존적 -> 유닛테스트가 힘들다 - Fragment, Activity에서 Contro..

📱 Android 2022.05.30