본문 바로가기

전체 글

(90)
화면에 종속? 🙅‍♂️ 기능에 맞게 🙆‍♂️ Entered Screen 🙅‍♂️ FilterType 🙆‍♂️ 💡 ‘카테고리 개편’ 작업을 하며 4번의 PR 끝에 간신히 Approve를 받았던,, 1. 개요 각 진입한 화면별로 카테고리를 다르게 보여줘야하는 기획안이 도착했다. 그 때의 나로서는(물론 지금도 간혹,,) 개발 공수를 너무 얕잡아 본 탓에 시간이 너무나도 촉박했다.(핑계) 생각을 하긴 했지만 시야가 아직 좁아서일 수도 있고,,, 생각을 많이 못해서일 수도 있고위에 쓴 말대로 개발을 하며 진입한 화면별로 카테고리들을 조건에 맞게 필터링해서 띄워줬다. 2. Before CategoryFragment.kt 처음 작업을 할 때는 이렇게 말 그대로 ‘진입한 화면별’로 카테고리를 CategoryFragment에서 카테고리들을 필터링하였다. 당시에는 ..
RecyclerView를 데코해보자 ! - ItemDecoration ItemDecoration이란? RecyclerView에는 스크롤 막대, 구분선 등 decoration 요소들이 있다. ItemDecoration은 RecyclerView의 아이템과 화면을 렌더링하는 동안 불필요한 뷰를 따로 생성하지 않고 모든 decoration 요소를 그릴 수 있도록 도와주는 클래스 입니다. 주요 메서드 1. onDraw(c:Canvas, parent: RecyclerView, state: RecyclerView.State) RecyclerView에 제공된 Canvas를 그리는 메서드이며, 여기서 구현한 내용들은 ItemView가 그려지기 전에 먼저 그려집니다. Canvas: 기본적으로 필요한 decoration을 그릴 수 있는 캔버스 val dividerTop = child.bott..
TextView로 CustomButton을 만든다고!? 내용 요구사항에 맞게 Button에 padding 값을 줬는데 디자인과 너무 상이한 버튼이 나왔다. vertical과 horizontal의 padding이 각각 9dp, 12dp인 얄상한 모양의 버튼이다. 위의 피그마 이미지와는 육안으로도 다른 것이 보일 정도로 뚱뚱한 버튼이 생성이 되었다. 오른쪽 사진을 보면 알 수 있듯이 paddingHorizontal은 12로 주고 paddingVertical은 9로 요구사항과 동일한 값을 적용한 상태였다. 해결 1. Button attribute minHeight, minWidth 오버라이드 해주기 (feat. 구글링) 2. Button 대신 TextView 사용 (feat. issac) Why? “ 버튼은 왜 뚱뚱하게 나왔었고 어떻게 해결이 된걸까?” Butto..
Glide 관찰기 (Feat. 속도, 캐시) Glide Glide에 관한 예제는 많이 나와있으니 내가 궁금했던 것들에 적어보고자 한다. Glide는 Android용 이미지 로딩 라이브러리이다. '이미지 로딩 라이브러리'하면 Picasso도 생각이 나지만 gif 파일을 지원하지 않고, Glide가 성능적으로 더 좋다는 평이 많아서 Glide를 더 사용하는 것 같다. Glide가 Android에서 고려하는 것 중 가장 중요하게 생각하는 것은 '속도'와 '버벅거림'이라고 한다. 이것을 정리하면 이미지(들)를 가능한 부드럽고 빠르게 스크롤할 수 있게 하는 것이라고 생각한다. 속도 문서를 봤지만 당연하게도(?) 어떻게 구현되어 있는지는 안 나와있었고, 이미지 로딩이 최대한 빠르고 원활하게 하기 위해 구현한 단계는 나와있었다. 자동 다운 샘플링과 캐싱을 통해..
Zip vs Combine 개요 상품 상세 화면에서 상품 상세 정보(DetailState)와 퀵 메시지(QuickMessageUiModel) 정보의 결합을 통해 UI 상태 관리를 할 데이터(QuickMessageViewState)를 생성해야했다. 상품 상세정보는 Server API를 통해 화면 진입 시 먼저 가져오고, 퀵 메시지 정보는 Firebase Remote Config를 통해 가져온다. 이 과정에서 당연히 상황에 알맞은 연산자를 사용해야 했음에도 불구하고 가볍게 생각하고 지나쳐버렸다. (Zip을 사용해야 하는 상황인데… Combine을..?) Before /** * 상품 상세 정보와 퀵 메시지 결합 */ fun getCombinedData(): Flow { return combine(_detailState, _quickMe..
[Android] 프로세스 라이프사이클 안드로이드 시스템은 새로운 프로세스가 사용될 메모리가 부족할 때나 더 중요한 프로세스가 실행되어야 하는 상황에서는 기존에 중요하지 않은 프로세스는 종료한다. 어떤 프로세스를 살리고 죽일지 결정할 때, 시스템에서는 컴포넌트의 상태와 프로세스에서 실행되고 있는 컴포넌트를 기초로 해서 각각의 프로세스에 "중요도 계층"을 할당한다. 중요도 계층 1. Foreground Process 현재 유저가 사용하고 있는 프로세스. - 유저와 상호 동작되고 있는 화면(액티비티)은 Foreground 프로세스에 속함 - 현재 화면과 Binding되어 있는 서비스는 Foreground 프로세스에 속함 - startForeground()를 이용해서 호출한 프로세스는 Foreground 프로세스에 속한다. - onCreate(),..
[Android] 프로세스 안드로이드를 공부하던 중 "여러 프로세스를 사용하고 있다 " = "여러 앱을 사용하고 있다" 일까? 라는 궁금증과 함께 공부하게 되었다. 말로만 프로세스 프로세스 거렸지 내가 알고있던 지식은 참 얕았다. 위의 질문에 대한 답변은 "아니오"이다. 현재 어플리케이션에서 실행되고 있는 컴포넌트가 없을 때, 어플리케이션 컴포넌트가 시작되면 안드로이드 시스템에서는 하나의 스레드로 구성된 프로세스를 시작시킵니다. 기본적으로 같은 어플리케이션 내에 있는 모든 컴포넌트는 동일한 프로세스, 즉 "메인 스레드"에서 동작한다. 어플리케이션 컴포넌트가 시작할 때, 애플리케이션에서 이미 프로세스가 존재하고 있다면 새로 시작한 컴포넌트는 그 프로세스에서 실행된다. 하지만 어플리케이션에 존재하는 여러 컴포넌트들이 서로 다른 프로세..
[OS] 메모리 페이징 메모리 페이징이란? : 컴퓨터 운영체제에서 메모리 페이징은 주 메모리에서 사용하기 위해 보조 저장소에서 데이터를 저장하고 검색하는 메모리 관리 체계이다. 메모리는 알겠지만,,,그래서 페이징한다는 것이 뭘까? 페이징: 논리 주소의 고정된 페이지라고 불리는 블록들로 분할 관리하는 기법이다. (대충 논리 주소를 일정 크기(?)의 블록들로 분할하여 사용한다는 뜻 같다.) 그렇다면, 이 페이징 기법이 어떤 구조이고, 왜 쓰이는가를 알아보자. 프로세스를 연속할당하면 외부 단편화가 발생하고, 그로인해서 자투리 공간이 남아서 못 쓰는 부분이 생긴다. 위의 상황은 들어가려는 PROCESS가 빈 부분(HOLE)보다 커서 못 들어가는 것 같다. 그래서 이러한 경우를 없애기 위해 개발자들은 페이징 방법을 했다. 논리주소를 동..