728x90

개인 학습용 토이프로젝트를 헥사고날 구조로  만들다가  MVC , DDD, Hexagonal  정확하게 어떤 차이가 있는지  궁금하여 작성하게 되었다.

1.MVC (Model-View-Controller)
가장 기본적인 아키텍처 패턴

  • 개념:
    • Model: 애플리케이션의 데이터와 비즈니스 로직을 담당합니다. 데이터베이스와 상호작용하며, 데이터의 상태를 관리합니다.
    • View: 사용자에게 보여지는 UI를 담당합니다. Model의 변화를 감지하여 화면을 갱신합니다.
    • Controller: Model과 View 사이의 연결고리 역할을 합니다. 사용자의 요청(입력)을 받아 Model을 업데이트하거나, View를 제어합니다.
  • 장점:
    • 높은 가독성: 역할이 명확하게 분리되어 있어 코드를 이해하기 쉽습니다.
    • 쉬운 학습: 간단한 구조로 인해 초보자도 빠르게 익힐 수 있습니다.
    • 폭넓은 적용성: 웹, 모바일, 데스크톱 등 다양한 환경에서 보편적으로 사용됩니다.
  • 단점:
    • Fat Controller 문제: 비즈니스 로직이 커지면서 Controller가 비대해지는 경향이 있습니다.
    • Model의 책임 과부하: Model이 데이터와 비즈니스 로직을 모두 담당하게 되면서 복잡해질 수 있습니다.
    • 테스트의 어려움: View와 Controller가 밀접하게 연결되어 있어 단위 테스트가 복잡해질 수 있습니다.

소규모 프로젝트 또는 단순 기능 애플리케이션 개발 및 빠른 프로토 타입 필요할때 쓰면 좋을것 같다.


2. DDD (Domain-Driven Design)
도메인 즉 비즈니스 중심으로 설계하는  방법론

  • 개념:
    • Ubiquitous Language (유비쿼터스 언어): 개발자와 비즈니스 전문가가 함께 사용하는 공통의 언어.
    • Domain Model: 비즈니스 규칙과 개념을 담고 있는 핵심 모델.
    • Aggregates, Entities, Value Objects: 도메인 모델을 구성하는 핵심 요소들.
  • 장점:
    • 복잡한 비즈니스 로직에 최적화: 복잡한 도메인을 명확하게 모델링할 수 있습니다.
    • 유지보수 용이: 비즈니스 로직이 변경되어도 유연하게 대응할 수 있습니다.
    • 팀 간의 협업 강화: 유비쿼터스 언어를 통해 개발자와 비즈니스 전문가의 소통을 원활하게 합니다.
  • 단점:
    • 높은 초기 학습 비용: DDD의 개념과 원칙을 이해하는 데 시간이 걸립니다.
    • 과도한 복잡성: 단순한 프로젝트에 적용하면 오히려 불필요한 복잡성을 초래할 수 있습니다.
    • 구현 난이도: 설계부터 구현까지 많은 노력이 필요합니다.

도메인 로직이 복잡하고 핵심적인 애플리케이션 개발  및 장기적으로 유지보수가 중요한 프로젝트에 사용하면 좋을것 같다.


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

port와 adapter사용하여 애플리케이션 핵심로직과 외ㅜ시스템 분리(포트 어댑터 아키텍처라고도부름)

  • 개념:
    • 내부 (Core Domain): 애플리케이션의 핵심 비즈니스 로직.
    • 외부 (Adapters): 외부 시스템(DB, API, UI 등)과의 상호작용을 담당.
    • 포트 (Ports): 내부와 외부를 연결하는 인터페이스. 내부 로직은 포트를 통해 외부와 통신합니다.
  • 장점:
    • 높은 유연성: 외부 시스템(예: 데이터베이스)이 변경되어도 내부 로직에는 영향을 주지 않습니다.
    • 쉬운 테스트: 외부 의존성을 제거하여 핵심 로직에 대한 단위 테스트가 용이합니다.
    • 도메인 로직 보호: 핵심 비즈니스 로직이 외부 환경으로부터 철저히 분리됩니다.
  • 단점:
    • 복잡한 구조: 포트와 어댑터 개념으로 인해 초기 설계가 복잡하게 느껴질 수 있습니다.
    • 오버 엔지니어링: 간단한 프로젝트에 적용하면 오히려 비효율적일 수 있습니다.

향후 외부 시스템 변경 가능성이 높고, 테스트코드 중요성이 높은 프로젝트 ,  DDD와 함께 사용하여 도메인 모델의 경계를 명확히 하고 싶을때 쓰면 좋을것 같다.


 

특징 MVC DDD Hexagonal
핵심 역할 분리 (UI 중심)  비즈니스 도메인 내부 외부 분리(의존성 관리)
적합 규모 소규모, 단순 프로젝트 대규모, 복잡한 프로젝트 유연성과 테스트 중요 프로젝트
장점 쉬운 학습, 높은 가독성 복잡한 도메인에 최적화 높은 유연성, 쉬운 테스트
단점 Fat Controller , 테스트 어려움 높은 학습비용,복잡성 복잡한 구조, 오버 엔지니어링

 

 

서로 베타적인 개념 즉 우위 관계는 아니다.  오히려  DDD  개념을 헥사고날로 구현하거나 헥사고날 기반으로  MVC 적용하는 등 유기적으로 결합하여 사용 가능.

가장 중요한것은 목적과 규모에 맞게 선택!

 

 

728x90

+ Recent posts