앱 개발 시에 고도화된 암복호화 방식을 사용해보기 위해,기존 SharedPreferences를 사용하던 부분을MasterKey 기반 보안 저장소인 EncryptedSharedPreferences로 교체했다.그 과정에서 새롭게 알게된 부분과 겪은 이슈를 정리해보려고 한다.MasterKeyAndroidX Security 라이브러리에서 EncryptedSharedPreferences 또는 EncryptedFile 사용 시 내부적으로 관리되는 AES 암호화용 루트 키앱 내 암복호화 시 공통적으로 사용되는 키를 안전하게 관리하는 객체실제 키는 Android Keystore(System-level secure storage)에 저장됨앱의 인증서/서명에 따라 관리되며, 앱 재설치 시 다른 키로 재생성됨val mast..
4년만에 다시 공부 기록을 시작하려 한다.오랜만에 들어온 블로그 글의 조회수가 아직도 올라가는걸 보니 신기하고, 글로 써놓은 내용은 확실히 더 잘 기억하고 있는 나를 보며 기록의 소중함을 느낀다.이번엔 Jetpack에서 흥미로운 라이브러리들을 공부해보려 한다. android 공식문서에서 jetpack 라이브러리를 잘 활용한 앱 예시를 보던 중, TicTok의 사례에서 아래 내용을 보게 되었다.TikTok의 시작 시간을 줄이기 위해 팀은 Android Jetpack의 앱 시작 라이브러리를 기반으로 시작 프레임워크를 리팩터링했습니다. 어떤 내용인가 살펴보니, 앱과 라이브러리 모두에서 초기화 로직을 간소화 하고 초기화 실행 순서 자체도 제어할 수 있는 사용법은 매우 간단하지만 활용도는 아주 높은 라이브러리였다..
여러 Fragment와 Activity를 연결하며 내가 만든 custom class 타입 객체를 통째로 넘길 일이 생겼다! 똑같이 Intent에 담아 넘기려고 했지만 빨간줄이 생겼고, 몇가지 추가 작업이 필요한 것을 알게 되었다🤔 Serializable (vs Parcelable) Serializable은 객체 직렬화를 위한 표준 Java의 인터페이스이다 인터페이스임에도 불구하고 구현해줘야할 메소드가 없기 때문에 아주아주 간단하게 사용이 가능하다 하지만 처리과정에서 다수의 추가 객체를 생성하므로 생성 저하를 발생시킬 수 있다고 한다 Parcelable은 직렬화를 위한 Android SDK인데, 필수적으로 구현해줘야 하는 메소드가 있으므로 보일러 플레이트가 발생하게 된다 성능은 Parcelable가 더 좋..
프로세스와 스레드 어플리케이션 구성 요소가 시작되면 안드로이드 시스템은 하나의 실행 스레드로 어플리케이션 서비스를 시작한다 기본적으로 같은 어플리케이션의 모든 구성 요소는 하나의 프로세스와 스레드에서 실행된다 (메인 스레드) 구성 요소가 시작되었는데 이미 해당 어플리케이션의 프로세스가 존재할 경우 해당 프로세스 안에서 같은 스레드를 사용한다 필요할 경우, 어플리케이션의 구성 요소가 다른 프로세스로 실행될 수 있고 프로세스에 스레드를 추가로 만들 수 있다 ✔️ 프로세스 운영체제에 의해 메모리에 적재되어 실행중인 프로그램 ✔️ 스레드 프로세스 내에서 실제로 작업을 수행하는 독립적인 주체 ✔️ 멀티 스레드 하나의 프로세스 내에서 두 개의 스레드가 동작하는 것 메인스레드 (UI 스레드) 어플리케이션 실행 시 시..
Activity의 LifeCycle 안드로이드 앱은 여러개의 액티비티가 연결되어있는 구조라고 볼 수 있고, 각 액티비티는 생명주기에 따라 관리된다 액티비티의 클래스는 다음과 같이 6개의 콜백 함수를 제공한다 ✔️ onCreate() 어플리케이션 최초 실행 시 가장 처음으로 한 번 실행되는 함수 해당 Activity의 생명주기 중 딱 한번만 실행되며 viewModel연결과 인스턴스 생성 등 초기화 작업을 이 안에서 실행하면 된다 onCreate() 메소드를 실행 완료하면 Activity는 시작됨 상태에 진입한다 onCreate 함수에 항상 매개변수로 있는 savedInstanceState는 이전 Activity의 상태를 가지고 있는 Bundle객체이다 ex) 세로에서 가로로 화면회전시, onDestroy(..
안드로이드 4대 컴포넌트 안드로이드 앱은 독립된 형태로 존재하며, 고유의 기능을 수행하는 Component(컴포넌트)로 구성되어있다 Activity, Service, Broadcast Receiver, Content Provider 4가지 유형으로 존재한다 각 컴포넌트는 Intent를 통해 서로 상호작용한다 ✔️ Activity (액티비티) UI를 담당하는 컴포넌트이며 사용자와의 상호작용을 담당한다 모든 안드로이드 어플리케이션은 반드시 하나 이상의 Activity를 가진다 LifeCycle 메소드를 재정의하여 원하는 기능을 정의할 수 있다 각 Acitivity는 Manifest에 등록되어 있어야 한다 하나 이상의 view 또는 ViewGroup을 가질 수 있다 두 개의 Activity를 동시에 화면에 보..
Room Room은 구글에서 제공하는 공식 ORM(Object-realational mapping)이다 Room 라이브러리를 사용하면 실행 기기에 앱 데이터 캐시를 만들고 네트워크 연결 여부와 관계없이 보여지게 할 수 있다! Room은 그림과 같은 3가지 요소들로 구성된다 DataBase : 데이터베이스 접근 지점을 제공하며 DAO를 관리한다 Dao : 데이터베이스에 접근할 수 있는 함수들이 정의되어 있으며 이 함수들은 쿼리문을 이용해 구현해줘야 한다 Entity : 데이터베이스 내의 DB 테이블을 나타낸다 Room 적용하기 ✔️build.gradle(app) dependencies { def room_version = "2.2.5" implementation "androidx.room:room-runt..
의존성 주입 (Dependency Injection) 이란❓ 구성 요소간의 코드 내부가 아닌 외부에서 의존 객체를 생성하여 넘겨주는 디자인 패턴중 하나이다 // 내부에서 멤버로 생성 class Person{ private val dog = Dog() fun walk(){ dog.walk() } } fun main(args: Array) { val person = Person() person.walk() } 먼저 위의 경우 Dog 클래스의 인스턴스를 Person 클래스 내부에서 생성해서 사용하게 된다 이 때, Person 클래스는 Dog 클래스에 의존성을 가지고 있다고 할 수 있는데 Dog 클래스에 변화가 생기면 Dog클래스를 참조하는 모든 클래스를 수정해줘야 한다 // 외부에서 생성자로 주입 class ..