본문 바로가기

전체 글322

[Android] Android vitals 성능 지표, 어떻게 읽어야 할까 (스타트 시간, 느린 프레임, 정지 프레임) Play Console의 Android vitals에 들어가 보면 크래시, ANR 말고도 스타트 시간이나 프레임 관련 지표가 여러 개 있습니다. 제 프로젝트의 지표를 보다가 문득 이런 생각이 들었습니다."콜드 스타트 0.34%, 정지 프레임 1.01%... 그래서 이게 좋은 거야, 나쁜 거야?"수치만 봐서는 감이 잘 오지 않아서 AI에게 물어봤는데, 지표마다 "Google Play 경고 기준점은 몇 %"라며 친절하게 비교까지 해주더군요. 그런데 막상 공식 문서를 찾아보니 그 기준점 수치들은 어디에도 없었습니다.이번 포스팅에서는 Android vitals의 스타트 시간, 렌더링 지표가 각각 무엇을 의미하는지, 그리고 Google Play의 기준점과 비교하면 어떻게 봐야 하는지 실제 수치를 예시로 정리해 보.. 2026. 6. 2.
[Android] 프레임과 주사율(Hz), 그리고 Compose 캘린더 화면의 느린 렌더링 개선하기 최근 회사 프로젝트에서 Firebase Performance 지표를 살펴보다가, 날짜를 선택하는 캘린더 화면의 느린 렌더링(Slow rendering) 비율이 앱 평균보다 2배 가까이 높다는 걸 발견했습니다.그런데 막상 원인을 찾으려고 보니, 프레임이 정확히 뭔지, 120Hz라는 게 무슨 의미인지, 그리고 "끊긴다"는 게 어떤 상태를 말하는 건지 스스로 명확하게 설명하지 못하겠더라고요.그래서 이번 포스팅에서는 먼저 주사율(Hz)과 프레임 개념을 정리하고, 실제로 캘린더 화면의 느린 렌더링을 어떻게 개선했는지까지 살펴보겠습니다. 주사율(Hz)이란?주사율은 화면이 1초에 몇 번 새로 고쳐지는지를 의미합니다. 120Hz라면 화면이 1초에 120번 새로 고쳐지는 것이죠.이걸 시간 간격으로 바꿔보면 이해가 더 쉽.. 2026. 5. 30.
[Android] Baseline Profile 플러그인은 왜 빌드 변형을 추가할까? Baseline Profile 플러그인을 적용한 프로젝트에서 Build Variants 창을 열어보다가 문득 궁금한 점이 생겼습니다.프로젝트는 betaVersion, realVersion 2개의 Product Flavor와 debug, release 2개의 Build Type을 조합해서 총 4개의 빌드 변형을 사용하고 있었는데요. 창에는 처음 보는 이름이 섞인 8개의 빌드 변형이 보였습니다.따로 추가한 적이 없는데 어디서 생긴 건지 궁금해서 찾아보았고, 이번 포스팅에서는 늘어난 빌드 변형의 정체가 무엇인지, 그리고 왜 필요한지 정리해 보겠습니다. 결론부터결론부터 말하자면 Baseline Profile Gradle 플러그인(androidx.baselineprofile)이 프로필을 생성하고 측정하는 데 쓰기.. 2026. 3. 16.
Claude Code는 어떻게 작동할까? 내부 구조 한눈에 정리 Claude Code를 며칠 써보면 한 가지 궁금증이 생긴다. 분명 명령어 자동완성 같은 게 아닌데, 알아서 파일을 뒤져서 읽고 코드를 고치고 테스트까지 돌려본다. 어떻게 이게 가능한 걸까. 이번 글에서는 Claude Code가 안에서 실제로 어떻게 굴러가는지 — 핵심 구조와 내장 기능, 그리고 잘 쓰는 팁까지 정리해봤다. 동작 원리를 알아두면 왜 어떤 작업은 잘 되고 어떤 작업은 헤매는지 감이 잡히고, 그만큼 더 잘 다룰 수 있게 된다. 참고로 Claude Code는 코딩 전용 도구가 아니다. 터미널에서 실행되는 에이전트 어시스턴트라, 명령줄로 할 수 있는 일이면 문서 작성·빌드 실행·파일 검색·자료 조사까지 거의 다 도와준다. 코딩을 특히 잘할 뿐이다. 에이전트 루프, 모든 것의 시작대부분의 개발 도.. 2026. 1. 25.
[Android] Compose의 IntrinsicSize.Min과 IntrinsicSize.Max 차이 이전 포스팅에서 IntrinsicSize.Min과 wrapContentHeight()의 차이를 다룬 적이 있는데요. 정작 IntrinsicSize.Min과 IntrinsicSize.Max는 어떤 차이가 있는지 물어보면 제대로 설명하기가 어렵더라고요.특히 공식 문서에 자주 나오는 Row + VerticalDivider 예시를 보면서 "여기서 Max를 써도 똑같은 결과 아닌가?"라는 의문이 들었고, Column + Button 예시에서는 "자식에 fillMaxWidth()를 줬는데 왜 화면 전체로 늘어나지 않지?"라는 부분도 헷갈렸습니다.이번 포스팅에서는 IntrinsicSize가 무엇을 물어보는 건지부터 시작해서, Min과 Max가 실제로 어떤 차이를 만드는지 Compose 소스 코드와 함께 살펴보겠습니다.. 2026. 1. 15.
[Android] Compose의 IntrinsicSize.Min와 wrapContentHeight() 차이 회사 프로젝트에서 갤럭시 폴드 대응 중, IntrinsicSize.Min을 사용해 자식 컴포넌트의 높이에 따라 부모 높이를 조정하는 레이아웃 코드에서 내용이 아래쪽에서 잘리는 현상이 발생했습니다.문제 원인 분석 결과, 동적 콘텐츠를 사용하는 경우 IntrinsicSize.Min은 초기 컴포지션 시점에만 크기를 계산하기 때문에, 이후 네트워크 등을 통해 받아오는 실제 콘텐츠 높이를 반영하지 못해 잘림이 발생한 것이였습니다. 즉, viewModel에서 Flow로 네트워크 데이터를 수신하고, 컴포저블에서 collectAsState() 등으로 이를 받아 UI를 구성할 때, 초기 컴포지션에서 높이가 먼저 계산되어 이후 콘텐츠 반영이 누락되는 상황이 생긴 것입니다. 이번 글에서는 IntrinsicSize.Min 사.. 2025. 12. 10.