[Android] Hilt- Component 계층 구조, Scope (3)
·
Android
Hilt 사용 이유 → 2025.08.12 - [안드로이드] - [Android] Hilt- Hilt를 사용하는 이유 (1)Hilt 프로젝트 세팅, 기본 흐름 → 2025.08.15 - [안드로이드] - [Android] Hilt- 프로젝트 세팅, Hilt 기본 흐름 (2) Hilt의 Component, Scope와 Component의 계층 구조에 대해 알아보겠다.ComponentHilt의 Component는 의존성을 어디에 주입할지 결정하는 역할을 한다. Component 종류는 다음과 같다.Hilt Component의존성 주입 대상생성 시기소멸 시기SingletonComponentApplicationApplication#onCreate()Application 소멸됨ActivityRetainedComp..
[Android] Hilt- 프로젝트 세팅, Hilt 기본 흐름 (2)
·
Android
Hilt 사용 이유 → 2025.08.12 - [안드로이드] - [Android] Hilt- Hilt를 사용하는 이유 (1) 이제 본격적으로 Android에서의 프로젝트 세팅과 Hilt의 기본 흐름에 대해 알아보겠다. 프로젝트 세팅프로젝트 세팅을 위해서는 build.gradle에 먼저 의존성을 추가해야 한다. // Project levelplugin { id("com.google.devtools.ksp") version "2.1.21-2.0.1" apply false id("com.google.dagger.hilt.android") version "2.56.2" apply false}// Module levelplugins { id("com.google.devtools.ksp") id("com..
[Android] Hilt- Hilt를 사용하는 이유 (1)
·
Android
Hilt는 안드로이드에서 의존성을 주입하기 위한 Jetpack 기반 라이브러리이다.지금부터 Hilt를 왜 사용하는지, 어떻게 사용하는지에 대해서 하나씩 알아볼 것이다. 먼저 Hilt를 사용하게 된 이유를 살펴보자.의존성 주입(DI, Dependency Injection)Hilt를 사용하기 전에 직접 의존성을 주입하는 것이 많은 코드를 유발할 뿐더러,객체들의 생명주기를 직접 관리해야 한다는 것을 알아야 한다. ❓의존성 주입이 뭔가요 ?다음 예시를 보자.class Car(private val engine: Engine) { fun start() { engine.start() }}fun main(args: Array) { val engine = Engine() val car ..
[Android] 클린 아키텍처(Clean Architecture)
·
Android
안드로이드 권장 아키텍처는 다음 링크를 참고하기!- - > 2025.07.31 - [안드로이드] - [Android] 안드로이드 권장 아키텍처 Clean Architeture의 개념모든 프로그램을 개발할 때는 유지보수와 장기적인 안정적인 운영을 위해 설계의 견고함과 확장성을 고려해야 한다.안드로이드 애플리케이션도 예외는 아니다.이에 앱의 기능이 점점 확장되고 내부 로직이 변경되는 변화에 유연하게 대응하기 위한 클린 아키텍처가 안드로이드에 도입되었다. 클린 아키텍처의 핵심은 "관심사 분리"에 있다.관심사가 분리되면 결합도가 낮아지고 확장이 쉬워지며, 테스트 또한 훨씬 수월해진다! 이제 클린 아키텍처 다이어그램을 통해 각 책임이 어떻게 구분되는지 살펴보자. 각 구성 요소는 원의 외곽에서 중심으로 의존성을..
[Android] Work Manager(+Job Scheduler)
·
Android
지연 작업을 백그라운드에서 처리하기 위한 서비스에 대해서 살펴보자.만약 백그라운드에서 작업을 처리할 필요가 없으면 코루틴과 스레드 같은 비동기 수행 기능을 사용하면 된다 :) Job Scheduler잡 스케줄러는 백그라운드에서 실행할 작업을 예약하는 서비스이다. Job Info예약된 작업에 대한 상세한 정보 Job Service예약된 작업을 실제로 실행하는 서비스 즉, 스케줄러를 통해 예약한 작업을 타이밍에 맞게 실행하는 역할을 담당한다.❗️ 작업을 예약 또는 실행하는 함수, 작업을 완료했음을 알리는 함수 등 다양한 함수를 제공한다.하지만 잡 스케줄러는 짧은 시간 안에 너무 많은 작업을 예약하거나 앱의 프로세스가 종료되면, 예약된 작업의 실행을 보장하지 않는다. 이에 안정적인 백그라운드의 작업 수행을..
[Android] 안드로이드 권장 아키텍처
·
Android
안드로이드는 보통 계층화된 구조로 설계된다.여러 아키텍처가 있지만, 그 중 안드로이드에서 권장되고 있는 아키텍처에 대해 설명하겠다. 안드로이드 권장 사항안드로이드 권장 아키텍처를 설명하기에 앞서, 현재 안드로이드가 지향하고자 하는 중요한 몇 가지에 대해서 먼저 짚고 넘어가려 한다. 1. 관심사 분리 관심사 분리는 각 구성 요소가 자신의 맡은 일만 담당하도록 책임을 나누는 것이다.마치 SRP(Single Responsibility Principle, 단일 책임 원칙)처럼 말이다.관심사를 분리하게 되면 테스트가 용이해지고 의존성 주입이 쉬워진다. 즉 Hilt 프레임워크를 활용하기에도 좋다. 2. 단방향 데이터 흐름 데이터 일관성과 구조적 명확성에 의해 안드로이드는 단방향 데이터 흐름을 지향한다. 3. 코루틴..
[Android] Fragment의 데이터 통신
·
Android
Fragment가 데이터를 통신하는 방법은 두 가지가 있다. 첫 번째로 ViewModel를 이용하여 데이터를 공유하는 방법,두 번째로는 Fragment Result API를 사용하는 방법이 있다. 이때 Bundle 같은 경우 역시 데이터를 전달하고 불러오는 데에 쓰인다.하지만 생명주기 기반의 UI 데이터 통신에 초점을 맞춘 포스팅이기 때문에 위 두 방법에 대해서 언급하도록 하겠다.😊 두 방법의 차이점은 Fragment Result API는 일회성 통신을 지원한다는 것이다!반면에 ViewModel은 데이터 공유의 주체(Fragment, Activity)의 생명주기에 따라 데이터의 생존(?) 여부가 달라진다. 이제 두 방법에 대해 자세히 알아보도록 하자. ViewModel을 통한 데이터 전달세 경우 모두 ..
[Android] 스레드(Thread)
·
Android
스레드(Thread)스레드는 프로세스 내에서 실행되는 독립적인 실행 흐름, 즉 작업의 최소 단위이다.모든 프로세스는 한 개 이상의 스레드가 작업을 실행한다. 이때, 한 프로세스에서 두 개 이상의 스레드가 동시에 동작하는 것을 멀티스레드라고 한다.※ 프로세스(Process): 앱의 실행 단위 메인 스레드(UI Thread)메인 스레드는 프로세스가 시작될 때 생성되며, UI 스레드라고도 불린다.이름 그대로 메인 스레드에서는 앱의 UI를 그리는 작업을 담당한다. 이러한 메인 스레드는 주의해야 할 점이 있는데 1. UI 스레드를 차단하면 안된다.파일 다운로드처럼 오래 걸리는 작업은 작업자 스레드에서 처리해야 한다.위와 같은 작업을 메인 스레드에서 수행하면 ANR(Application Not Responding)..
[Android] 안드로이드의 4대 컴포넌트
·
Android
컴포넌트(Component)안드로이드의 컴포넌트는 "앱을 구성하는 독립적인 실행 단위"이다.때문에 컴포넌트는 직접 결합하지 않고 안드로이드 시스템을 통해 관리되고 실행된다.컴포넌트는 4가지 종류가 있고, 액티비티(Activity), 서비스(Service), 브로드캐스트 리시버(Broadcast Receiver), 콘텐츠 프로바이더(Content Provider)가 있다. 이제 하나씩 살펴보자. 액티비티(Activity) 컴포넌트액티비티 컴포넌트는 앱의 화면을 구성하는 컴포넌트로, 사용자와 상호작용하는 역할을 한다. 액티비티(Activity) 컴포넌트의 역할- 액티비티 간 전환은 인텐트(Intent)를 통해 이루어진다.- 액티비티는 생명주기(Life Cycle)를 가지고 있어, 관련 메소드들을 재정의할 수..
[Jetpack Compose] Recomposition
·
Android/Compose
Recomposition이란?Jetpack Compose에서 특정 이벤트로 인해 UI의 데이터가 변경되면, 변경된 데이터를 반영하여 해당 Composable 함수가 다시 실행되어 UI가 새롭게 그려지는 과정을 재구성(recomposition)이라고 한다. 간단한 예제를 통해 UI가 어떻게 재구성되는지 알아보자. @Composablefun ClickCounter() { var clicks by remember { mutableStateOf(0) } Button(onClick = { clicks++ }) { Text("I've been clicked $clicks times") }} 1. 클릭된 횟수를 clicks 변수로 선언2. Button을 클릭하면 clicks가 1 증가되어..