F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

안드로이드 개발에서 MVI 아키텍처와 클린 아키텍처의 적용 방법

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



안드로이드 개발에서 아키텍처의 중요성

안드로이드 개발에서 아키텍처는 코드의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다. 특히, MVI(Model-View-Intent)와 클린 아키텍처는 최근 많이 사용되는 패턴 중 하나입니다.

왜냐하면 이 두 가지 아키텍처는 코드의 구조를 명확히 하고, 상태 관리와 데이터 흐름을 체계적으로 관리할 수 있게 해주기 때문입니다.

하지만 소규모 프로젝트에서는 아키텍처의 필요성이 덜 느껴질 수 있습니다. 그럼에도 불구하고 학습 목적으로 아키텍처를 적용하는 것은 개발자의 역량을 키우는 데 큰 도움이 됩니다.

이번 글에서는 MVI와 클린 아키텍처를 안드로이드 프로젝트에 어떻게 적용할 수 있는지, 그리고 이를 통해 얻을 수 있는 이점에 대해 알아보겠습니다.

특히, PDF 스크린과 같은 구체적인 예제를 통해 상태 관리와 데이터 레이어의 역할을 설명하겠습니다.



MVI 아키텍처의 기본 개념과 적용

MVI는 Model-View-Intent의 약자로, UI 상태를 명확히 정의하고 이를 기반으로 상태를 관리하는 아키텍처입니다. 이 패턴은 상태 관리와 데이터 흐름을 단순화하는 데 초점을 맞춥니다.

왜냐하면 MVI는 모든 UI 상태를 단일 상태 객체로 관리하며, 이를 통해 상태의 일관성을 유지할 수 있기 때문입니다.

예를 들어, PDF 스크린에서는 PDF 목록의 로딩 상태, 현재 보고 있는 PDF 파일, 그리고 유저의 액션(예: 다음 페이지 버튼 클릭)을 명확히 정의할 수 있습니다.

이를 구현하기 위해서는 Intent(유저의 행동), Model(데이터), 그리고 View(화면)를 명확히 분리해야 합니다. 아래는 간단한 코드 예제입니다:

sealed class PdfIntent {
    object LoadPdfList : PdfIntent()
    data class OpenPdf(val pdfId: String) : PdfIntent()
}

sealed class PdfState {
    object Loading : PdfState()
    data class Loaded(val pdfList: List) : PdfState()
    data class Error(val message: String) : PdfState()
}

이러한 구조는 상태 관리와 유저 액션의 처리를 명확히 구분할 수 있게 해줍니다.



클린 아키텍처와 데이터 레이어의 역할

클린 아키텍처는 데이터 레이어, 도메인 레이어, 그리고 프레젠테이션 레이어로 나뉘어져 있습니다. 이 구조는 각 레이어 간의 의존성을 최소화하고, 코드의 재사용성을 높이는 데 도움을 줍니다.

왜냐하면 클린 아키텍처는 각 레이어가 독립적으로 동작할 수 있도록 설계되었기 때문입니다.

예를 들어, 데이터 레이어는 로컬 데이터베이스와 파일 시스템, 그리고 원격 API와 같은 데이터 소스에 접근하는 역할을 합니다. 이 레이어는 레포지토리를 통해 추상화됩니다.

아래는 레포지토리의 간단한 예제입니다:

class PdfRepository(private val localDataSource: LocalDataSource) {
    fun getPdfList(): List {
        return localDataSource.fetchPdfList()
    }
}

이러한 구조는 데이터 소스가 변경되더라도 다른 레이어에 영향을 주지 않도록 설계되었습니다.



안드로이드 프레임워크와의 통합

안드로이드 개발에서는 프레임워크와의 통합이 필수적입니다. 하지만 데이터 레이어와 프레임워크 간의 의존성을 최소화하는 것이 중요합니다.

왜냐하면 프레임워크에 강하게 의존하면 코드의 테스트 가능성과 유지보수성이 떨어지기 때문입니다.

예를 들어, 파일 시스템 접근과 같은 작업은 데이터 레이어에서 처리하고, 이를 레포지토리를 통해 뷰 모델로 전달하는 방식으로 구현할 수 있습니다.

아래는 파일 시스템 접근을 추상화한 예제입니다:

class FileDataSource(private val context: Context) {
    fun readPdfFiles(): List {
        // 파일 시스템 접근 코드
    }
}

이러한 접근 방식은 데이터 레이어와 프레임워크 간의 의존성을 줄이고, 코드의 유연성을 높이는 데 도움을 줍니다.



테스트 코드와 아키텍처의 연계

아키텍처를 설계할 때 테스트 가능성을 고려하는 것이 중요합니다. 특히, 레포지토리와 뷰 모델을 인터페이스로 추상화하면 테스트 코드를 작성하기가 훨씬 쉬워집니다.

왜냐하면 인터페이스를 사용하면 실제 구현체 대신 목(Mock) 객체를 사용하여 테스트를 수행할 수 있기 때문입니다.

아래는 간단한 테스트 코드 예제입니다:

@Test
fun `should return pdf list`() {
    val mockRepository = mock(PdfRepository::class.java)
    `when`(mockRepository.getPdfList()).thenReturn(listOf(Pdf("Sample.pdf")))

    val viewModel = PdfViewModel(mockRepository)
    val result = viewModel.loadPdfList()

    assertEquals(1, result.size)
}

이러한 테스트 코드는 코드의 품질을 높이고, 버그를 사전에 방지하는 데 큰 도움이 됩니다.



결론: 아키텍처 설계의 중요성

안드로이드 개발에서 MVI와 클린 아키텍처는 코드의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다. 이를 통해 상태 관리와 데이터 흐름을 체계적으로 관리할 수 있습니다.

왜냐하면 이러한 아키텍처는 코드의 구조를 명확히 하고, 테스트 가능성을 높이며, 개발 생산성을 향상시키기 때문입니다.

특히, 학습 목적으로 아키텍처를 적용하는 것은 개발자의 역량을 키우는 데 큰 도움이 됩니다. 이를 통해 실제 프로젝트에서도 더 나은 코드를 작성할 수 있습니다.

이번 글에서 소개한 내용을 바탕으로, 여러분의 프로젝트에 MVI와 클린 아키텍처를 적용해 보시길 권장합니다.

더 나아가, 테스트 코드 작성과 같은 실질적인 연습을 통해 아키텍처 설계의 중요성을 체감해 보시길 바랍니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
F-Lab
소개채용멘토 지원
facebook
linkedIn
youtube
instagram
logo
(주)에프랩앤컴퍼니 | 사업자등록번호 : 534-85-01979 | 대표자명 : 박중수 | 전화번호 : 1600-8776 | 제휴 문의 : info@f-lab.kr | 주소 : 서울특별시 종로구 돈화문로88-1, 3층 301호 | copyright © F-Lab & Company 2025