본문 바로가기
개발/CS지식

[아키텍처] 아키텍처란? - 레이어드 아키텍처(Layered Architecture) & 클린 아키텍처(Clean Architecture)

by 반비🥰 2024. 5. 29.
반응형

 

📌 아키텍처(Architecture)란?


아키텍처(Architecture)는 대개 건축 양식에 많이 사용되는데, 건축물의 뼈대뿐 아니라 특성을 결정짓는 기본 구조를 일컫는다.

 

아키텍처는 모든 분야에 적용할 수 있는데, 엔터프라이즈 아키텍처, 소프트웨어 아키텍처, 시스템 아키텍처 등이 있다. 

다양한 아키텍처 중, 이 글에서는 소프트웨어 아키텍처(Software Architecture)에 대한 내용을 정리해보려고 한다.

 

📌 소프트웨어 아키텍처(Software Architecture) 란?


소프트웨어 아키텍처(Software Architecture)는 소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙이다.(출처 : 위키백과)

 

복잡하고 규모가 큰 소프트웨어를 개발하려면 전체적인 구조가 유기적으로 잘 구성되어야 하므로, 잘 정의된 전체적인 구조와 품질 좋은 소프트웨어를 만들려면 소프트웨어 아키텍처가 필요하다.

 

[ 소프트웨어 아키텍처 특징 ]

  • 간략성 : 이해하고 추론할 정도의 간결성 유지
  • 추상화 : 시스템의 추상적인 표현을 사용(복잡도 관리)
  • 가시성 : 시스템에 무엇이 포함되어야 할지를 보여줌(청사진, 도면)

 

[ 소프트웨어 아키텍처 종류 ]

소프트웨어 아키텍처는 다양한 종류가 있으며, 각각 요구사항과 목적에 맞춰 사용됩니다.

 

1. 계층형 아키텍처(Layered Architecture)

2. 클린 아키텍처(Clean Architecture)

3. 이벤트 기반 아키텍처(Event-Driven Architecture)

4. 마이크로서비스 아키텍처(Microservices Architecture)

5. 서버리스 아키텍처(Serverless Architecture)

6. 헥사고날 아키텍처(Hexagonal Architecture)

7. CQRS(Command Query Responsibility Segregation)

 

이 중, 계층형 아키텍처와 클린 아키텍처의 내용을 정리하려고 한다.

 

📌 레이어드 아키텍처(Layered Architecture)


  • 계층형 아키텍처는 소프트웨어 시스템을 여러 계층으로 나누어 구성하는 설계 방식으로 각 계층은 특정 기능이나 역할을 담당하며, 상위 계층은 하위 계층에 의존하지만 하위 계층은 상위 계층에 의존하지 않는다.
  • 해당 구조는 모듈화와 관심사의 분리를 통해 소프트웨어의 유지보수성과 확장성을 높이는 것을 목표

 

 [ 주요 계층 ]

  1. Presentation Layer - 프레젠테이션 계층
    • 사용자와 상호작용하는 부분
    • UI 요소, 뷰, 프론트엔드 로직
    • 웹 어플리케이션의 경우, HTML, CSS, JavaScript 등이 해당
  2. Application Layer - 애플리케이션 계층
    • 비즈니스 로직을 포함하고 프레젠테이션 계층과 데이터 계층 간의 흐름 제어
    • 애플리케이션 유스케이스를 구현
    • 서비스 클래스, 유스케이스, 애플리케이션 서비스 등 
  3. Domain Layer - 도메인 계층
    • 핵심 비즈니스 로직과 규칙이 위치
    • 엔터티, 도메인 서비스, 도메인 객체 포함
    • 비즈니스 규칙을 캡슐화한 클래스
  4. Data Access Layer - 데이터 접근 계층
    • 데이터베이스와의 상호작용 담당
    • 데이터베이스 접근 로직과 영속성 계층이 위치
    • Repository, DAO(Data Access Object) 패턴

 

  • 각 계층은 바로 아래의 계층에만 의존하며, 상위 계층은 하위 계층의 기능을 호출하여 자신의 작업을 수행한다.
  • 시스템은 더 명확하고 구조화된 형태를 유지할 수 있다.

 

[ 장점 ]

  1. 유지보수 용이성
    • 각 계층이 독립적으로 동작하기 때문에, 한 계층의 변경이 다른 계층에 영향을 덜 미침
    • 코드의 가독성과 관리가 용이
  2. 모듈화
    • 기능별로 모듈화가 잘 되어 있어, 특정 기능을 수정하거나 확장하기 쉽다.
    • 재사용성이 높다.
  3. 테스트 용이성
    • 단위 테스트 및 계층별 테스트가 용이하다.

[ 단점 ]

  1. 성능 문제
    • 계층 간의 호출이 많아지면 성능 저하가 발생할 수 있다.
    • 계층 간의 데이터 전달 과정에서 오버헤드가 발생할 수 있다.
  2. 복잡성 증가
    • 단순한 애플리케이션에서는 계층 구조가 오히려 복잡성을 증가시킬 수 있다.
    • 불필요한 계층을 도입하게 되어 개발 속도가 느려질 수 있다.
  3. 의존성 문제
    • 잘못된 설계 시, 상위 계층이 하위 계층에 과도하게 의존하게 되어 결합도가 높아질 수 있다.

 

📌 클린 아키텍처(Clean Architecture)


  • 클린 아키텍처(Clean Architecture)는 소프트웨어 시스템의 설계를 보다 유지보수 가능하고, 확장 가능하며, 테스트하기 쉽게 만들기 위한 아키텍처 패턴이다.
  • 소프트웨어 구성 요소 간의 의존성을 명확하게 정의하여 시스템의 유연성을 극대화하는 것이 목표이다.

 

[ 주요 원칙 ]

  1. 계층 구조(Layered Architecture)
    • 소프트웨어 시스템을 여러 계층으로 나누어 설계한다.
    • 각 계층은 명확한 책임을 가지며, 특정 기능이나 역할을 수행한다.
  2. 의존성 규칙(Dependency Rule)
    • 의존성은 안쪽 계층에서 바깥쪽 계층으로만 향할 수 있다.
    • 바깥쪽 계층의 변경이 안쪽 계층에 영향을 미치지 않도록 한다.
  3. 경계 설정(Boundaries)
    • 각 계층 간의 명확한 경계를 설정하여 모듈 간 결합도를 낮추고, 각각의 모듈이 독립적으로 동작할 수 있게 한다.
  4. 독립성(Independence)
    • 특정 프레임워크, UI, 데이터베이스, 외부 시스템 등에 종속되지 않도록 설계한다.
    • 비즈니스 로직이 외부 요인에 의해 변경되지 않도록 보호한다.

 

[ 클린 아키텍처의 계층 ]

  1. 엔터티(Entities)
    • 비지니스 규칙과 엔터프라이즈 와이드 규칙이 있는 계층이다.
    • 엔터티는 애플리케이션 전반에서 사용되는 핵심 비지니스 객체와 규칙을 포함한다.
    • 도메인 객체
  2. 유스케이스(Use Cases)
    • 애플리케이션의 특정 비지니스 로직을 담고 있는 계층이다.
    • 유스케이스는 특정 작업이나 트랜잭션을 수행하는 비지니스 규칙을 포함한다.
    • 사용자 로그인, 주문 처리 등의 비지니스 로직
  3. 인터페이스(Interface) 혹은 어댑터(Adapters)
    • 외부 시스템과의 통신을 담당하는 계층이다.
    • 인터페이스는 유스케이스와 외부 시스템 간의 상호작용을 중개한다.
    • 데이터베이스, 웹 API, 사용자 인터페이스
  4. 프레임워크 및 드라이버(Frameworks and Drivers)
    • 구체적인 프레임워크 및 기술 스택이 포함되는 계층이다.
    • 해당 계층은 시스템의 나머지 부분과 독립적으로 작동해야 한다.
    • 웹 프레임워크, 데이터베이스, 드라이버, UI 프레임워크 등

 

[ 장점 ]

  1. 유지보수 용이성
    • 계층 간의 명확한 분리를 통해 코드의 변경이 용이하며, 한 계층의 변경이 다른 계층에 영향을 덜 미친다.
  2. 테스트 용이성
    • 비지니스 로직과 외부 종속성이 분리되어 있어, 단위 테스트 작성이 용이하다.
  3. 유연성
    • 특정 프레임워크나 기술에 종속되지 않기 때문에, 새로운 기술로 전환하는 것이 용이하다.
  4. 확장성
    • 새로운 기능을 추가하거나 기존 기능을 확장하는 것이 상대적으로 간단하다.

 

다음 글은 레이어드 아키텍처와 클린 아키텍처 예제 실습을 기록해볼 예정이다.

 

 

참고 사이트
반응형