본문 바로가기

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

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


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

안녕하세요, 이번 포스팅에서는 Domain Layer에 이어 Data Layer를 살펴보며 클린 아키텍처의 또 다른 핵심 구성 요소인 Data Layer에 대해 설명하고 구현하겠습니다.

Data Layer는 애플리케이션의 데이터 소스와의 상호작용을 관리하는 계층으로, 데이터의 저장, 검색, 업데이트, 삭제 등의 작업을 수행합니다.

이 계층의 목적은 애플리케이션의 나머지 부분, 특히 비즈니스 로직을 담당하는 Domain Layer와 사용자 인터페이스를 담당하는 UI Layer 사이에서 데이터를 중개하는 것입니다.

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

2. Data Layer의 의존성 추가, Data Model, Api Interface 구현

Data Layer에서는 데이터 소스(Data Source), 레포지토리(Repository), 데이터 모델(Data Transfer Object, DTO), 데이터 액세스 객체(Data Access Object, DAO)를 구현하게 됩니다. 이번 시간에는 클린 아키텍처 Data Layer의 이해를 돕기 위해서 로컬 데이터베이스인 Room과 DAO 구현은 제외하고, 의존성 추가와 Data Model, Api Interface 정의를 구현하겠습니다.

2-1. Data Layer를 위한 의존성 추가

먼저, API 통신을 할 수 있도록 retrofit과 관련된 의존성을 추가합니다.
만약, Room도 사용한다면 Room과 관련된 의존성도 추가하면 됩니다.

dependencies {
	// Domain Layer에 대한 의존성
    implementation(project(":domain")) 

    // Retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
    
    ...
}

2-2. Data Model (DTO)

데이터 모델은 데이터베이스, 네트워크 요청 등에서 사용되는 데이터의 구조를 나타냅니다. 영화 데이터 모델을 다음과 같이 정의하겠습니다. MovieData에 확장함수를 구현해서 Domain Layer에서 정의한 MovieEntity로 변환하는 확장함수도 구현했습니다. Data Layer는 Domain Layer에 의존하고 있기 때문에 MovieEntity를 불러올 수 있게 됩니다.

data class MovieData(
    @SerializedName("id") val id: Int,
    @SerializedName("title") val title: String,
    @SerializedName("description") val description: String,
    @SerializedName("category") val category: String,
    @SerializedName("image") val image: String,
    @SerializedName("backgroundUrl") val backgroundUrl: String,
)

fun MovieData.toDomain() = MovieEntity(
    id = id,
    title = title,
    description = description,
    category = category,
    image = image,
    backgroundUrl = backgroundUrl,
)

2-3. Retorift을 이용해서 Movie API Interface 정의

영화 정보를 가져오기 위해서 MovieApi interface를 정의하겠습니다. 여기서는 retrofit을 사용해서 통신을 하게 됩니다. 이렇게 Data Layer는 안드로이드 라이브러리를 사용하게 됩니다. 즉, Domain Layer는 안드로이드 플랫폼에 종속적인 계층이기 때문에 모듈을 생성할 때 'Android Library'를 선택한 것입니다.

interface MovieApi {
    @GET("/movies")
    suspend fun getMovies(@Query("id") movieIds: List<Int>): List<MovieData>
    @GET("/movies/{id}")
    suspend fun getMovie(@Path("id") movieId: Int): MovieData
}

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

이번 시간에는 Data Layer의 구성요소에 대해 소개드렸고 의존성 추가, DTO 구현, Movie Api Interface까지 구현했습니다. Data Layer에서 남은 내용은 Data Source, MovieRepository 구현입니다.

Data Layer의 내용이 길어지는 것 같아서 남은 내용은 Data Layer 2편으로 넘어가겠습니다.