본문 바로가기

카테고리 없음

클린 아키텍처: 정의와 이유, 그리고 활용

소프트웨어 개발에 있어 구조화된 아키텍처는 유지보수성과 확장성을 높이는 핵심 요소입니다.

그중에서도 클린 아키텍처는 복잡한 시스템을 설계하고 관리하는 데 있어 강력한 가이드를 제공합니다.

이번 글에서는 클린 아키텍처의 정의, 사용하는 이유, 그리고 다른 아키텍처들과의 비교를 통해 클린 아키텍처의 장점을 살펴보겠습니다.

더불어 클린 아키텍처가 도메인 주도 설계(DDD)객체지향 개발(OOP)을 어떻게 지원하는지도 함께 이야기합니다.

클린 아키텍처란?

클린 아키텍처(Clean Architecture)는 로버트 C. 마틴(“Uncle Bob”)이 제안한 소프트웨어 설계 패턴으로, 비즈니스 로직을 외부 시스템(데이터베이스, 프레임워크 등)의 변화로부터 보호하고, 독립적이고 유연한 소프트웨어를 만드는 것을 목표로 합니다.

클린아키텍처의 외부에서 내부로 흐르는 의존성 방향을 나타냅니다.

이 아키텍처는 다음의 주요 개념을 기반으로 설계됩니다.

1. 의존성 규칙(Dependency Rule):

- 의존성은 항상 외부에서 내부로만 흐릅니다.

- 예를 들어, UI 계층은 비즈니스 로직(도메인 계층)에 의존할 수 있지만, 반대로 도메인 계층은 UI 계층에 의존하지 않습니다.

2. 계층 구조:

- 클린 아키텍처는 4개의 계층으로 구성됩니다:

    • Entities(도메인 규칙): 애플리케이션의 핵심 비즈니스 규칙.

     Use Cases(유스케이스): 애플리케이션 계층의 논리적 흐름과 처리.

     Interface Adapters: 외부와 내부 계층 간 데이터 변환 및 연결.

     Frameworks & Drivers: 데이터베이스, UI, 프레임워크 등 외부 기술.

클린 아키텍처를 사용하는 이유

1. 비즈니스 로직 보호:

    - 핵심 비즈니스 로직을 데이터베이스, 프레임워크 등 외부 변화로부터 격리합니다.

    - 외부 기술을 교체하더라도 핵심 로직이 영향을 받지 않도록 설계할 수 있습니다.

2. 유지보수성 향상:

    - 계층별 책임이 명확히 구분되므로, 특정 요구사항이나 기술적 변화가 생겼을 때 변경 범위가 제한됩니다.

3. 테스트 용이성:

    - 외부 의존성을 제거하고 각 계층을 독립적으로 테스트할 수 있으므로, 단위 테스트와 통합 테스트가 용이합니다.

4. 프레임워크 독립성:

    - 특정 프레임워크나 기술에 종속되지 않으므로, 시간이 지나도 지속 가능한 시스템을 구축할 수 있습니다.

클린 아키텍처와 도메인 주도 설계(DDD)

클린 아키텍처는 DDD를 실현하기에 적합한 구조를 제공합니다.

    - 도메인 독립성: 도메인 계층은 외부 의존성과 완전히 독립되어 있습니다. 이는 DDD의 핵심 철학인 “도메인이 외부에 의존하지 않는다”는 원칙과 일치합니다.

    - 유스케이스와 도메인 분리: DDD에서 애플리케이션 서비스와 도메인 서비스가 분리되듯, 클린 아키텍처도 Use Case LayerEntities Layer를 분리하여 이를 체계화합니다.

# 도메인 계층 (Entity)
class Account:
    def __init__(self, balance: float):
        self.balance = balance

    def deposit(self, amount: float):
        if amount <= 0:
            raise ValueError("Deposit amount must be positive")
        self.balance += amount
# 유스케이스 계층
class DepositUseCase:
    def __init__(self, account_repository):
        self.account_repository = account_repository

    def execute(self, account_id: str, amount: float):
        account = self.account_repository.find_by_id(account_id)
        account.deposit(amount)
        self.account_repository.save(account)

- 도메인 계층(Account)은 핵심 비즈니스 로직을 담당.

- 유스케이스 계층(DepositUseCase)은 도메인 계층을 활용해 특정 요구사항을 처리.

클린 아키텍처와 객체지향 개발(OOP)

클린 아키텍처는 OOP의 철학을 기반으로 설계되었습니다. 특히 다음과 같은 OOP 원칙을 강력히 지원합니다:

1. SOLID 원칙 준수:

    - 단일 책임 원칙(SRP): 각 계층이 명확한 역할과 책임을 가집니다.

    - 의존성 역전 원칙(DIP): 추상화에 의존하고, 구현은 나중에 제공됩니다.

2. 캡슐화와 추상화:

    - 각 계층이 자신의 데이터를 보호하며, 필요한 인터페이스를 통해 상호작용합니다.

3. 다형성:

    - 인터페이스 기반 설계로 객체의 구현체를 자유롭게 변경할 수 있습니다.

클린 아키텍처 활용의 실제 효과

1. 프레임워크 교체 용이:

예를 들어, 웹 프레임워크를 Django에서 FastAPI로 변경하더라도 도메인 계층과 유스케이스 계층에는 영향을 주지 않습니다.

2. 테스트 코드 작성 간소화:

    - 도메인 로직과 외부 기술이 분리되어 있어, Mock을 사용해 핵심 로직만을 독립적으로 테스트할 수 있습니다.

3. 유지보수 비용 감소:

    - 계층별로 변경의 영향을 최소화하여, 코드를 쉽게 확장하거나 수정할 수 있습니다.

 

결론

클린 아키텍처는 단순히 소프트웨어를 계층적으로 나누는 것을 넘어, 도메인 주도 설계객체지향 개발의 철학을 구현하기 위한 이상적인 틀을 제공합니다.

- 복잡한 비즈니스 로직을 외부 변화로부터 보호하고,

- 테스트와 유지보수를 용이하게 하며,

- 시간이 지나도 유연성과 확장성을 유지할 수 있는 강력한 아키텍처입니다.