매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

소프트웨어 아키텍처

클린아키텍처

blockbuddy93 2024. 2. 1. 23:57

 

클린아키텍처란?

추상화 개념으로써 관심사를 분리시키고 의존도를 낮추는 것에 목적을 둔 아키텍처를 말합니다.

 

클린아키텍처 레이어 구조

 

안쪽에 위치할 수록 고수준 정책이며, 바깥쪽에 위치할 수록 저수준 정책을 의미합니다.

 

1. 엔티티(Entities)

의도에 따라 도메인 계층으로도 불리며, 엔티티 계층은 하나 이상의 프로그램 간에 공유될 수 있다는 가정하에 만드는 수명이 긴 객체입니다. 즉 재사용 가능성이 높다는것을 인지하고 외부에 의해 변경될 가능성을 낮춰야 합니다. 이곳에 Enterprise 규모의 비즈니스 데이터를 포함함거나 핵심이 되는 비즈니스 규칙을 캡슐화 합니다.

 

2. 유즈케이스

애플리케이션 계층이라고도 불리며, 어플리케이션 규모의 비즈니스 규칙을 포함합니다. 이 레이어의 변경사항은 엔티티에 영향을 미쳐서는 안되며, 인프라 단의 DB, UI, 라이버르리와 같은 외부요소에 의해 영향을 받지 않는다는것을 원칙으로 합니다. 즉 해당 계층의 수정은 응용프로그램의 동작에 영향을 미친다는 의미입니다.

 

3. 인터페이스 어댑터

어댑터 계층은 DB, WEB, UI 와 같은 바깥 계층에서 사용하기 편리하도록, 유즈케이스 또는 엔티티 계층에서 데이터를 변환하는 어뎁터의 집합입니다. 흔히 MVC, MVVM과 같은 아키텍처를 포함하는것이 이 영역으로 컨트롤러, 프레젠터, 게이트웨이 등이 속합니다.

 

4. 프레임워크와 드라이버

인프라 계층이라고도 불리며, 가장 외부에 있는 레이어로, DB,웹 프레임워크 같은 세부정보를 나타내는 계층입니다. 이곳은 보통 글루코드만 작성하며, 시간이 지남에 따라구성이 변경될 수 있으므로 엔티티계층 또는 도메인계층에 추상화하여 도메인 계층에 영향을 주지 않고 인터페이스를 수정하고 업데이트할 수 있습니다.

 

 

클린아키첵처 주요 원칙

 

1. 디펜던시 룰(종속성 규칙)

종속성의 흐름을 제어하는것이 주 목적입니다. 캡슐화를 통해 내부계층과 외부계층을 분리시키고, 내부는 외부를 모르게하며 영향을 받지 않도록 종속성의 흐름을 제어할 수 있습니다.

 

2. 추상화 원리

가장 안쪽에 있는 계층이 제일 추상화된 영역으로 바깥 영역으로 향할 수록 내부 계층을 활용하여 세부사항을 구현합니다.

 

3. SOLID 객체 지향 설계 원칙

통상적으로 사용하는 객체지향 설계원칙에 따릅니다.

 

4. Reuse/release equivalence principle (REP: 재사용/릴리즈 등가 원칙)

재사용 단위는 릴리즈 단위와 같다.

릴리즈에는 관련 없는 클래스 모음을 포함하면 안됩니다. 릴리즈는 재사용 가능하게 만들어야 하며, 독립적으로 배포할 수 있도록 응집력 높은 클래스와 모듈로 구성되어야 합니다.

 

5. Common Closure Principle (CCP: 공통 폐쇄 원칙)

동일한 이유로 동일한 시점에 변경되는 클래스는 같은 컴포넌트로 묶어라
서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라

SOLID 원칙 중 SRP(단일 책임 원칙)을 컴포넌트 단위로 확장한 것으로, SRP에서는 단일 클래스의 변경 이유가 하나여야 하며, 다른 액터에 의해 변경되는 메서드, 함수 집합을 클래스로 추출, 분리하라고 합니다. 마찬가지로 CCP에서는 어떤 요구사항이나 수정에 의해 변경되는 것을 컴포넌트 단위로 분리하는 것입니다.

 

6. Common Reuse Principle (CRP: 공통 재사용 원칙)

컴포넌트 사용자들을 필요하지 않은 것에 의존하게 하지 말라
반대로 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 한다

SOLID 원칙 중 ISP(인터페이스 분리 원칙)을 컴포넌트 단위로 확장한 것으로, ISP에서는 사용하지 않는 메서드가 있는 클래스에 의존하지 말라고 합니다. 마찬가지로 CRP에서는 강하게 결합되지 않은 클래스들을 동일한 컴포넌트에 넣지 말라고 합니다. 반대로 이야기하면, 강하게 결합한 클래스는 동일한 컴포넌트에 위치해야 합니다.

 

7. Acyclic Dependency Principle (ADP: 의존성 비순환 원칙)

컴포넌트 의존성 그래프에 순환이 있어서는 안 된다

종속성에 순환이 있을 경우 하나의 컴포넌트 수정으로 다른 컴포넌트까지의 호환을 함께 확인해야 하는 문제와, 어떤 순서로 빌드를 해야 하는지 파악하는데 문제가 발생합니다. 이를 해결하기 위한 방법으로 DIP(의존성 역전 원칙)을 주로 사용합니다.

 

 

참고

'소프트웨어 아키텍처' 카테고리의 다른 글

레이어드 아키텍처  (0) 2024.01.13
마이크로서비스 아키텍처  (1) 2024.01.13
모놀리식 아키텍처  (0) 2023.12.04