Clean Architecture

Danbi Cho·2020년 5월 30일
2

Business Logic?

  • Business Logic은 컴퓨터 프로그램에서 실세계의 규칙에 따라 데이터를 생성, 표시, 저장, 변경하는 부분을 말한다.
  • Business Logic은 유저의 입력(UI)과 DB 사이에서 발생한 정보 교환을 위한 특정 알고리즘이나 규칙이 정의된 tier(계층: 컴포넌트들의 물리적인 분리)이다.

System Architecture?

  • System Architecture는 시스템의 구조(structure), 행위(behavior), 뷰(views)를 정의하는 개념 모델이다.
  • 시스템의 목적을 달성하기 위해 각 컴포넌트가 상호작용 하는 것, 정보가 교환 되는 것을 설명한다.

🤔 이 외에도 다양한 System Architecture가 있지만 목적은 아래와 같이 하나로 생각할 수 있다.

관심사의 분리
소프트웨어를 계층으로 나누면 관심사를 분리할 수 있다.
이러한 목적을 가진 System Architecture는 다음과 같은 시스템을 생성한다.

1. 독립적 프레임워크
System Architecture는 라이브러리 존재 여부나 프레임워크에 한정적이지 않아 도구로써 사용하는 것이 가능하다.

2. 테스트 용이
Business Rule은 UI, DB, Web Server 등 기타 외부 요인과 관계 없이 테스트 가능하다.

3. UI 독립적
시스템의 다른 부분을 고려하지 않고 UI를 변경할 수 있다.

4. Database 독립적
DB 또한 독립적으로 변경할 수 있고 (SQL, Mongo, CouchDB 등) Buiness Rule에 얽매이지 않는다.

5. 외부 기능 독립적
Business Rule은 외부 상황(DB, UI)에 대해 아무것도 모른다.

Clean Architecture란

  • 위와 같은 특징을 가진 System Architecture 개념 중 하나. 간단하게 나타내면 아래와 같이 나타낼 수 있다.

Domain

  • Domain Layer는 Business Logic이 존재하는 영역으로, '편의점에서 물건을 판다.'와 같은 잘 변하지 않는 안정된 영역이다.

Infrastructure

  • Infrastructure Layer는 UI, Database, web APIs, Frameworks 등이 존재하는 영역이다.
  • 이 영역은 Domain에 비해 상대적으로 쉽게, 자주 바뀔 수 있다.
    예를 들어, 전체적인 비지니스 로직을 바꾸는 것보다 UI Button 이나 DB framework를 쉽게 바꿀 수 있는 것과 같다.

Dependency Rule (의존성 규칙)

모든 소스 코드 의존성은 outer에서 inner로 고수준 정책을 향해야 한다.

  • 고수준과 저수준은 추상화의 정도에 따라 분류된다. 추상화가 많이 되어 있을수록 고수준이라고 한다.
  • 추상화란 : 대상에서 특징을 뽑아낸 것으로 프로그래밍에서는 인터페이스 안에 함수를 쓰는 것이 추상화를 하는 방법이다. 코드를 썼을 때 어떤 내용을 수행하는지가 한눈에 파악되지 않을때 추상적이라고 말할 수 있다.

  • Dependency Rule은 Business Logic을 담당하는 코드가 DB 또는 Web과 같이 구체적인 세부사항에 의존하지 않고 독립적으로 실행되야 한다는 규칙이다.

  • inner circle에 해당하는 Domain은 outer circle에 해당하는 Infrastructure에 대해서는 알지 못한다.
    이 뜻은 UI, DB는 Business Rule에 의존하지만 Business Rule은 UI가 웹이건 모바일이건, DB가 SQL이건 NoSQL이건 Business 입장에서는 아무 상관이 없다.


위의 2개로 나눠져 있던 Layer를 더 세분화 하면 아래와 같이 4개의 Layer로 나눌 수 있는데, Domain이 Entities, Use Cases로 세분화 되었고 Adapter가 Domain과 Infrastructure 사이의 경계를 관리한다.

Entity

  • 애플리케이션에서 핵심적인 Business Rule을 가지고 있다.
    이 것은 한 애플리케이션에 종속되지 않고 프로젝트 내의 다양한 애플리케이션에서 사용될 수 있다.
  • OOP 관점에서 볼 때, Entity는 class 내의 method들의 그룹으로 볼 수 있다.

🔖 OOP(Object Oriented Programming)란?

  • 객체의 관점에서 프로그래밍 하는 것을 의미. 객체들의 유기적인 관계를 통해 프로세스가 진행 된다.
    애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말한다.

Use cases

  • 특정 application에 대한 Business Rules이다.
  • Entity에서 데이터를 가져오거나 Application의 동작을 결정한다.
    이 계층 또한 Entity에 영향을 주지 않으며 데이터베이스, UI 혹은 공통의 프레임워크 변경으로부터 영향을 받지 않는다.

Adapter

  • Domain과 Infrastructure 사이에 번역을 하는 역할을 한다.
    이 계층에서 데이터는 Entity나 Use case에 용이한 형태에서 사용하고 있는 프레임워크에 용이한 형태로 변환된다.

Infrastructure

  • 가장 바깥쪽의 계층으로 데이터베이스나 웹 프레임워크 등 일반적으로 프레임워크나 도구로 구성된다.
  • 도메인 계층과 분리되어 있기 때문에, 비교적 쉽게 변경하거나 하나의 구성요소를 다른 구성요소와 교환할 수 있다.
profile
룰루랄라! 개발자 되고 싶어요🙈

0개의 댓글