반응형
- 정의 : 데이터 출처(로컬DB, 서버 API 응답)와 관계 없이 동일 인터페이스로 데이터에 접속할 수 있도록 하는 디자인 패턴
- 발생배경
- 비즈니스 로직은 프로그램의 핵심이 되는 요소이며 보통 데이터베이스나 웹서비스 등의 데이터 저장소에 접근하게 되는데 이 과정에서 여러 문제가 발생(중복코드, 오류 발생 가능성의 코드, 오타, 유닛 테스트 어려움) 함에 따라 몇가지 요구사항이 발생
- 비즈니스 로직과 데이터 레이어를 분리
- 중앙 집중 처리 방식을 통해 일관된 데이터와 로직을 제공해야 함
- 비즈니스 로직은 프로그램의 핵심이 되는 요소이며 보통 데이터베이스나 웹서비스 등의 데이터 저장소에 접근하게 되는데 이 과정에서 여러 문제가 발생(중복코드, 오류 발생 가능성의 코드, 오타, 유닛 테스트 어려움) 함에 따라 몇가지 요구사항이 발생
반응형
- 특징
- 데이터가 있는 여러 저장소를 추상화하여 중앙 집중 처리 방식을 구현
- 데이터를 사용하는 도메인에서는 비즈니스 로직에만 집중할 수 있음
- ex) ViewModel에서는 데이터가 로컬 DB에서 오는지, 서버 API 응답값에서 오는지 출처를 몰라도 됨, Repository를 참조하여 제공해주는 데이터를 이용하기만 하면됨
- Repository가 추상화 되어 있으므로 항상 같은 인터페이스로 데이터를 요청할 수 있음
- 장점
- 데이터 로직과 비즈니스 로직을 분리할 수 있음
- 도메인에서는 일관된 인터페이스를 통해 데이터를 요청
- 데이터 저장소의 데이터를 캡슐화 (객체지향적인 프로그래밍에 적합)
- 단위 테스트를 통한 검증 가능
- 객체 간의 결합도 감소
- 예제 코드
interface SearchUserRepository {
fun searchUsers(
searchUserId: String
): Flow<SearchUsersResponse>
}
interface SearchUserRepository {
fun searchUsers(
searchUserId: String
): Flow<SearchUsersResponse>
}
class MainViewModel(
private val searchUserRepository: SearchUserRepository
) : BaseViewModel() {
private val _userList = MutableLiveData<MutableList<SearchResult>>()
val userList: LiveData<MutableList<SearchResult>> = _userList
private var job: Job? = null
fun searchUsers(searchId: String) {
if (beforeQuery != searchId) {
job?.cancel()
job = viewModelScope.launch {
_isLoading.value = true
beforeQuery = searchId
searchUserRepository.searchUsers(searchId)
.flowOn(Dispatchers.IO)
.collect { response ->
_userList.value = checkFavoriteList(response)
}
}
}
}
}
- 예제 코드
- 참고 사이트
https://heegs.tistory.com/90?category=915533
https://4z7l.github.io/2020/11/24/repository-pattern.html#발생-배경
https://eunjin3786.tistory.com/198
반응형
'Android 개인공부' 카테고리의 다른 글
Coroutine 1부 (0) | 2022.08.18 |
---|---|
MVVM (0) | 2022.07.21 |
Android Custom Progress Dialog (0) | 2021.06.12 |
AAC LifeCycles (0) | 2020.12.16 |
Kotlin? (0) | 2020.11.26 |