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

개발과 기술에 대한 이야기를 기록합니다.
애플과 구글 심사관들은 깐깐합니다. 테스트 계정 로그인 실패, 개인정보처리방침 누락, 그리고 악명 높은 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까지, 플러터 앱이 번개처럼 파닥거리는 원인을 잡습니다.

글자 하나 칠 때마다 키보드가 내려가고 포커스가 풀리나요? 당신이 저지른 '컨트롤러 초기화' 실수를 찾아드립니다. TextEditingController와 build() 메서드의 관계를 완벽하게 파헤칩니다.

사용자가 올린 사진이 찌그러져서 오이가 되었습니다. 디자이너는 화를 냅니다. BoxFit.cover, contain, fill의 차이를 명확히 이해하고, AspectRatio 위젯으로 완벽한 프레임을 짜봅시다.

아이폰 X 이후, 직사각형 화면의 시대는 끝났습니다. 노치와 홈 인디케이터로부터 당신의 UI를 지키는 방법, 그리고 SafeArea를 쓰지 말아야 할 때를 정리해봤습니다.

로그인 화면을 만들었는데 키보드가 올라오니 노란 줄무늬 에러가 뜹니다. resizeToAvoidBottomInset부터 스크롤 뷰, 그리고 채팅 앱을 위한 reverse 팁까지, 키보드 대응의 모든 것을 정리해봤습니다.

Column 안에 ListView를 넣으면 왜 화면이 하얗게 변하거나 에러가 날까요? '무한한 높이'의 역설을 이해하고, Expanded와 Slivers로 우아하게 해결하는 방법을 정리해봤습니다.

Flutter 개발자라면 피할 수 없는 노란색/검은색 줄무늬 에러. 단순히 Expanded로 감싸는 게 답이 아닐 수 있습니다. 플러터의 제약 조건(Constraints) 시스템을 완벽하게 이해해봤다.
