본문 바로가기

분류 전체보기

(99)
안드로이드와 Clean Architecture Clean Architecture on Android 안드로이드에서의 클린 아키텍쳐는 어떤 모습일까요? 현재 DND 8기로 활동하면서 진행 중인 프로젝트에 클린 아키텍쳐를 적용했습니다. Presentater-Domain-Data 로 이루어진 Three Layers 방식을 도입하여 개발하고 있습니다. 이번 포스트에서는 Android 프로젝트에 클린 아키텍쳐를 적용하는 방식 및 그 효과를 알아가고자 합니다. 클린 아키텍쳐를 도입하는 이유 중 가장 중요한 것은 관심사 분리입니다. 안드로이드 프로젝트에 클린 아키텍쳐를 적용해보거나 공부해 보신 분들은 아시겠지만, 각 레이어가 별도의 모듈로 존재하고, 각 모듈은 꼭 필요한 모듈에만 의존하도록 구현됩니다. (별도의 모듈화가 진행되지 않는 경우도 있습니다) 각 레이어..
JVM 의 Garbage Collector Garbage Collector (GC) 메모리 관리는 언제나 중요합니다. 할당된 메모리보다 큰 메모리 리소스를 사용하려 하거나, 메모리에서 해제된 객체 등에 재접근하는 경우 등 메모리와 관련된 다양한 개발자의 실수로 프로그램이 뻗어버리는 일이 생기곤 하기 때문입니다. JVM 의 GC 는 Garbage Collecting Algorithm 을 운용하여 개발자가 비즈니스 로직에만 집중할 수 있도록 도와줍니다. GC 란? GC 는 JVM 메모리 구조 속 Heap Area 에 있는 인스턴스들을 대상으로 작동하며, 더 이상 참조되지 않는 인스턴스의 메모리를 자동으로 반환하도록 하는 메모리 관리 기법입니다. Heap 에는 참조형 타입의 인스턴스가 할당됩니다. 장, 단점은 다음과 같습니다. 장점 개발자가 메모리 할..
Jetpack Compose 의 remember Jetpack Compose 의 Composable 은 기본적으로 State-less 입니다. State 는 Screen-Level 에서 Composable 로 전파되고, Composable 에서 발생하는 Event 는 Screen-Level 로 전파됩니다. 이와 같이 구현된 이유는 재사용성 및 테스트 가능성 때문입니다. 관련된 내용은 이전에 상태 호이스팅 관련 포스팅에 설명해두었습니다. [Jetpack Compose] 상태 호이스팅 기존XML 방식에는 큰 문제점이 하나 있었는데, 그것은 바로 View 가 스스로의 상태를 정의하고 보존한다는 것입니다. 상태는 View 를 그 자체로 인식할 수 없도록 하며, 이는 곧 테스트 가능성과 재 blothhundr.tistory.com Composable 내에서 참..
Serializable, Parcelable 개발을 하다 보면 자료를 직렬화해야 하는 경우가 종종 있습니다. 안드로이드 개발의 경우는 Intent 를 통해 Activity 에서 또 다른 Activity 로 데이터를 보낼 때 이용됩니다. Intent 의 putExtra() 메서드는 Primitive 타입 (코틀린엔 Primitive 타입이 없지만) 들을 메서드 오버로딩을 통해 구현해 두었기 때문에 별도의 직렬화가 필요하지 않습니다. 하지만 그 외의 클래스 인스턴스를 전송하려면 직렬화가 요구됩니다. 직렬화 직렬화는 데이터를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것입니다. 반댓말은 역직렬화입니다. 역직렬화는 당연히, 디스크에 저장한 데이터를 읽거나, 네트워크 통신을 통해 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것입니..
[Jetpack Compose] HorizontalPagerIndicator 라이브러리 없이 구현하기 Jetpack Compose Accompanist Jetpack Compose Accompanist 는 Compose Supplement Library Set 입니다. Compose 는 미완성 단계이고 XML 및 Android View 생태계를 완전히 대체하기에는 모자란 부분이 있는 것이 사실입니다. 그 부분들을 메우기 위해 Accompanist 는 수많은 편의 기능을 제공합니다. HorizontalPager, Indicator HorizontalPager 역시 Accompanist 가 제공하는 기능입니다. 동시에 Indicator 까지 제공하고 있습니다. 그럼에도 불구하고 직접 Indicator 를 구현한 이유는 애니메이션이 없었기 때문입니다. Accompanist 에서 제공하는 Indicator 는 ..
SharedPreferences 가 DataStore 에 대체될 수 밖에 없었던 이유 DataStore Android Jetpack Library 중 하나인 DataStore 는 안드로이드 생태계에 꽤 긴 시간 존재했던 SharedPreferences 의 대체재가 되었습니다. SharedPreferences 는 키-값 쌍으로 데이터를 저장할 수 있는 Light-Weight Database 입니다. 데이터는 디바이스에 직접적으로 저장되며, 별도의 비동기 처리 없이 데이터를 로드할 수 있어 간편하고 실용적인 API 입니다. 이러한 이유로, SharedPreferences 가 DataStore 에 의해 대체되었음에도 불구하고 여전히 사용되고 있는 앱이 많으리라 예상합니다. 사용해보면 상당히 편합니다. 대부분의 개발자들이 그러하듯, 기존에 사용되던 기술을 버리고 새로운 기술을 도입하는 것은 결코..
비트맵과 WebP 인간의 눈으로 디지털 디바이스에서 표시되는 이미지 (그림, 사진) 를 보는 것은 픽셀이라는 작은 점들이 빼곡히 모여있는 것을 보는 것과 같습니다. 학창 시절 미술 시간에 한 번 쯤은 해보았던 점묘화와 그 개념이 같습니다. 디바이스마다 사이즈가 다르고, 1개의 픽셀에 적용할 수 있는 비트 수가 다릅니다. 비트맵은 픽셀의 사각형 배열 내에서 각 픽셀의 색을 지정하는 비트 배열입니다. 개별 픽셀에 적용되는 비트 수에 따라 픽셀에 할당할 수 있는 색의 수가 결정됩니다. 즉, 비트 수가 높을 수록 더욱 다양한 색상을 할당할 수 있습니다. 픽셀당 비트 수 비트 당 색상 수 픽셀당 비트 수 1 2^1 = 2 픽셀당 비트 수 2 2^2 = 4 픽셀당 비트 수 4 2^4 = 16 픽셀당 비트 수 8 2^8 = 256 픽..
[Jetpack Compose] Image 의 ContentScale Jetpack Compose Image 안드로이드 앱 개발 시 이미지 표시를 위해 사용되는 Composable 입니다. 기존 XML 의 ImageView 와 같은 역할을 하며, Painter 를 기본적으로 지원하고 Bitmap 까지 지원합니다. 해당 Composable 의 파라미터 중 contentScale 은 이미지를 Composable 규격 내에서 어떻게 표시할 것인가를 결정합니다. XML 의 ImageView 속성 중 android:sacleType 속성과 역할이 같습니다. 다음은 각 속성값에 따른 이미지 표시를 정리했습니다. 보다 정확한 비교를 위해 5*5 의 체커보드 이미지를 사용했습니다. 1. Fit 최초로 Image Composable 을 구현하면 적용되어 있는 기본값이 Fit 입니다. 정사..