앱이 안 열려요 (딥링크, 유니버설 링크 완전 정복)
카카오톡이나 문자의 링크를 눌렀는데 앱이 안 켜지고 웹페이지만 뜹니다. Android App Links, iOS Universal Links 설정, 그리고 `go_router` 처리까지 딥링크의 모든 것을 파헤칩니다.

개발과 기술에 대한 이야기를 기록합니다.
카카오톡이나 문자의 링크를 눌렀는데 앱이 안 켜지고 웹페이지만 뜹니다. Android App Links, iOS Universal Links 설정, 그리고 `go_router` 처리까지 딥링크의 모든 것을 파헤칩니다.

게시글(Post)을 가져올 때 작성자(User) 정보도 같이 보고 싶은데 `null`만 뜹니다. Foreign Key 설정부터 `select(*, users(*))` 문법, 그리고 M:N 관계, Inner Join, Count까지 완벽하게 파헤칩니다.

DB에 데이터가 분명히 있는데, 프론트엔드에서는 빈 배열(`[]`)만 옵니다. Supabase 초보자가 가장 많이 겪는 RLS(Row Level Security) 정책 위반 문제와 해결법을 정리해봤습니다.

안드로이드는 오는데 iOS는 조용합니다. 혹은 앱이 켜져 있을 때만 옵니다. Background/Terminated 상태 처리, APNs 인증서, 그리고 Notification Channel 설정까지 완벽하게 해결합니다.

Debug에선 잘 되는데 Release에서만 죽나요? 범인은 '난독화'입니다. R8의 원리, Mapping 파일 분석, 그리고 Reflection을 사용하는 라이브러리를 지켜내는 방법(@Keep)을 정리해봤습니다.

기능도 별로 없는데 앱 용량이 100MB? 사용자는 무거운 앱을 설치하지 않습니다. 이미지 최적화, 폰트 경량화, ABI 필터링, 그리고 Android App Bundle(AAB)까지, 확실한 다이어트 비법을 공개합니다.

애플과 구글 심사관들은 깐깐합니다. 테스트 계정 로그인 실패, 개인정보처리방침 누락, 그리고 악명 높은 IPv6 네트워크 문제와 UGC(사용자 생성 콘텐츠) 정책 위반까지, 리젝을 피하는 5가지 체크리스트.

안드로이드는 Xcode보다 낫다고요? Gradle 지옥에 빠져보면 그 말이 쏙 들어갈 겁니다. minSdkVersion 충돌, Multidex 에러, Namespace 변경(Gradle 8.0), JDK 버전 문제, 그리고 의존성 트리 분석까지 완벽하게 해결해 봅니다.

어제는 됐는데 오늘은 안 되는 iOS 빌드. CocoaPods 의존성 지옥, M1/M2 아키텍처(arm64) 충돌, 서명(Signing) 문제, 그리고 CI/CD에서의 Fastlane 설정까지 완벽하게 파헤칩니다.

엘리베이터만 타면 앱이 먹통이 됩니까? connectivity_plus로 네트워크 상태를 감지하고, Hive로 데이터를 캐싱하며, Optimistic UI와 Background Sync(WorkManager)를 통해 끊기지 않는 사용자 경험을 만드는 법을 배웁니다.

앱 켤 때마다 로그인하라고요? 사용자는 떠납니다. Access Token 만료 시 Refresh Token으로 몰래 갱신하고, 실패했던 요청을 재시도하는 완벽한 인터셉터(Interceptor) 패턴을 구현해 봅니다.

서버에서 잘 오던 데이터가 갑자기 앱을 죽입니다. 'type Null is not a subtype of type String' 에러의 원인과, 안전한 JSON 파싱을 위한 Null Safety 전략을 정리해봤습니다.

서버가 죽었는지 1분째 로딩바만 돌아가고 있습니다. http 패키지와 Dio에서 타임아웃을 설정하는 방법, 그리고 사용자에게 '잠시 후 다시 시도해주세요'라고 말하는 우아한 방법을 정리해봤습니다.

로그인 정보나 설정을 불러오기 전에 메인 화면이 먼저 떠버립니다. main() 함수에서 기다려야 할까요, 아니면 스플래시 화면을 만들어야 할까요? 3가지 초기화 전략을 비교합니다.

네트워크 이미지가 엑박(X)으로 뜨거나, 리스트 스크롤 시 버벅거림(Jank)이 발생하나요? cached_network_image 사용법부터 메모리 캐시(LruCache) 최적화, 그리고 SSL 인증서 문제까지 해결해드립니다.

탭을 바꿨다가 돌아오면 리스트가 맨 위로 올라가 있나요? AutomaticKeepAliveClientMixin 없이도 스크롤 위치를 기억하는 마법, PageStorage와 Key의 활용법을 공개합니다.

페이지를 나갔다 돌아오니 열심히 입력한 데이터가 다 날아갔습니다. Riverpod의 autoDispose가 범인일까요? 캐싱 전략과 keepAlive, 그리고 invalidate의 차이를 명확히 구분해 봅니다.

분명히 Provider로 감쌌는데 찾을 수 없다고 에러가 뜹니다. BuildContext와 위젯 트리의 '족보' 관계를 이해하면, 이 에러는 다시는 당신을 괴롭히지 못합니다.

분명 코드를 실행했는데 화면은 그대로입니다. 리스트에 add를 했는데 반응이 없습니다. Dart의 메모리 참조(Reference)와 불변성(Immutability)을 이해하면, 당신의 앱은 다시 살아납니다.

상태만 바꿨는데 왜 이미지까지 다시 로딩될까요? FutureBuilder를 build 안에 넣는 실수부터 const 생성자, RepaintBoundary까지, 플러터 앱이 번개처럼 파닥거리는 원인을 잡습니다.
