Clean Architecture에서 두 응답 List를 하나의 List로 합치기

김승우·2024년 8월 21일
0

현재 필자는 IT 동아리에서 프로젝트를 진행 중이다. 백엔드 api로부터 두 가지의 응답을 받아 하나의 리스트로 만들려고 한다.
내가 어떠한 키워드로 장소를 검색하면 상단에는 즐겨찾기한 장소가 뜨고 하단에는 검색한 장소가 뜨도록 구현해야 한다.
물론 구현 자체는 어렵지 않지만, 여러 고민을 하다 결론은 domain layer의 UseCase에서 두 응답 List를 하나의 List로 합치기로 하였다. 이유는 여러 가지가 있는데

  1. ViewModel의 비대화 개선
    현재 프로젝트는 간단한 토이 프로젝트가 아니며 MVVM 구조를 사용하기 때문에 당연하게도 ViewModel은 비대해질 수밖에 없다. 이런 상황에서 현재 구현하려는 로직도 ViewModel에 넣는다면 ViewModel의 책임이 더 과도해지고 가독성이 저하되며 코드의 복잡성이 올라갈 것이다.

  2. Useless UseCase 개선
    내가 즐겨찾기한 장소 리스트와 검색 장소 리스트를 각각의 UseCase로 만든다면 특별한 로직 없이 return만 하게 될 것인데 사실상 repository에서 바로 주입받아 사용하는 거랑 큰 차이가 없다. 여러 도메인 모델에 대한 비즈니스 로직을 하나의 UseCase를 만들어 처리하면 ViewModel에서는 도메인 모델에 대한 로직을 알 필요가 없이, 도메인 모델에서 모든 행위를 완료한 채로 데이터를 받을 수 있게 된다.

구현한 코드

class GetLocationListUseCase(
    private val placeRepository: PlaceRepository
) {
    suspend operator fun invoke(search: String): ApiResponse<Flow<List<LocationResponseEntity>>> {
        val locationResponse = placeRepository.getLocations(search).getOrElse { flowOf(emptyList()) }
        val myPlaceResponse = placeRepository.getMyPlace().getOrElse { flowOf(emptyList()) }

        val combinedFlow: Flow<List<LocationResponseEntity>> = combine(
            locationResponse,
            myPlaceResponse
        ) { locationList, myPlaceList ->
            (myPlaceList + locationList).distinctBy { it.placeInfoEntity.title }
        }.flowOn(Dispatchers.IO)

        return ApiResponse.Success(combinedFlow)
    }
}

이렇게 장소를 검색하면 내가 즐겨찾기 했던 장소도 같이 나오는 것을 확인할 수 있다.

0개의 댓글

관련 채용 정보