클린 아키텍처

👀·2024년 10월 23일
0

클린 아키텍처란?

  • 로버트 C. 마틴(Robert C. Martin)이 Clean Architecture에서 처음 제시된 개념
  • 소프트웨어 시스템이 안정적이고 확장 가능한 구조를 가질 수 있도록 설계된 아키텍처 스타일
  • 핵심 목표는 애플리케이션의 핵심 비즈니스 로직과 세부 구현 사항을 분리하여 변경에 유연하게 대응하고, 시스템이 다양한 환경에서 쉽게 테스트될 수 있도록 하는 것

주요 특징

독립성: 비즈니스 로직이 외부 시스템(데이터베이스, UI, API 등)에 의존하지 않도록 함.

  • 테스트 용이성: 각 계층이 서로 독립적이기 때문에 유닛 테스트나 통합 테스트가 용이함.
  • 유연성: 시스템의 각 요소가 분리되어 있어, 특정 부분을 교체하거나 확장하는 것이 쉽고 안전함.

클린 아키텍처의 구조

클린 아키텍처는 크게 4가지 계층으로 구성된다.
이 계층들은 원형 구조(계층형 구조)로, 안쪽 계층은 바깥쪽 계층에 의존하지 않으며 바깥쪽 계층이 안쪽 계층을 의존하는 형태를 가집니다. 이를 '의존성 규칙(Dependency Rule)'이라고 부릅니다.

1. 엔티티(Entity)

애플리케이션의 가장 핵심적인 비즈니스 규칙을 담고 있는 계층.
엔티티는 시스템의 독립적인 요소로, 다양한 외부 환경에서 변경되지 않는 핵심 비즈니스 로직을 포함한다.
예를 들어, 금융 애플리케이션에서 '계좌'나 '트랜잭션' 같은 개념이 엔티티에 해당될 수 있다.

이 계층은 다른 계층에 의존하지 않으며, 다른 계층에서 엔티티를 참조할 때 직접 변경되지 않도록 보호받아야 한다.

2. 유스케이스(Use Cases)

유스케이스는 애플리케이션의 비즈니스 로직과 규칙을 구현하는 계층.
애플리케이션에서 발생하는 구체적인 동작들을 정의한다.
유스케이스 계층은 특정 엔티티가 어떻게 사용되어야 하는지에 대한 흐름을 다루며, 시스템의 특정 동작을 구현한다.

이 계층은 비즈니스 로직을 담당하며, 외부의 인터페이스(UI, 데이터베이스 등)와 독립적으로 동작해야 합니다. 따라서 유스케이스는 외부 변경에 최소한의 영향을 받습니다.

3. 인터페이스 어댑터(Interface Adapters)

인터페이스 어댑터 계층은 외부 시스템과 내부 시스템 간의 상호작용을 관리.
주로 프레젠테이션 로직(UI), 데이터베이스 액세스 로직, 웹 API 등의 구현이 여기에 포함된다. 이 계층에서는 유스케이스 계층이 요구하는 형식에 맞춰 데이터를 변환하는 역할을 수행하며, 외부 시스템이 어떻게 동작하는지에 대한 세부 사항을 추상화한다.

이 계층의 역할은 유스케이스와 외부 구현을 느슨하게 연결하여 두 계층 간의 의존성을 최소화하는 것

4. 프레임워크와 드라이버(Frameworks & Drivers)

가장 바깥쪽 계층인 프레임워크와 드라이버 계층은 데이터베이스, 웹 프레임워크, 외부 API, UI 같은 구체적인 기술이 구현되는 곳.
이 계층은 구체적인 구현 세부 사항을 다루며, 엔티티나 유스케이스 계층과는 직접적으로 상호작용하지 않도록 설계되어야 한다.

예를 들어, 웹 프레임워크의 종속성을 여기서만 처리하여, 프레임워크가 변경되더라도 다른 계층에 미치는 영향을 최소화한다.

클린 아키텍처의 의존성 규칙

클린 아키텍처에서 가장 중요한 규칙은 의존성 규칙(Dependency Rule)이다.

이 규칙은 의존성이 바깥쪽에서 안쪽으로만 향해야 한다는 것을 명시한다.
외부 프레임워크나 데이터베이스, UI 요소는 내부의 비즈니스 로직(엔티티, 유스케이스)과 분리되어야 하며, 반대로 비즈니스 로직은 외부 구현에 의존해서는 안된다.

이 규칙을 따르면 시스템의 유연성을 높이고, 특정 기술에 종속되는 문제를 피할 수 있다.

예를 들어, 데이터베이스가 변경되더라도 비즈니스 로직에는 영향을 미치지 않도록 설계할 수 있다.

클린 아키텍처 적용 방법
클린 아키텍처를 실제 프로젝트에 적용할 때는 다음과 같은 단계를 따른다.

1. 비즈니스 로직부터 설계
프로젝트 설계 시 가장 중요한 부분은 비즈니스 로직이다.
엔티티와 유스케이스 계층부터 설계하여 시스템의 핵심 동작을 정의한다. 이때, 구체적인 기술이나 프레임워크에 대한 고려는 최소화하고, 순수한 비즈니스 로직을 중심으로 시스템의 구조를 구축해야 한다.

2. 의존성 분리
유스케이스 계층과 인터페이스 어댑터 계층 사이에서 의존성을 분리해야 한다.
데이터베이스나 UI는 비즈니스 로직에 의존하지 않도록 추상화된 인터페이스를 사용하여 연결한다. 이를 통해 데이터베이스나 프레임워크가 변경되어도 비즈니스 로직이 영향을 받지 않도록 설계할 수 있다.

3. 테스트 가능한 코드 작성
클린 아키텍처는 테스트 용이성을 강조.
비즈니스 로직과 세부 구현이 분리되어 있기 때문에, 핵심 로직에 대해 독립적인 유닛 테스트를 작성할 수 있다. 테스트 가능한 코드를 작성하려면 각 계층이 독립적이고 최소한의 결합도를 유지해야 한다.

4. 외부 의존성의 격리
프레임워크나 외부 라이브러리 같은 외부 의존성은 시스템의 가장 바깥쪽 계층에서만 처리되어야 한다.
클린 아키텍처에서는 외부 의존성을 적절히 격리함으로써 변경에 대한 영향을 최소화한다.
외부 의존성이 바뀌더라도 비즈니스 로직에는 영향을 미치지 않도록 설계한다.

클린 아키텍처의 장점과 단점

장점

  • 유연성:
    각 계층이 독립적이므로, 특정 기술이나 프레임워크에 의존하지 않고 다른 기술로 쉽게 교체할 수 있다.

  • 유지보수성:
    비즈니스 로직과 세부 구현이 분리되어 있어, 수정이나 업데이트 시 다른 부분에 미치는 영향을 최소화할 수 있다.

  • 테스트 용이성: 계층 간 결합이 낮아 단위 테스트 작성이 쉽고, 비즈니스 로직을 쉽게 검증할 수 있다.

단점

  • 초기 설계 복잡성:
    클린 아키텍처는 다소 복잡한 구조를 요구하기 때문에, 초기 설계 시 많은 시간이 소요될 수 있다.

  • 오버 엔지니어링:
    작은 프로젝트나 단순한 애플리케이션에서는 클린 아키텍처가 과도한 설계로 느껴질 수 있다.

0개의 댓글