| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- State
- 2989번
- genarics
- 선언형ui
- snapshotflow
- remembercoroutinescope
- mutablestate
- NavHost
- 2022 KAKAO BLIND RECRUITMENT
- 선언형 ui
- bottomscaffold
- derivedstateof
- clean coder
- 2022 kakao blind
- rememberupdatedstate
- gradle jdk
- 명령형ui
- 무선 페어링
- 자바
- mutableStateOf
- 명령형 ui
- apollo3
- producestate
- JCF
- ktor-auth
- compose
- 안드로이드
- Java
- android
- 양과 늑대
- Today
- Total
목록전체 글 (92)
버미
처음 내가 가지고 있던 MVVM에 대한 인식은 단순했다. 뷰와 모델 사이에 뷰모델을 두어 의존성을 줄이고, 응집도를 높여서 테스트하기 좋게 만드는 패턴. 결국 "안정성"을 위한 것이라고 생각했다. 그런데 MS의 공식 문서를 한 줄씩 뜯어보다가 그 정리에 빠진 관점이 있다는 걸 발견했다. 안정성은 결과지 목적이 아니었다. 결론적으로 MS가 진짜 줄이려 했던 건 "변화에 드는 비용"이라고 생각한다. MS 문서가 명시하는 MVVM의 이점MS Learn의 MVVM 문서를 보면 이점이 네 가지로 정리되어 있다. - 기존 모델 구현이 비즈니스 로직을 캡슐화하는 경우, ViewModel이 Model 클래스의 어댑터 역할을 해서 Model 코드를 크게 변경하지 않을 수 있다. - 개발자는 View를 사용하지 않..
기존에 사용하던 Navigation 2(NavHost + NavController + NavGraph)에 익숙한 입장에서, 2025년 11월에 1.0 안정 버전이 출시된 Jetpack Navigation 3(이하 Nav3)는 어떤 점이 달라졌고, 왜 새로 설계됐는지, 그리고 실제로 어떻게 사용하는지 살펴보고자 한다.Nav3가 등장한 이유Nav2는 2018년에 설계된 라이브러리다. Compose가 세상에 나오기도 전이다. 그래서 Nav2는 본질적으로 명령형(imperative) 패러다임을 따른다.navController.navigate("home") navController.popBackStack() 위 코드는 "컨트롤러에게 명령을 내리면 → 내부 백스택이 바뀌고 → UI가 갱신된다"는 흐름이다. 문제는 ..
안드로이드 API 36버전에서 변화되는 내용을 정리하고자 한다.먼저, 안드로이드 16(API 레벨 36) OS를 갖는 모든 디바이스에 적용되는 내용부터 살펴보자. 정식 출시는 25년 6월에 출시되었고 구글 플레이 의무화는 26년 8월 부터다. 다음은 targetSdkVersion에 관계없이, Android 16 기기 위에서 실행되는 모든 앱에 적용된다. 1. Job 스케줄링 실행 쿼터 강화백그라운드 Job의 실행 시간 쿼터가 더 엄격하게 관리된다. 아래 세 가지 조건에 따라 쿼터 적용 방식이 달라진다. 앱 대기 버킷(Standby Bucket): Active 버킷에도 넉넉한 쿼터가 적용되기 시작앱 가시성 상태: 앱이 화면에 보이는 동안 시작된 Job이 숨겨진 후에도 계속되면 쿼터 적용포그라운드 서비스 ..
웹뷰와 커스텀 탭 모두 웹 페이지의 내용을 보여주는 컴포넌트다. 이 글을 통해 웹뷰를 상기해보고 커스텀 탭이 어떻게 차이가 있는지 알아보자.웹뷰웹뷰는 안드로이드에서 지원하는 컴포넌트로, 앱 내부에 웹 브라우저를 내장하여 웹 페이지를 렌더링하는 컴포넌트이다.즉, 앱 안에 브라우저를 직접 구현하는 방식이다. WebView의 핵심은 “렌더링”과 “제어”를 분리해서 이해하는 것이다. HTML을 파싱하고 DOM을 구성하며, 레이아웃을 계산하고 화면에 그리는 작업은 모두 Chromium 기반의 웹 엔진이 담당한다. 하지만 그 엔진은 앱 프로세스 안에서 동작하며, 앱은 WebView API를 통해 이 엔진을 제어할 수 있다. 즉, 렌더링 자체는 엔진이 수행하지만, 어떤 페이지를 로드할지, 어떤 JavaScript를 ..
OkHttp를 사용할 때는 OkHttp 클라이언트에 체이닝을 걸어 Interceptor와 Authenticator로 access token을 헤더에 추가하고, 401이 발생하면 refresh token을 통해 토큰을 갱신하는 구조를 직접 설계했다.하지만 Ktor Client에서는 Auth 플러그인과 Bearer Provider만 설정하여 이러한 흐름을 처리할 수 있다.그렇다면 Ktor는 내부적으로 어떤 흐름으로 401을 감지하고, 언제 refreshTokens를 호출하며, 어떻게 동일한 요청을 재시도하는 걸까? 이번 글에서는 Ktor Bearer 인증의 내부 동작 과정을 코드 레벨에서 분석해보려고 한다.KtorKtor는 코틀린에서 사용할 수 있는 비동기 HTTP 클라이언트 기반 라이브러리다.내부적으로 코..
Kotlin Multi Platform(KMP) 사용하다가 플랫폼 별로 라이브러리를 연결해야하는 상황에서 추가적인 작업이 필요하다.Android 에서는 Gradle dependency로 간단하게 연결할 수 있지만, iOS에서는 어떻게 연결할지 알아보자.KMP에서 플랫폼별 구현이 필요한 이유KMP는 공통 Kotlin 코드를 작성하고,각 플랫폼(Android / iOS)에서 실제 구현(actual)을 제공한다.문제는 iOS SDK가 Swift 와 Objective-C 으로 구성되어있다는 점이다.코틀린에서는 이를 직접 사용할 수 없기 때문에, 연결 과정이 필요하다. iOS SDK가 KMP에 연결되는 흐름을 보면 아래와 같다. CocoaPods CoCoaPods는 iOS에서 사용하는 의존성 관리자다. 마치, 안..
MVI(Model-View-Intent)로 앱을 만들다 보면, 사용자 입력(Event)을 처리할 때, Channel를 사용할지 SharedFlow 을 사용할지 고민이 되곤 했다. 이번 포스팅에서 이 둘의 차이점과 MVI패턴의 어떤 상황에서 사용하는 것이 유리할지 정리해보자.Channel코루틴 간, 값을 전달하기 위해 설계된 통신 도구이다.핵심은 보내는 쪽과 받는 쪽의 역할이 명확히 분리되어있다.이게 무슨 말이냐면, Channel에서는:Sender는 send만 할 수 있다.Receiver는 receive만 할 수 있다.한 쪽이 다른 한 쪽의 상태를 직접 관찰하거나 침범할 수 없다는 것이다. 즉, 생산자와 소비자가 "서로를 모른다"는 것이다. 특징1. 소비 중심 모델이다이벤트는 받는 쪽이 가져가야만 사라진다..
안드로이드 프로젝트 세팅을 위해, Gradle 파일에 JDK를 설정하는 부분이 있다. 이번 글에서는 Gradle에 JDK가 왜 필요한지, 간단한 관련 개념과 함께 포스팅하여 남기고자 한다.JVM Java Virtual Machine 으로 자바의 핵심이다. .java 파일이 컴파일되어 생성된 .class 바이트코드를 실제로 실행하는 가상 머신이다. JVM 내부에는 다음의 요소들이 존재한다.클래스 로더 시스템런타임 데이터 영역 (Heap, Stack, Method Area 등)실행 엔진 (Interpreter, JIT 컴파일러)자바 코드가 운영체제와 직접 연결되지 않고 실행할 수 있도록 해주는 엔진이다. JREJava Runtime Environment 으로 JVM에 자바 표준 라이브러리와 런타임 환경을 ..
안드로이드 스튜디오에서 무선 연결이 가끔 안될 때가 있다. 와이파이를 다시 연결하던가 IDE를 종료 후 다시 실행시켜도 동작하지 않으면 아래와 같은 방법을 사용하자.1. CMD 실행먼저, CMD를 실행하자. 관리자로 실행하지 않아도 된다.안드로이드 스튜디오를 설치할 때, 대부분 platform-tools를 함께 설치했을 것이다. 안되어있다면, Android Studio → Settings > Languages & Frameworks 에서 Android SDK Platform-Tools 항목을 클릭해 설치하자 2. platform-tools 폴더로 이동CMD 창에서 아래 명령어를 입력하자. 에는 독자가 사용하고 있는 계정 이름을 넣으면 된다. cd C:\Users\\AppData\Local\Andro..