[MSA 알아보기] 4. 클린 아키텍처 (Clean Architecture)

mrcocoball·2023년 12월 17일
0

Architecture

목록 보기
4/5
post-custom-banner

해당 포스트는 MSA에 대한 개념과 주요 기술에 대해 알아보고 실무에 적용했었던 내용을 정리하는 포스트입니다.

1. 클린 아키텍처

개요 및 특징

클린 아키텍처(Clean Architecture)는 소프트웨어 시스템을 독립적인 계층으로 분리하여 변경이나 확장이 쉽도록 하는 소프트웨어 아키텍처입니다. 기본적인 원리는 의존성 규칙을 지키는 것으로, 관심사를 분리시키고 의존도를 낮추는 것을 목적으로 하고 있습니다.

클린 아키텍처의 주요 특징은 다음과 같습니다.

  • 의존성 규칙 : 클린 아키텍처에서는 의존성이 핵심 비즈니스 룰에 가까워질수록 안 좋다고 간주되며, 고수준의 모듈은 저수준의 모듈에 의존하지 않고 대신 둘 다 추상화에 의존해야 합니다.
  • 계층 구조 :

클린 아키텍처는 소프트웨어 시스템을 수정하거나 대체하는데 용이하며 변화에 대한 저항력을 높이고 유지보수를 편리하게 하는 것을 목표로 삼고 있습니다.

헥사고날 아키텍처와의 비교

클린 아키텍처는 헥사고날 아키텍처와 비교하였을 때 다음과 같은 유사점이 있습니다.

  • 의존성 역전 원칙과 단일 책임 원칙 : 두 아키텍처 모두 의존성 역전 원칙과 단일 책임 원칙을 공유하고 있으며, 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라 양쪽이 모두 추상화에 의존하도록 하는 원칙을 적용합니다.
  • 계층 구조 : 두 아키텍처 모두 소프트웨어를 여러 계층으로 나누어 구조화하고 각 계층이 특정 역할을 수행하도록 하는 공통된 원칙을 가지고 있습니다.

반면 뚜렷하게 다른 점도 있습니다.

  • 의존성 방향
    • 클린 아키텍처 : 내부에서 외부로의 의존성 흐름을 허용하지 않음
    • 헥사고날 아키텍처 : 양방향 의존성을 허용(외부 프레임워크 / 라이브러리에 대한 의존성을 외부로 유지하면서도 비즈니스 로직에 대한 의존성을 내부로 갖도록 하는데에 중점을 둠)
  • 모듈의 형태
    • 클린 아키텍처 : 소프트웨어를 엔티티, 유스케이스, 인터페이스 어댑터 등으로 나누고, 이들이 원형으로 배치되어 중심에 비즈니스 룰을 위치시키는 방식을 제안
    • 헥사고날 아키텍처 : 각 계층을 헥사곤 형태로 배치하여 외부와의 인터페이스를 향한 의존성을 분리하고, 개방/폐쇄 원칙을 강조
  • 세부 구현
    • 클린 아키텍처 : 관용적인 구현에 더 엄격한 제약을 둠
    • 헥사고날 아키텍처 : 유연성을 강조하면서도 외부와의 의존성을 효과적으로 관리하는 방법을 중시

2. 클린 아키텍처의 주요 구성 체계

엔티티(Entity)

도메인 계층이라고도 불리며 비즈니스 도메인의 핵심 개념과 규칙을 표현한 것입니다. 비즈니스 도메인의 핵심 개념을 객체로 모델링하고 객체 간의 관계와 상호 작용을 나타냅니다.

엔티티는 핵심 규칙 + 데이터로 구성되며, 고수준 영역이기 때문에 저수준인 유스케이스 영역을 알게 해서는 안됩니다.

엔티티는 간단한 객체여야 하며 프레임워크나 데이터베이스 등 기타 복잡한 것에 의존해서는 안되고 유스케이스 객체를 통해서만 조작되어야 합니다.

유스케이스

어플리케이션 계층으로도 불리며 엔티티를 감싸는 객체로 어플리케이션 규모의 비즈니스 규칙을 포함합니다. 엔티티 내부의 핵심 업무 규칙을 호출하고 시스템을 사용하는 흐름을 담고 있습니다.

유스케이스에서의 변경 사항은 엔티티에 영향을 미치지 않아야 하고 인프라 영역의 DB나 UI, 라이브러리와 같은 외부 요소에 영향을 받지 않아야 합니다.

인터페이스 어댑터

유스케이스 또는 엔티티 계층에서 데이터를 변환해 외부 계층 (DB, Web, UI 등) 에 사용할 수 있도록 해주는 어댑터들의 집합입니다. 대표적인 예시가 컨트롤러, 프레젠터, 게이트웨이가 있습니다.

프레임워크, 드라이버 등

인프라 계층으로도 불리며 가장 외부에 위치한 계층으로 DB, 프레임워크, 입출력 장치, 통신 프로토콜과 같은 세부 사항들을 나타냅니다.

Appendix. 출처

도메인 주도 설계로 시작하는 마이크로서비스
마이크로서비스 패턴

profile
Backend Developer
post-custom-banner

0개의 댓글