Android Repository 패턴을 공부해보자

Assist·2023년 6월 3일
0

Design Pattern

목록 보기
7/7

금요일날 프로젝트를 마치고 졸려 죽겠다 라는 느낌을 처음 받으면서 고향으로 내려오고 블로그 쓰고 오늘도 블로그를 쓴 저에게 아주 큰 칭찬을 합니다 ㅎㅎ...

오늘은 Android Repository 패턴에 대해 공부를 하고 글로 정리를 해볼려고 합니다 .

왜 Repository을 공부를 하는가?

  • 멘토님께 코드 리뷰 받을때 까여서
  • 사수분께 2차로 까여서

분한 마음에 이를 갈고 공부하고 정리해서 나중에 Naver 검색 API 에 적용해볼려고 해요!

일단 Repository 가 뭐냐?

Android Repository

이 그림을 잘보면 Repository에서 Remote Data Source 와 Model에 Data을 가져오는거 같아요.

음 이전에 대학생때 코드를 보면

  • 버튼을 누른다 -> 데이터 요청을한다(view에서) -> 그걸 받고 view에 전시한다

이런식으로 코드를 짠 경험이 있어요
근데 Repository 패턴은 왜 좋은가 ?

Repository 패턴의 장점

  1. 데이터가 한곳으로 와서 처리하는게 편해요
    : 음 이건 제가 공부를 해보면서 제 경험에 생각해서 정리해보았습니다.
    위에서 말한거 같이 view에 모든걸 적용했던 시절 데이터가 변경되거나 할때 view에서 이곳저곳을 돌아다니면서 수정을 했던 기억이 납니다.
    그러나 Repository 패턴을 쓰면 class Repository 만 가서 수정만 하면 끝나는 편리한 구조를 만든거 같습니다.
  2. CRUD 데이터 생성, 읽기 , Update , Delete을 하는 책임이 있어 viewModel은 독립적은 책임을 질수 있어서 좋아요
    예를들어 repository- > viewModel - > view 이런식으로 데이터 흐름이 있다면
    Repository가 서버로부터 받아온 데이터를 맵핑 하고 viewModel에서 view에 맞게 데이터를 수정하면 view는
    view : 난 그냥 전시만 하네 ㅎㅎ 
    각자의 명칭에 맞게 책임을 부여합니다.

한번 적용해보자

  • interface 만들기

음 구글 예제 와 많은 분들의 repository 패턴을 만든것을 보니

interface MyRepository {
    fun getCounter() : LiveData<Int>
    fun increase()
}

class MyRepositoryImpl(counter: Int) : MyRepository {
    private val liveCounter = MutableLiveData(counter)

    override fun getCounter(): LiveData<Int> = liveCounter

    override fun increase() {
        liveCounter.value = liveCounter.value?.plus(1)
    }
}

인터페이스를 상속받아 override 해서 그안에서 작업을 하네요 흠
그럼 제 Naver 검색 api 을 사용할때는 검색때 사용될 함수를 MyRepository 을 만들고 Impl 이란는 클래스를 viewModel Factory에 집어 넣어야 겠군요!

음 조금더 파봅시다 그럼 viewModel은 어떻게 repository에서 데이터가 온것을 알까요?

class MainViewModel(
    _counter: Int,
    private val savedStateHandle: SavedStateHandle,
    private val repositoryImpl: MyRepositoryImpl
) : ViewModel() {

	val counterFromRepo: LiveData<Int> = repositoryImpl.getCounter()
 
 	fun increase() {
        repositoryImpl.increase()
    }

음 다른분이 사용하신 viewModel을 보니 repositoryImpl에서 getCounter라는 함수를 접근하요
getCounter은 liveCounter을 return 을 하니깐요!

아 그럼 이제 전 Naver 검색 API 을 이런식으로 만들 계획입니다.

  • Repository 및 RespoitoryImpl 을 개발
  • Repository에 LiveData을 return 해주는 function을 개발
  • Repository에서 서버로 부터 받아온 데이터를 Mapping 후 viewModel에 토스
  • 만약 ViewModel에서 view에 맞게 데이터 정리를 할경우 시행
  • viewModel에서 서버로부터 받아온 데이터를 Hold 혹시 view가 다른데로 갔다가 돌아올 경우 (이미 어떠한 책을 검색한경우)
  • 그걸로 view다시 배치

음 어느정도 틀이 만들어진거 같습니다!!!!!
그럼 다음 게시글에서는 한번 Repository 와 RepositoryImpl 을 직접 Naver 검색 API 에 맞춰 만들어보는 작업을 해보겠습니다 .

읽어주셔서 감사합니다

-피드백와 비판은 언제나 환영입니다-

profile
안드로이드만 좋아하는 특이한 개발자

0개의 댓글