클린 아키텍처 (Clean Architecture)란?

박예승·2024년 11월 23일


클린 아키텍처는 로버트 C. 마틴(Robert C. Martin) 의 책 클린 아키텍처에서 소개된 소프트웨어 설계 원칙으로, 코드의 유지보수성과 확장성을 높이는 것에 중점을 둔 구조이다. 클린 아키텍처에서 가장 중요하게 여겨지는 핵심은 의존성 규칙(Dependency Rule)이다.

  • Data
  • Domain
  • Presentation

클린 아키텍처에서는 크게 위의 바운더리로 레이어를 구분하고 있으며, 각 레이어는 다음의 요소를 포함하고 있다.

Data Layer

Data Layer는 데이터의 저장, 조회, 외부 API 호출등 데이터와 관련된 모든 작업을 처리한다. Data Layer는 Domain Layer에 필요한 데이터를 제공하며, Presentation Layer나 Domain의 로직에 직접적으로 의존하지 않아야한다.

주요 역할

  • 데이터베이스와의 상호작용 (CRUD 작업)
  • REST API, GraphQL 등 외부 서비스와의 통신
  • 데이터 포맷 변환 및 Domain Layer에 필요한 데이터 전달

구현 요소

  • Repository: 데이터베이스나 외부 서비스에서 데이터를 가져오고 전달하는 인터페이스 (Domain Layer와 의존성 문제를 해결하기 위해 구현체는 Domain에서 인터페이스를 상속한 클래스를 만들어 사용)
  • Data Source: 실제로 데이터를 가져오는 구현체 (SQLite, Firebase, Retrofit 등)

특징

  • 외부 의존성이 많기 때문에 다른 레이어와 철저히 분리해야 함
  • 도메인 레이어에 데이터를 전달하기 위해 변환 작업(Data Mapping)을 수행

Domain Layer

Domain Layer는 서비스의 중심이 되는 레이어로, 핵심 비즈니스 로직을 처리한다. Domain Layer는 다른 모든 레이어로부터 독립적이어야 하며, 서비스에서 처리해야할 내용을 정의하는 역할을 한다.

주요 역할

  • 애플리케이션의 비즈니스 규칙 처리
  • 유스케이스(Use Cases)를 정의하여 기능별 로직 구현
  • 데이터의 흐름을 제어 (Data ↔ Presentation)

구현 요소

  • Entity: 서비스에서 지속적으로 사용되는 핵심 데이터 모델과 규칙
  • Use Cases: 특정 기능을 수행하는 비즈니스 로직

특징

  • 독립적인 레이어로, 외부 프레임워크나 UI와 의존성을 가지지 않음
  • 테스트 용이성(Testability)이 가장 높은 레이어

Presentation Layer

Presentation Layer는 사용자 인터페이스(UI)와 상호작용을 처리하는 Layer이다. 화면에 데이터를 보여주고, 사용자의 입력을 받아 도메인 레이어로 전달하는 역할을 한다.

주요 역할

  • UI를 통해 데이터를 표시하고 사용자 입력을 수집
  • 입력 데이터를 도메인 레이어에 전달
  • 도메인 레이어로부터 받은 결과를 UI에 반영

구현 요소

  • View: 사용자와 직접 상호작용하는 UI 요소. 예: Android의 Activity/Fragment, 웹의 React Component.
  • State Management: View와 Domain Layer를 연결하며, UI에 필요한 데이터 준비 및 상태를 관리 (MVVM: ViewModel, MVC: Controller 등)

특징

  • 도메인 레이어의 결과를 사용자에게 가장 적절하게 전달
  • 도메인 레이어를 호출하지만 도메인 로직은 포함하지 않음
  • UI 변경에 따라 자주 수정되기 때문에 도메인 레이어와 분리되어야 함

정리

클린 아키텍처의 Data, Domain, Presentation Layer는 각자의 역할을 명확히 나눔으로써 코드 품질을 향상시키고, 유지보수와 코드 확장에 유연하게 대응할 수 있도록 한다. 그렇지만 모든 프로젝트에서 클린 아키텍처가 항상 정답인 것은 아니다. 각 프로젝트 별로 그 특징이 있고, 해당 환경에서 빛을 보일 수 있는 설계 방법을 찾기 위해 개발자들은 항상 노력해야한다. 이번 포스트는 클린 아키텍처를 그 노력들 중 한가지 인사이트로써 사용할 수 있게 미리 찾아보고 공부한 내용 정도로 정리하려 한다.

0개의 댓글