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