프로젝트를 손보면서 모임 카드를 만들 때 대표 이미지를 넣을 수 있다. 이미지는 두 경로로 들어온다. 하나는 사용자의 갤러리에서 고른 사진, 다른 하나는 앱 안에서 이미지 검색으로 고른 외부 이미지 URL이다. 어느 쪽이든 앱이 이미지를 서버로 올리고, 서버는 그걸 S
프로젝트를 손보면서 한 화면에 9개 항목이 세로로 쌓여 있던 회원가입 폼을 5스텝 마법사로 쪼갰다. 그 과정에서 "스텝을 뭘로 담을 것인가"(Fragment냐 ViewFlipper냐 ViewPager2냐)를 두고 고민했고, 마지막엔 게이팅 구조 덕분에 죽은 검증 코드
프로젝트를 손보면서 홈 화면 상단 "지금 뜨고 있는 모임" 캐러셀을 3초마다 자동으로 넘어가게 만들었다. 새 라이브러리 없이 이미 쓰던 RecyclerView에 PagerSnapHelper 한 줄을 얹고 Handler로 돌렸는데, 그 과정에서 스냅과 스크롤이 싸우는 버
프로젝트를 손보면서 클릭 연타를 막는 클라이언트 가드를 다 깔고 나서도 찜찜한 구멍이 하나 남았다. 앱을 거치지 않고 서버 API를 직접 때리는 경우다. 이건 클라 코드로는 절대 못 막는다. 서버에서 rate limit으로 막은 과정을 정리한다. 새 테이블도, 정리 크
프로젝트를 손보다가 앱 전체에 퍼져 있던 "중복확인" 버튼을 전부 걷어냈다. 대신 입력을 멈추면 알아서 검사하게 만들었는데, 그 뒤에 있는 기술이 debounce다. 이 글은 debounce가 뭔지, 왜 필요한지, 안드로이드에서 라이브러리 없이 어떻게 구현했는지를 정리
안드로이드 4대 컴포넌트를 간단히 언급하면서 BroadcastReceiver 이름만 짚고 넘어갔는데, 이번에는 그걸 제대로 파고든다. 개념 자체는 어렵지 않은데, 실제로 코드를 짜보면 "분명히 매니페스트에 등록했는데 왜 안 받아지지"라는 벽에 부딪히는 경우가 많다. 그
코드를 짜다 보면 "이거 진짜 되는지 확인해봐야지" 하는 순간이 계속 온다. 그런데 그 확인을 매번 손으로 하고 있다면, 앱이 커질수록 확인해야 할 항목도 같이 늘어난다. 버튼 하나 눌러보고, 입력창에 글자 쳐보고, 화면 전환되는지 보고를 반복하다 보면 어느 순간 "코
안드로이드 UI 자체보다는 Kotlin/Java에서 날짜와 시간을 다루는 방법에 관한 이야기다. 그래도 실무 코드에서 자주 마주치고, 오래된 방식과 새 방식의 차이를 원리로 알아두면 실수를 줄일 수 있는 주제라 이 시리즈에 포함했다.날짜와 시간을 다루는 이야기로 시작하
여러 개의 데이터를 리스트 형태로 화면에 보여줘야 할 때 쓰는 게 ListView다. 이번 글에서는 ListView의 기본 구성, 스크롤 성능을 위한 ViewHolder 패턴, 그리고 지금도 이걸 배워야 하는 이유를 정리한다.ListView는 크게 세 요소로 이루어진다
안드로이드 레이아웃을 처음 짤 때 가장 먼저 헷갈리는 게 단위다. XML에 크기를 쓸 때 어떤 곳엔 dp가 붙어 있고 어떤 곳엔 sp가 붙어 있는데, 둘 다 그냥 "크기 단위"로만 알고 넘어가면 나중에 꼭 실수를 하게 된다. 이번 글에서는 px/dp/sp 단위와, 레이
화면을 회전시키면 Activity가 onDestroy → onCreate 순서로 재생성된다는 걸 봤다. 이번 글에서는 그 재생성 과정에서 화면에 입력해둔 데이터가 왜 사라지는지, 그리고 그걸 어떻게 지킬 수 있는지를 다룬다. 3-1편에서 다룬 "서로 다른 두 Activ
Intent가 컴포넌트 사이를 이어주는 메시지라고 정리했다. 이번 글에서는 그 Intent에 실제 데이터를 실어서 Activity끼리 주고받는 방법, 그리고 커스텀 객체를 넘길 때 필요한 직렬화(Serializable/Parcelable)를 다룬다.안드로이드에서 하나의
앱이 처음 실행될 때 onCreate → onStart → onResume 순서로 화면이 뜬다는 것까지 살펴봤다. 이번 글에서는 그 이후에 벌어지는 일들 - 화면을 벗어날 때, 화면이 회전할 때, 다른 화면이 위에 뜰 때 Activity가 어떻게 되는지를 다룬다. Co
이번 글에서는 Activity를 포함한 여러 컴포넌트가 공통으로 의존하는 개념인 Context를 정리한다.Context는 한마디로 "지금 내가 어떤 실행 환경에 있는지"에 대한 정보를 담고 있는 창구다. 안드로이드 앱을 만들다 보면 리소스 파일(문자열, 이미지, 색상
4대 컴포넌트가 서로 직접 참조하지 않고 Intent를 통해 상호작용한다고 정리했다. 이번 글에서는 그 Intent가 정확히 무엇이고, 명시적 인텐트와 암시적 인텐트가 어떻게 다른지를 다룬다.Intent는 안드로이드 컴포넌트끼리 상호작용할 때 사용하는 메시지 객체다.
1-1편에서 4대 컴포넌트 중 Activity가 사용자와 상호작용하는 화면 단위 컴포넌트라고 소개했다. 이번 글에서는 Activity가 정확히 어떤 일을 하는지, 어떻게 선언하는지, 그리고 앱을 처음 실행했을 때 어떤 순서로 화면이 뜨는지를 자세히 다룬다.Activit
안드로이드 개발을 처음 공부하다 보면 "컴포넌트"라는 단어를 정말 자주 만난다. 나도 처음에는 이게 그냥 "클래스"를 어렵게 부르는 말인 줄 알았는데, 공부를 하면서 그게 아니라는 걸 알게 됐다. 이번 글에서는 안드로이드 앱을 이루는 4가지 핵심 구성요소가 무엇인지,
Jetpack이 뭔지, Compose가 뭔지, State/remember와 리컴포지션까지 정리했으니 이번 글에서는 지금까지 본 내용을 특징으로 묶어보고, 장단점과 Jetpack 전체와의 관계까지 정리하면서 마무리하려고 한다.관심사 분리 측면에서는 UI와 로직을 모두 K
지난 글에서 remember가 있어야 리컴포지션이 일어나도 값이 유지된다는 것까지 확인했다. 그런데 리컴포지션이라는 말 자체를 좀 더 정확히 알아야 할 것 같아서, 이번엔 리컴포지션의 동작 원리와 그걸 가능하게 하는 내부 구조까지 정리해봤다.State 값이 바뀌면 Co
Jetpack 라이브러리들을 정리하고 나니, 그중 UI를 담당하는 Compose를 좀 더 깊게 이해하고 싶어졌다. 특히 State와 remember는 이름만 봐서는 감이 잘 안 왔던 개념이라, 직접 코드를 짜서 동작을 눈으로 확인해보기로 했다.Jetpack Compos