Clean Architecture에 대해서 알아보자 :)

오늘은 Clean Architecture 에 대해서 알아보는 시간을 가져보자! 개발을 진행하면서 조금 더 효율적이고 협업 시 원활한 협업을 위해 아키텍처 디자인 패턴을 좀 신경써서 만들고 있는데 이 와중에 조금 더 나아가서 Clean Architecture에 대한 내용을 적용하며 더욱 효율적인 코드 구현의 필요성을 느끼게 되었다.

 

앞으로 조금 더 신경써서 구현하기 위해 오늘은 Clean Architecture에 대해서 알아보자!

 

Clean Architecture란 무엇인가!

Clean Architecture는 소프트웨어 개발에 사용되는 디자인 패턴 중 하나이다 소프트웨어의 유지보수성과 확장성을 극대화하기 위해 설계되었다. 핵심은 애플리케이션의 비즈니스 로직을 외부의 변화에 민감한 요소들로 부터 분리하는 것이라고 생각하면 된다. 이를 바탕으로 코드 재사용성, 테스트 용이성, 의존성 관리가 개선된다.

 

클린 아키텍처는 대표적으로 세가지 주요 목표를 가지고 구현하는 것을 목적으로 한다.

  • 독립성 : 시스템의 각 계층은 다른 계층에 의존하지 않고 독립적으로 동작할 수 있어야 한다.
  • 가독성 : 코드 구조가 명확해져 각 모듈의 책임이 명확하게 구분된다.
  • 확장성 : 시스템의 변경이 쉽게 이루어지며, 한 계층의 변경이 다른 계층에 미치는 영향을 최소화한다.

Clean Architecture의 구성 요소

클린아키텍처는 크게 네가지 계층으로 나눌 수 있다. 이 계층은 비즈니스 로직을 중심으로 점점 더 구체화되고 바깥쪽으로 갈수록 외부와의 상호작용을 담당한다.

 

Entities

엔터티는 애플리케이션의 핵심 비즈니스 규칙을 캡슐화한 객체이다. 이 계층은 애플리케이션의 비즈니스 로직과 관련된 모든 규칙을 정의한다.

시스템의 다른 부분들과 완전히 독립적이며, 외부 라이브러리나 프레임워크에 의존하지 않아 시스템의 가장 기본적이고 안정적인 요소이다.

Use Cases

유스케이스는 특정 시점에 애플리케이션이 제공해야 할 기능을 정의한다. 이 계층은 엔터티를 조작해 비즈니스 로직을 실현시키고 사용자 요구 사항을 충족시키는 로직을 담당한다.

외부 시스템이나 인터페이스에 의존하지 않으며, 엔터티를 사용해 시스템의 상태를 변경하거나 데이터를 계산하고 반환한다.

Interface Adapters

인터페이스 어뎁터는 비즈니스 로직을 시스템의 다른 부분들과 연결해주는 어댑터이다. 데이터베이스, 웹, 프레임워크, 사용자 인터페이스 등 통신을 담당하며, 비즈니스 로직을 외부 시스템에 맞게 변환하거나 반대로 변환한다.

이 계층은 외부로부터 데이터를 받아 내부 유스케이스로 전달하거나, 내부 데이터를 받아 외부 형식에 맞게 변환하는 역할을 한다.

Frameworks and Drivers

이 계층은 시스템의 가장 외부에 위치하며 실제로 구동되는 구현체들을 포함한다. 여기에는 데이터베이스, 웹 프레임워크, UI 프레임워크, 기타 서드파티 라이브러리 등이 포함된다. 시스템을 구동하는 구체적인 기술적 구현을 담당한다. 예를 들어 데이터베이스 연결, HTTP 서버 설정, UI 프레임워크와의 상호작용 등이 여기에 포함된다.

의존성 규칙

클린 아키텍처의 가장 중요한 규칙은 의존성 규칙이다. 이 규칙에 따르면 의존성은 항상 외부에서 내부로 향해야 한다. 프레임워크나 드라이버 계층이 엔터티 계층을 참조할 수 없고 유스케이스 계층을 참조할 수 없다.

 

이러한 의존성 규칙 덕분에 내부의 핵심 비즈니스 로직은 외부 변화에 영향을 받지 않고 시스템의 유연성과 유지보수성이 높아진다.

 

클린 아키텍처의 장점

  • 유지보수성 : 변경 사항이 발생할 때 코드 수정의 범위가 최소화 된다. 특히 외부 시스템 변경 시 비즈니스 로직에 미치는 영향이 거의 없다.
  • 확장성 : 새로운 기능 추가가 용이하며, 기존 기능에 영향을 주지 않고 시스템을 확장할 수 있다.
  • 테스트 용이성 : 외부 의존성을 분리함으로써 유닛 테스트가 쉬워 진다.
  • 유연성 : 특정 프레임워크나 라이브러리에 대한 의존성이 낮아 필요에 따라 쉽게 교체하거나 수정할 수 있다.

결론적으로는 핵심 비즈니스 로직을 외부 요소로부터 분리하여 코드의 재사용성, 테스트 용이성, 그리고 의존성 관리를 개선한다는데 의의가 있다!

 

오늘은 개념적으로만 알아보았고 다음 시간에는 보다 자세하게 구현 시점에서 알아보도록 하자!

오늘은 여기까지!!