본문 바로가기

안드로이드/클린 아키텍처

[안드로이드 클린 아키텍처 시리즈] Data Layer 구현 2편 #7


1. 안드로이드 클린 아키텍처 Data Layer 2편

안녕하세요, 지난 포스팅에서는 Data Layer의 기본 구조, 의존성 추가, 데이터 모델(Data Transfer Object, DTO) 및 Movie API 인터페이스의 정의에 대해 알아보았습니다.

이번 시간에는 Data Layer 구현의 다음 단계로, 실제 데이터 소스(Data Source)와 MovieRepository를 구현하고 Data Layer의 내용을 총 정리하겠습니다.

Data Layer 폴더 구조
Data Layer에 api, dto, data soruce, repository를 구현한 모습

2. Data Layer의 Data Source, MovieRepository 구현

Data Source와 MovieRepository를 구현하면서 Data Layer에 대해 학습하겠습니다.

2-1. Data Layer의 Data Source 구

데이터 소스는 외부 API나 로컬 데이터베이스 등 실제 데이터와의 직접적인 상호작용을 관리합니다. 예를 들어 retrofit을 사용한 외부 API 통신이나 로컬 데이터베이스에 접근해서 데이터 추가, 수정, 삭제 같은 기능 등을 포함합니다. Retrofit 라이브러리를 사용하여 외부 API와 통신하는 데이터 소스를 구현하겠습니다.

interface MovieDataSource {
    interface Remote {
        suspend fun getMovie(movieId: Int): ApiResult<MovieEntity>
    }
}

 

MovieDataSource 인터페이스의 Remote 내부 인터페이스는 영화 데이터를 외부 API로부터 조회하는 함수를 정의합니다.

class MovieRemoteDataSource(private val movieApi: MovieApi) : MovieDataSource.Remote {
    override suspend fun getMovie(movieId: Int): ApiResult<MovieEntity> = try {
        // 외부 API를 통해 영화 정보를 조회
        val result = movieApi.getMovie(movieId)
        // 조회 성공 시, DTO에서 Domain 모델로 변환
        ApiResult.Success(result.toDomain())
    } catch (e: Exception) {
        // 에러 처리
        ApiResult.Error(e)
    }
}

 

MovieRemoteDataSource 클래스는 MovieDataSource.Remote을 구현하여, 실제로 외부 API와의 통신을 담당합니다. 이 클래스에서는 movieApi 인터페이스(앞서 정의된 Retrofit 인터페이스)를 사용하여 특정 영화의 상세 정보를 조회하는 getMovie 함수를 구현합니다.

MovieRemoteDataSource의 구현에서 중요한 점은 데이터를 성공적으로 조회했을 때, DTO(MovieData)에서 도메인 모델(MovieEntity)로의 변환 과정입니다. 이 변환 과정은 비즈니스 로직을 담당하는 도메인 레이어가 사용할 데이터 형식으로 데이터를 제공합니다. 에러가 발생했을 경우, ApiResult.Error를 통해 에러를 전달하며, 데이터를 요청하는 측에서 적절한 에러 처리를 가능하게 합니다.

2-2. Data Layer의 Movie Repository Interface 구현

Repository에서는 비즈니스 로직을 처리하는 등의 작업을 진행합니다. 즉, Repository는 데이터를 앱에 불러오기 위해 Data Source와 ViewModel 사이의 중간다리 역할을 하며, 필요한 DataSource와 Business Logic을 Repsoitory로 가져와 사용합니다. 이를 통해 UI Layer나 Domain Layer에서 Repository의 세부 구현사항에 대해 알 필요 없이 데이터를 사용할 수 있게 됩니다. 아래 예시는 MovieDataSource를 가져와서 getMoive 함수를 호출해주고 있는 모습입니다.

class MovieRepositoryImpl(private val remote: MovieDataSource.Remote) : MovieRepository {
    override suspend fun getMovieDetail(movieId: Int): ApiResult<MovieEntity> = remote.getMovie(movieId)
}

3. 안드로이드 클린 아키텍처 Data Layer 2편 정리

Data Layer는 클린 아키텍처의 중요한 구성 요소로, 애플리케이션의 데이터 관리와 비즈니스 로직 사이의 연결 고리 역할을 합니다.

이 계층에서는 데이터 모델, 데이터 소스, 레포지토리 구현, 그리고 API 인터페이스의 구현을 통해, 외부 또는 내부 데이터 소스와의 효율적인 상호작용을 가능하게 합니다.

다음 시간에는 마지막으로 남은 UI Layer에 대해 자세히 다뤄보겠습니다.