본문 바로가기
용어 사전

클린 아키텍처(Clean Architecture)란?

by 테크원 2023. 7. 10.
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)

클린 아키텍처(Clean Architecture)

클린 아키텍처(Clean Architecture)란?

클린 아키텍처는 로버트 마틴(Robert C. Martin)이 저술한 책인 "클린 코드(Clean Code)"에서 제안한 시스템 아키텍처로, 기존의 계층형 아키텍처에서 벗어나고 의존성을 최소화하는 설계를 말합니다.

 

클린 아키텍처의 핵심 아이디어는 소프트웨어 시스템을 다양한 레이어와 컴포넌트로 구성하고, 각 컴포넌트 사이의 의존성을 역전시켜 유연하고 유지보수 가능한 시스템을 만드는 것입니다. 이를 위해 클린 아키텍처는 다음과 같은 주요 개념을 제시합니다.

의존성 역전 원칙(Dependency Inversion Principle)

클린 아키텍처에서는 고수준 모듈이 저수준 모듈에 의존하는 대신, 추상화에 의존해야 한다는 원칙을 강조합니다. 이는 인터페이스나 추상 클래스를 통해 의존성을 정의하고, 구체적인 구현에 의존하지 않도록 하는 것을 의미합니다. 이를 통해 시스템의 의존성이 역전되어, 변경에 대해 더욱 유연하고 확장 가능한 아키텍처를 구현할 수 있습니다.

경계(Boundary)

클린 아키텍처는 시스템을 내부와 외부로 구분하는 경계를 정의합니다. 외부 요소는 사용자 인터페이스(UI), 데이터베이스, 외부 서비스 등을 포함하며, 내부 구성 요소는 이러한 외부 요소와의 결합을 최소화하도록 설계됩니다. 이를 통해 시스템의 내부 구조는 변경에 대해 격리되며, 테스트 및 유지보수가 용이해집니다.

레이어(Layer)

클린 아키텍처는 레이어 아키텍처를 사용하여 시스템을 구성합니다. 일반적으로, 표현(Presentation), 애플리케이션(Application), 도메인(Domain), 인프라스트럭처(Infrastructure)와 같은 레이어를 포함합니다. 각 레이어는 특정한 역할과 책임을 가지며, 의존성은 내부에서 외부로 향하도록 구성됩니다. 이를 통해 시스템은 레이어 간의 분리와 모듈화를 통해 유지보수 가능한 구조를 유지할 수 있습니다.

 

클린 아키텍처는 코드의 의존성과 결합도를 최소화하고 유지보수성과 확장성을 향상시키는 중요한 개념과 원칙을 제공합니다. 이를 통해 소프트웨어 시스템은 변경에 유연하게 대응하고 품질을 향상시키며, 개발자들은 유지보수 가능한 코드를 작성할 수 있습니다.

 

클린 아키텍처와 SOLID 원칙

클린 아키텍처 접근 방식은 시스템의 유연성, 확장성, 유지보수성을 개선하고, 코드의 의존성과 결합도를 최소화하기 위해 SOLID 원칙과 관련된 개념을 활용하며, 각 원칙과 클린 아키텍처의 구성 개념 간의 관계를 살펴보면 다음과 같습니다.

SRP(Single Responsibility Principle) - 단일 책임 원칙

- 클린 아키텍처에서 엔티티(Entities)는 단일 책임을 가지는 객체로 설계됩니다.

- 각 엔티티는 한 가지 책임만을 갖고, 하나의 변경 이유에 집중하여 시스템의 특정 부분에 대한 변경을 최소화합니다.

OCP(Open/Closed Principle) - 개방-폐쇄 원칙

- 클린 아키텍처에서 인터페이스 어댑터(Interface Adapter) 레이어를 통해 OCP 원칙을 따릅니다.

- 외부 인터페이스와의 상호작용을 위해 인터페이스를 사용하여 시스템을 확장 가능하고 변경에는 닫혀 있도록 설계합니다.

LSP(Liskov Substitution Principle) - 리스코프 치환 원칙

- 클린 아키텍처에서는 상위 레이어와 하위 레이어 간의 의존성을 관리하여 LSP 원칙을 지킵니다.

- 하위 레이어는 상위 레이어의 역할을 완전히 대체할 수 있어야 하며, 이를 통해 다형성을 활용한 유연하고 일관된 시스템을 구축합니다.

ISP(Interface Segregation Principle) - 인터페이스 분리 원칙

- 클린 아키텍처에서는 인터페이스 어댑터(Interface Adapter) 레이어와 프레젠테이션(Presentation) 레이어를 통해 ISP 원칙을 따릅니다.

- 각 클라이언트에게 필요한 기능에 대한 작고 구체적인 인터페이스를 제공하여 클라이언트가 불필요한 의존성에 노출되지 않도록 합니다.

DIP(Dependency Inversion Principle) - 의존관계 역전 원칙

- 클린 아키텍처는 DIP 원칙을 중요하게 다루며, 의존성 주입(Dependency Injection)을 활용합니다.

- 상위 레이어는 하위 레이어에 의존하지 않고 추상화에 의존함으로써 의존성을 역전시키며 이를 통해 시스템의 결합도를 낮추고 유연성과 확장성을 개선합니다.

 

 

클린 아키텍처의 장점

의존성 관리: 클린 아키텍처는 각 구성 요소 간의 의존성을 관리하고 분리함으로써 시스템의 유연성과 재사용성을 높입니다. 예를 들어, 비즈니스 로직은 외부 프레임워크나 라이브러리에 의존하지 않고 순수한 비즈니스 규칙으로 구현되는데 이는 코드를 변경하거나 대체할 때 다른 부분에 미치는 영향을 최소화하며 특정 기술 스택에 종속되지 않고도 코드를 재사용할 수 있는 장점을 제공합니다.

 

테스트 용이성: 클린 아키텍처는 단위 테스트, 통합 테스트, 자동화된 기능 테스트 등 다양한 테스트 수준을 지원하도록 설계되어 있습니다. 각 구성 요소는 독립적으로 테스트할 수 있으며, 의존성을 모의(mock) 객체나 스텁(stub) 등으로 대체함으로써 테스트 환경을 구성하기 쉽습니다. 이는 품질이 높은 소프트웨어를 개발하는 데 도움을 줄 뿐만 아니라, 변경 사항에 대한 신속한 피드백과 안정성을 제공하는데 도움을 줍니다.

 

확장성: 클린 아키텍처는 시스템을 구성하는 각 계층이나 컴포넌트가 독립적으로 확장될 수 있는 구조를 제공합니다. 새로운 기능을 추가하거나 비즈니스 요구 사항이 변경될 때, 해당 영역의 구성 요소만 수정하고 대부분의 시스템은 영향을 받지 않습니다. 이는 시스템의 복잡성을 관리하고 코드의 재사용을 촉진하여 개발 생산성을 향상시키는데 도움을 줍니다.

 

유지보수성: 클린 아키텍처는 시스템의 유지보수성을 높이기 위해 명확한 구조와 모듈화를 제공합니다. 각 계층이나 컴포넌트는 특정 책임 영역을 가지고 있고, 변경 사항이 해당 영역으로 집중되므로 코드베이스의 일부를 이해하고 수정하는 것이 상대적으로 쉬워집니다. 이는 버그 수정, 기능 개선, 새로운 요구 사항의 추가 등과 같은 유지보수 작업을 단순화하고 효율적으로 수행할 수 있도록 도와줍니다.

 

확장성과 배포 가능성: 클린 아키텍처는 비즈니스 규칙과 사용자 인터페이스와 같은 핵심 기능을 외부 인터페이스와 분리하는데 이를 통해 시스템을 여러 플랫폼이나 환경에 대해 쉽게 확장하고, 마이크로서비스 아키텍처나 클라우드 기반 아키텍처와 같은 현대적인 개발 패러다임을 적용하는 데 유리합니다.

 

클린 아키텍처의 단점

복잡성: 클린 아키텍처는 시스템을 여러 계층과 컴포넌트로 분리하여 복잡성을 관리하려는 목표를 가지고 있습니다. 하지만 이로 인해 초기 개발 단계에서는 구조의 설계와 구현에 더 많은 시간과 노력을 투자해야 할 수 있습니다. 또한, 너무 많은 계층이나 컴포넌트가 있을 경우 개발자들 사이의 의사소통과 협업에 어려움을 줄 수도 있습니다.

 

학습 곡선: 클린 아키텍처는 기존의 전통적인 아키텍처 패턴과는 다른 접근 방식을 채택하고 있습니다. 따라서 개발자들에게 새로운 개념과 원칙을 익히고 적용하는 데 시간과 노력이 필요합니다. 특히, 경험이 부족한 개발자들이나 팀에 클린 아키텍처를 도입하는 경우 초기 학습 곡선을 극복해야 할 수 있습니다.

 

성능 저하 가능성: 클린 아키텍처는 시스템의 유연성과 유지보수성을 강조하므로, 일부 경우에는 성능에 약간의 저하가 발생할 수 있습니다. 여러 개의 계층이나 인터페이스를 통과해야 하는 과정이 늘어나기 때문입니다. 하지만 이는 대부분의 시스템에는 큰 문제가 되지 않으며, 성능 최적화가 필요한 부분에 대해서는 최적화 기법을 적용할 수 있습니다.

 

개발자의 이해도: 클린 아키텍처는 개발자들에게 독립적인 컴포넌트를 다루는 방법과 구성 요소 간의 상호작용에 대한 이해도를 요구합니다. 일부 개발자들은 이러한 추상화 수준과 아키텍처의 복잡성으로 인해 이해하기 어려워할 수 있습니다. 따라서 충분한 교육과 학습 기회를 제공하여 개발자들이 클린 아키텍처의 원칙과 구조를 이해하고 적용할 수 있도록 지원해야 합니다.

 

초기 비용: 클린 아키텍처를 도입하려면 기존 시스템의 변경이 필요할 수 있으며, 이는 초기 비용이 발생할 수 있습니다. 기존의 모놀리식 아키텍처를 분리하거나, 모듈화 및 추상화를 위한 리팩토링 작업을 수행해야 할 수도 있습니다. 이는 초기 투자와 시간이 필요하며, 기존 시스템의 안정성을 유지하면서 변경 작업을 수행해야 함을 의미합니다.

 

정리

클린 아키텍처는 소프트웨어 개발의 분야에서 중요한 원칙과 개념을 제공하는 도구로 시스템을 구축하고 유지 관리하는 과정에서 더 나은 코드 품질, 확장성, 유지보수성을 실현하는 데 도움을 줍니다. 클린 아키텍처는 강력한 모듈화와 의존성 관리를 통해 시스템을 더욱 견고하게 만들고, 유연하게 확장하고, 변경에 대한 영향을 최소화할 수 있도록 도와줍니다.

 

클린 아키텍처는 단순히 코드의 구조를 개선하는 것 이상의 의미를 가지고 있는데, 개발자와 팀이 더 나은 소프트웨어 시스템을 구축하고 유지할 수 있도록 돕는 철학이라 할 수 있으며, 이 아키텍처 원칙을 따르면서 유지보수성이 뛰어나고 확장 가능한 소프트웨어 시스템을 만들 수 있고 품질과 생산성을 향상시킬 수 있습니다.

 

더 나아가 클린 아키텍처는 개발자 커뮤니티 전반에 큰 영향을 미치고 있습니다. 이 원칙들은 소프트웨어 아키텍트, 개발자, 팀 리더 등에게 널리 퍼져가고 있으며 더 나은 소프트웨어 아키텍처 설계와 개발 방법론을 촉진하고 있습니다.

 

클린 아키텍처는 지속적인 학습과 실습이 필요한 개념으로 이러한 원칙과 개념을 현실 세계의 프로젝트에 적용하여 더 효율적이고 견고한 소프트웨어 시스템을 구축할 수 있습니다. 지속적인 학습과 개선을 통해 클린 아키텍처의 장점을 극대화한다면 혁신적인 소프트웨어 시스템을 개발하는데 큰 도움이 될 수 있습니다.

 

반응형