본문 바로가기

안드로이드

FireBaseStorageCleanArchitecutre 예제

FireBase에서 storage에 이미지를 등록하는 절차를 클린아키텍쳐적용한 예제입니다.

 

이 예제를 통해서 공부할 수 있는 기술들

1. AndroidCleanArchitecture

2.FireBase Storage

3.Hilt

4.typealias(쉬운 개념이니 따로 구글링하시는 것도 좋습니다!)

 

예제만 보시고 싶으신 분들은 아래 링크를 참조하시면 되고요.

https://github.com/YunSeokVV/FireBaseStorageCleanArchitecutrePractice

 

주의

google-service.json 파일을 반드시 따로 추가해주셔야 합니다!! 각자 Firebase Console 로 가셔서 프로젝트를 생성하고 나면 확인이 가능해요!

 

주인장이 나름 중요하다고 생각한 부분의 내용을 보고싶으면 아래 글을 봐주시면 될 것 같습니다.

우선 이 프로젝트를 이해하기 위해서는 클린아키텍쳐를 얘기하면 항상 나오는 view, viewModel, useCase, repository에 관해서 선행학습을 하셔야 합니다.

 

AppModule.kt 파일을 깃허브를 보면서 한번 봐주십쇼.

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    fun provideStorageRef() = Firebase.storage

    @Provides
    fun provideStorageRepository(storageReference: FirebaseStorage) : ImageRepositry = ImageRepositryImpl(
        storageReference
    )

    @Provides
    fun provideUseCases(repo: ImageRepositry) = UseCases(uploadImage = UploagImage(repo))
}

 

Hilt의 Module 어노테이션을 사용해서 구현체를 하나씩 만들어주는 역할의 코드입니다.

만약 위와 같은 코드가 없다면... 아래와 같은 방식으로 viewModel, useCase, repository 등등 의존성을 쓰는 모든 클래스에 대해서 인터페이스와 구현체를 직접 만들어 줘야 합니다. 이일을 하지 않기 위해서 위와 같은 코드를 쓰는 것이죠.

interface ImageRepositry {
    suspend fun uploadImageToFirestore(uri : Uri): UploadBookResponse
}

class ImageRepostiryImpl(dataSource : DataSource) : ImageRepository{
	override uploadImageToFirestore(uri : Uri){
    	...
    }
}

 

어쨌든 위와같은 구현체를 따로 만들어주지 않고 view에서 ViewModel 객체를 생성하려고 하면 아래와 같은 에러가 발생합니다.

 

Hilt의 입장에선 구현체를 찾을 수 없으니 아래와 같은 오류가 발생하는 것이죠.

cannot be provided without an @Inject constructor or an @Provides-annotated method.

 

다음은 typealias 개념입니다.

 

ImgeRepostiry.kt

typealias UploadBookResponse = Response<Boolean>

interface ImageRepositry {
    suspend fun uploadImageToFirestore(uri : Uri): UploadBookResponse
}

 

이번에 공부하면서 알게된 개념인데요. 제네릭으로 무한정 깊어지는 댑스를 방지할 수 있어서 좋더군요.

아래와 같은 코드를 훨씬 더 축약할 수 있습니다.

 

typealias UploadBookResponse = Response<Boolean>
// 실제로 이런 괴랄한 코드는 없을것이다. 하지만 단지 이해를 돕기위한 코드니까 이해바란다.
//제네릭의 길이가 상황에 따라서 복잡할 수 있는데 별명을 만들어줘서 쉽게 사용할 수 있다.
typealias Test = Map<String,List<List<String>>>

fun useTest() : Test{
    
    //...
    
    return data
}

 

 

'안드로이드' 카테고리의 다른 글

Flow (안드로이드)  (0) 2024.02.16
Hilt를 이용한 ViewModel 객체 생성  (0) 2024.02.15
viewPager2 Indicator 예제  (0) 2024.02.01
DiffUtil이란?  (0) 2023.11.17
리사이클러뷰 데이터가 꼬일때 해결하는 방법  (2) 2023.11.15