본문 바로가기
Computer Science/Method

클린 아키텍처

by 코딩맛 2024. 11. 27.

클린 아키텍처란?

소프트웨어 설계 원칙과 구조를 정의하는 방법론으로, 소프트웨어의 보수성과 확장성을 극대화하는 것을 목표로 합니다.

2017년에 로버트 C. 마틴(Robert C. Martin, "Uncle Bob")이 자신의 책 Clean Arichitecture: A Craftsman's Guide to Software Structure and Design에서 소개하며 널리 알려졌습니다.

 

핵심 개념

클린 아키텍처의 핵심은 시스템의 의존성 방향성을 엄격히 제어해, 핵심 비즈니스 로직(엔터프라이즈 로직)이 외부 요소(데이터베이스, 프레임워크, UI 등)에 의존하지 않도록 설계하는 것입니다. 이를 통해 시스템은 변경에 유연해지고, 재사용성과 테스트 용이성이 높아집니다.

 

구조

클린 아키텍처는 여러 층으로 이루어진 원형 구조를 가집니다. 일반적으로 다음 네가지 주요 계층으로 구분됩니다.

 

1. Entities (엔티티)

  • 시스템의 핵심 비즈니스 규칙을 포함하며, 가장 변경에 민감하지 않은 계층입니다.
  • 독립적이어야 하며, 외부 시스템에 의존하지 않습니다.

2. Use Cases ( 유즈케이스)

  • 특정 애플리케이션과 관련된 비즈니스 로직을 정의합니다.
  • 엔티티를 사용하여 애플리케이션의 작업 흐름을 조정합니다.
  • UI나 데이터베이스와는 독립적이어야 합니다.

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

  • 외부 시스템(UI, 데이터베이스, API 등)과 유즈케이스 간의 데이터 변환 및 통신을 담당합니다.
  • 프레젠테이션 계층(컨트롤러, 뷰 등)과 상호작용이 이루어집니다.

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

  • 데이터베이스, 웹 프레임워크, UI 등 외부 기술 요소로 구성된 가장 바깥 계층입니다.
  • 이 계층은 변경될 가능성이 높으므로, 내부 계층과 강하게 결합하지 않아야 합니다.

 

프로젝트 구조

src/main/java
└── com.example.cleanarchitecture
    ├── entity                # Entities (핵심 비즈니스 로직)
    │   └── User.java
    │
    ├── usecase               # Use Cases (응용 서비스)
    │   ├── CreateUserUseCase.java
    │   ├── GetUserUseCase.java
    │   └── UpdateUserUseCase.java
    │
    ├── adapters              # Interface Adapters (데이터 변환/프레젠테이션)
    │   ├── controller
    │   │   └── UserController.java
    │   ├── repository
    │   │   └── UserRepositoryAdapter.java
    │   └── dto
    │       └── UserDTO.java
    │
    ├── frameworks            # Frameworks & Drivers (외부 기술)
    │   ├── repository
    │   │   └── JpaUserRepository.java
    │   ├── config
    │   │   └── SpringConfig.java
    │   └── exception
    │       └── GlobalExceptionHandler.java
    │
    └── CleanArchitectureApplication.java  # 메인 클래스

 

클린 아키텍처의 규칙

1. 의존성 규칙 (Dependency Rule)

  • 캡슐화를 통해 내부 계층을 외부 계층과 분리시킵니다.
  • 내부는 외부를 모르게하며 영향을 받지 않도록 해야합니다.

2. 단일 책임 원칙 (Single Responsibility Principle, SRP)

  • 각 계층은 고유한 목적과 역할을 가져야 합니다.

3. 인터페이스 기반 설계

  • 내부 계층과 외부 계층 간의 통신은 인터페이스를 통해 이루어져야 합니다.

4. 독립성 유지

  • 프레임워크, UI, 데이터베이스와 같은 외부 의존성이 변경되더라도 핵심 로직에는 영향을 미치지 않아야 합니다.

장점

  • 유지보수성 향상 : 의존성을 제어함으로써 특정 기술 변경에 대한 영향을 최소화.
  • 확장성 강화 : 새로운 요구사항 추가에 용이.
  • 테스트 용이성 : 핵심 로직이 독립적으로 분리되어 단위 테스트를 쉽게 작성할 수 있음.

단점

  • 초기 복잡성 : 구조 설계와 계층 구분이 처음에는 복잡할 수 있음.
  • 추가 작업 필요 : 인터페이스와 계층 간 변화 로직 작성에 시간과 비용이 소요됨.

 

마무리

객체지향의 설계 원칙인 SOLID가 클린 아키텍처의 기반이 된다는 사실을 알게되었다.

계층 간 독립성을 유지함으로써 서로 영향을 주지 않고 동작할 수 있어 테스트가 더욱 용이하다는 점이 인상적이었다.

앞으로 프로젝트 설계 초기 단계에서  클린 아키텍처 구조를 적용해보고 싶은 바램이 생겼다.

 

 

 

https://daryeou.tistory.com/280

 

클린 아키텍처(Clean Architecture) 개념 및 원칙

개발이란 마치 여러 개의 기반이 되는 블록을 만들어 설계 원칙에 따라 조립하여 완성해 나아가는 과정이라고 생각합니다. 여기서 설계 원칙은 수 많은 디자인 패턴들을 의미하며, 이번 주는 아

daryeou.tistory.com

 

 

'Computer Science > Method' 카테고리의 다른 글

레이어드 아키텍처  (0) 2024.12.02
Testable Code란?  (0) 2024.11.13
TDD (Test-Driven Development)란?  (1) 2024.11.08