CS지식 및 용어 정리 (설계 패턴 + 방법론)

4계층 아키텍처 VS 헥사고날 아키텍처

Dev.99_tale 2025. 4. 5. 00:41

보통 계층형 아키텍처로 4계층 아키텍처(4-Layer)로 패키지 구조를 잡고 진행하다가 마지막 프로젝트 헥사고날 프로젝트로 진행

✅ 4계층 아키텍처 (Presentation, Application, Infrastructure, Domain)의 효율적인 점

- 역할 즉, 관심사를 명확히 나눠서 유지보수와 테스트가 쉬워지고, 코드의 변경에 강해서 유연한 확장이 가능

  • 관심사의 분리(Separation of Concerns)
    → 각 계층의 역할이 명확하여 코드 구조가 직관적이고 유지보수가 쉬움
  • 유연한 변경과 확장
    → 비즈니스 로직(Domain)과 기술 구현(Infrastructure)이 분리되어 변경에 강함
  • 테스트 용이성
    → 의존성 주입과 계층 분리 덕분에 단위 테스트, 통합 테스트 작성이 수월함
  • 모듈화 및 재사용성
    → 도메인 로직과 인터페이스가 분리되어 여러 환경에서 재사용 가능
  • 개발 협업에 유리
    → 팀원 간 계층 별로 역할을 나누기 쉬워 병렬 개발과 협업이 효율적임

4계층 패키지 구조

com.example.project
├── presentation        # 사용자 인터페이스 계층
│   └── controller      # 웹 요청을 처리하는 컨트롤러
│   
├── application         # 응용 계층
│   ├── service         # 비즈니스 로직을 처리하는 서비스
│   ├── dtos            # 요청/응답 DTO
│   └── exception       # 도메인 관련 예외 클래스
│
├── domain              # 도메인 계층
│   ├── model           # 도메인 엔티티 및 밸류 객체
│   └── repository      # 도메인 객체의 저장소 인터페이스
│
└── infrastructure      # 인프라스트럭처 계층
    ├── persistence     # 데이터베이스 접근 구현체
    ├── external        # 외부 시스템 연동 구현체
    └── config          # 설정 관련 클래스

✅ 헥사고날 아키텍처의 효율적인 점 (간결하게 요약)

- 외부 시스템이 바뀌어도 (도메인 중심 설계)도메인 로직은 그대로 유지할 수 있어 확장성과 유지보수에 유리

  • 비즈니스 로직 중심 설계
    → 외부 환경에 의존하지 않고 도메인 로직을 독립적으로 관리할 수 있음
  • 유연한 인터페이스 교체
    → 외부 시스템(API, DB, UI 등)을 어댑터로 분리해, 쉽게 교체·확장 가능
  • 테스트 용이성
    → 어댑터 없이 도메인만으로도 테스트 가능해서 빠르고 안정적인 테스트 가능
  • 강력한 모듈화
    → 내부(도메인)와 외부(인프라)가 완전히 분리되어 구조가 명확함

4계층 VS 헥사고날 

항목 계층형 아키텍처 헥사고날 아키텍처
중심 철학 수직적 계층 분리 (Top-Down) 도메인 중심의 수평적 구조
의존 방향 Presentation → Application → Domain → Infrastructure 외부(어댑터)가 내부(도메인)로 의존
변경에 대한 유연성 기술 스택 변경에 약간 취약 외부 기술 변경에 매우 유연
테스트 용이성 테스트는 계층에 따라 분리됨 도메인 단독 테스트가 쉬움
외부 시스템 연결 내부 코드에 외부 기술이 자연스럽게 들어옴 어댑터를 통해 명시적으로 분리
MSA 적합성 작게 나누긴 좋지만, 결합도 높을 수 있음 MSA에 최적, 서비스 독립성이 강함
구현 난이도 익숙하고 간단 개념은 명확하지만 구조는 조금 복잡
대표 예시 전통적인 Spring MVC 구조 Clean Architecture, DDD 기반 구조

간략하게 - 계층형은 구조가 단순하고 익숙해서 빠르게 개발하기 좋고,헥사고날은 도메인 중심으로 설계

 

헥사고날 패키지 구조

com.example.project
├── domain
│   ├── model            # 도메인 엔티티, 밸류 객체
│   ├── service          # 도메인 서비스
│   ├── port
│   │   ├── in           # 들어오는 포트 (UseCase 인터페이스)
│   │   └── out          # 나가는 포트 (예: 저장소, 외부 API 등 인터페이스)
│   └── exception        # 도메인 예외
│
├── application
│   └── service          # UseCase 구현체 (비즈니스 흐름 조합)
│
├── adapter
│   ├── in
│   │   ├── web          # Controller (API 진입점)
│   │   └── event        # 메시징 소비자, 스케줄러 등 외부 입력
│   └── out
│       ├── persistence  # DB 접근 구현체 (JPA 등)
│       └── external     # 외부 시스템 연동 구현체 (API client 등)
│
├── config               # 의존성 주입 설정, 스프링 설정 등
└── ProjectApplication.java

헥사고날 참고 자료

https://cantcoding.tistory.com/107

 

헥사고날 아키텍처란

들어가며 사내에서 진행하는 새로운 프로젝트를 진행하였는데요, '새롭게 발생하는 요구사항에 빠르게 대응하기 위해 확장성 있게 설계하자'는 목표가 있었습니다. 따라서 목표에 맞게 팀 스터

cantcoding.tistory.com

 

https://curiousjinan.tistory.com/entry/spring-hexagonal-architecture

 

[Spring] 헥사고날 아키텍처

지금까지 내가 헥사고날 아키텍처를 설계해 보며 배운 점을 정리해 봤다.📌 서론지금까지 3번 정도 헥사고날 아키텍처를 적용시켜서 프로젝트를 만들어봤다. 첫 번째 설계에서는 왜 port 같은

curiousjinan.tistory.com