Developing Myself Everyday
[2] MVVM Repository에 Room과 Hilt 사용하기
Android/Kotlin 2023. 6. 19. 12:02

이 게시글은 아래의 게시글에서 이어진 내용입니다. [1] MVVM Repository에 Room과 Hilt 사용하기 만약 MVVM Repository 패턴에 대한 이해가 부족하다면 아래의 게시글을 갔다가 오기 바란다. MVVM Pattern with Repository Pattern(저장소 패턴) by Kotlin MVVM에 대한 설명은 아래의 게시글에서 확인하길 바란다. everyday-develop-myself.tistory.com Hilt & Dagger2 Hilt는 Dagger2를 기반으로 한 안드로이드용 의존성 주입 라이브러리이다. 안드로이드 애플리케이션의 구성 요소 간의 의존성을 관리하고 의존성을 주입하는 기능을 제공한다. Dagger2 ❔ Dagger2는 Google에서 개발한 Java 및 ..

[1] MVVM Repository에 Room과 Hilt 사용하기
Android/Kotlin 2023. 6. 19. 11:07

Room 이란? 데이터베이스에 데이터를 가져오려면 기본적으로 우리는 서버를 거치고 REST API를 사용해야 한다. 이렇게 되면 데이터베이스에 접근이 불편하고 번거롭다. 그리고 컴파일 타임에서 오류를 검출할 수 없게 된다. Room은 이런 번거로움을 한번에 해결해준다. Room은 안드로이드 영구 저장소 솔루션 중 하나로, SQLite 데이터베이스 위에 구축된 ORM(Object-Relational Mapping) 라이브러리이다. Room은 데이터베이스 작업을 쉽게 수행할 수 있도록 추상화된 인터페이스를 제공하며, 데이터베이스 스키마를 객체로 표현하여 개발자가 직접 SQL 쿼리를 작성하는 번거로움을 줄여준다. Room의 주요 구성 요소는 다음과 같다: Entity(엔티티): 데이터베이스 테이블과 매핑되는 ..

[Kotlin Coroutine] (6) - 채널 2
Android/Kotlin 2023. 6. 8. 09:58

ConsumeEach() 그럼 명시적인 이터레이션을 사용하지 않고 채널에 있는 내용을 수신할 수는 없을까?? 이를 위한 메서드가 바로 consumeEach()이다. channel.consumeEach { println("Receiving Num $it") delay(100) } 위의 함수를 사용하면 송신측의 receive를 했을 때와 똑같은 결과를 얻을 수 있다. 또한 한 채널에서 생성한 데이터를 여러 개의 수신측이 가져갈 수도 있다. 이를 통해 데이터를 분류해서 처리할 수 있게 될 것이다. Produce() sequence() 함수와 비슷한 동시성 스트림을 생성할 수 있는 produce()라는 코루틴 빌더가 있다. 이 빌더는 ProducerScope 영역을 도입한다. fun main() { runBlo..

article thumbnail
RxJava에 대해
Android/Kotlin 2023. 6. 6. 20:44

RxJava에 대한 공부를 시작하는 이유 요즘 프로젝트를 진행하면서 Retrofit2를 이용해 서버와 통신을 많이 진행하고 있다. 네트워크 요청은 Call 객체를 통해 비동기적으로 수행되고, enqueue() 메서드를 호출해 비동기로 요청을 실행하거나 execute() 메서드를 호출하여 동기적으로 실행할 수 있다. 예시는 아래와 같다. interface MyApiService { @GET("users/{id}") fun getUser(@Path("id") userId: String): Call } val BASE_URL = "baseurl" val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFacto..

article thumbnail
[Kotlin Coroutine] (5) - Channel (채널)
Android/Kotlin 2023. 6. 6. 14:00

채널이란? 채널은 2개의 코루틴 사이를 연결할 수 있는 파이프 같은 것이다. 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있다. 만약 채널 내부의 용량이 다 찼는데 데이터를 채널에 보내려고 하면, 채널은 현재 코루틴을 일시 중단시키고 나중에 재개하게 된다. 이 부분이 자바의 동시성 API에서의 Blocking Queue와 채널의 가장 큰 차이이다. 채널의 타입 채널의 타입은 크게 4가지로 나눌 수 있다. 1. Buffered 2. Rendezvous (Unbuffered) 3. Unlimited 4. Conflated 이제부터 이 4가지의 타입을 어떻게 사용하는지 알아보겠다. 1. Buffered 고정된 크기의 버퍼를 생성하는 타입이다. 아래의 예제를 보자 fun main() { runBlocking..

[Kotlin Coroutine] (4) - 예외 처리
Android/Kotlin 2023. 6. 5. 16:54

예외 처리의 경우, 코루틴 빌더들은 다음의 전략을 따른다 1. 부모 코루틴이 자식에게 발생한 오류와 동일한 오류로 취소된다. 2. 자식들이 모두 취소되면 부모는 예외를 코루틴 트리의 윗부분으로 전달한다. 아래의 코드를 보면서 이해해보자 코드 fun main() { runBlocking { launch { throw Exception("A에 에러 발생") println("A 완료") } launch { delay(1000) println("B 완료") } println("메인") } } 결과 메인 Exception in thread "main" java.lang.Exception: A에 에러 발생 위의 코드를 보게 되면 최상위 코루틴이 "A 완료" 를 시작하기 전에 예외가 발생한다. 이로 인해 최상위 코루..

[Kotlin Coroutine] (4) - 코루틴 컨텍스트(JOB)
Android/Kotlin 2023. 6. 2. 11:10

잡은 동시성 작업의 생명주기를 표현하는 객체이다. 잡을 사용하면 작업 상태를 추적하고 필요할 때 그 작업을 취소할 수 있다. 잡의 객체에는 3개의 상태변수가 있다. isActive: 잡이 활성화 되었는지 isCancelled: 잡이 취소중이거나 취소 뒤었는지 isCompleted: 잡이 완료되거나 취소 되었는지 잡은 생성되자 마자 디폴트 상태인 활성화 상태가 된다. 잡을 생성할 때, CoroutineStart 타입의 파라미터를 지정해서 초기 상태를 지정할 수도 있다. CoroutineStart.DEFAULT: 디폴트 동작이며 잡을 즉시 시작한다. CoroutineStart.LAZY: 잡이 신규 상태가 되고 시작을 기다리게 된다. 다음의 예제를 보자 코드 fun main() { runBlocking { v..

[Kotlin Coroutine] (3) - 코루틴 스코프과 컨텍스트(Dispatcher)
Android/Kotlin 2023. 6. 2. 10:01

지금까지 살펴본 코루틴은 GlobalScope에서만 실행되었다. 경우에 따라서는 어떤 연산을 수행하는 도중에만 실행되기를 원할 수 있다. 어떤 코루틴을 다른 코루틴의 문맥에서 실행하면 후자가 전자의 부모가 되고 이런 관계로 인해 이런 실행 시간 제한이 가능하게 된다. 자식의 실행이 모두 끝나야 부모가 끝날 수 있도록 자식의 생명 주기가 연관된다. 이런 기능을 구조적 동시성이라고 부르며, 블럭이나 서브루틴을 사용하는 경우 구조적 동시성을 비교할 수 있다. 다음은 이런 구조적 동시성을 나타낸 예제이다. import kotlinx.coroutines.* fun main() { println("메인 스레드 시작") runBlocking { println("부모 task 시작") launch { println("..