일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- XSS
- 자동화워크플로우
- 테스트케이스
- 스프링시큐리티
- springboot
- 자료구조
- N+1문제
- 티스토리챌린지
- Kafka
- JPA
- 자바
- STOMP
- selenium
- kafka배포
- 캐시의 작동 원리
- 한화시스템부트캠프
- jwt토큰
- 프로세스와스레드의차이
- 부트캠프
- 하이브리드접근법
- 오블완
- 오버로딩
- 메소드
- nplus1
- n8n
- Java
- 엘라스틱서치
- 헥사고날아키텍처
- 프로토콜역할
- QA
- Today
- Total
아쿠의 개발 일지
[아키텍처 패턴] 헥사고날 아키텍처(Hexagonal Architecture) 본문
헥사고날 아키텍처(Hexagonal Architecture)는 소프트웨어 디자인 패턴 중 하나로, 응용 프로그램의 핵심 로직(Application Core)과 외부 시스템 간의 의존성을 최소화하여 유연성과 테스트 가능성을 높이는 구조입니다. 이 아키텍처는 “포트와 어댑터 아키텍처(Ports and Adapters Architecture)”라고도 불리며, 시스템의 내부와 외부를 명확히 구분합니다.
1. Application Core (응용 프로그램 핵심)
• 핵심 비즈니스 로직과 도메인 규칙이 포함됩니다.
• Use Case와 Entity가 Application Core에 속하며, 외부 환경에 독립적입니다.
• 비즈니스 규칙은 특정 프레임워크나 외부 기술에 의존하지 않으며, 이로 인해 테스트가 용이해집니다.
2. Ports (포트)
• Input Port: 외부 시스템(예: Web Adapter 또는 External System Adapter)이 Core에 요청을 전달하기 위한 인터페이스입니다.
• Output Port: Core가 외부 시스템(예: Persistence Adapter 또는 External System Adapter)과 통신할 때 사용하는 인터페이스입니다.
• Ports는 어댑터와 Core 간의 의존성을 느슨하게 연결하는 역할을 합니다.
3. Adapters (어댑터)
• 어댑터는 포트 인터페이스를 구현하여 외부 시스템(Web, DB 등)과 Core를 연결합니다.
• 어댑터는 두 가지로 나뉩니다:
• Driving Adapter: 사용자의 요청(예: HTTP 요청)을 받아 Core로 전달하는 역할. 예: Web Adapter.
• Driven Adapter: Core의 요청을 받아 외부 시스템(DB, API 등)으로 전달하는 역할. 예: Persistence Adapter.
• 어댑터는 외부 기술과 관련된 모든 세부 사항을 처리하며, 이는 Core의 순수성을 유지합니다.
특징
• 유연성: 외부 시스템(Web UI, 데이터베이스, API 등)이 변경되어도 Core 로직에 영향을 주지 않습니다.
• 테스트 가능성: Core 로직이 외부 의존성 없이 독립적이므로 단위 테스트 작성이 쉽습니다.
• 확장성: 새로운 어댑터(Web, CLI, Batch 등)를 추가하기가 용이합니다.
작동 방식
1. 사용자가 Driving Adapter(Web Adapter)를 통해 요청을 보냅니다.
2. Driving Adapter는 Input Port를 호출하여 Core의 Use Case를 실행합니다.
3. Core는 Use Case 내에서 비즈니스 로직을 처리하며 필요시 Output Port를 통해 Driven Adapter를 호출합니다.
4. Driven Adapter(Persistence Adapter 등)는 외부 시스템과 상호작용하며 데이터를 저장하거나 조회합니다.
적용 예시
1. 웹 애플리케이션
• Driving Adapter: HTTP 요청을 처리하는 Controller.
• Input Port: Service Interface.
• Use Case: 비즈니스 로직.
• Output Port: Repository Interface.
• Driven Adapter: 데이터베이스를 처리하는 Repository 구현체.
2. 마이크로서비스
• Driving Adapter: 메시지 큐에서 데이터를 읽는 Consumer.
• Input Port: 메시지 처리 인터페이스.
• Use Case: 비즈니스 로직 처리.
• Output Port: 외부 API 호출 인터페이스.
• Driven Adapter: 외부 API를 호출하는 HTTP 클라이언트.
장점과 단점
장점:
• 비즈니스 로직과 외부 시스템의 의존성 제거.
• 코드 재사용성과 유지보수성 향상.
• 외부 시스템 변경에 따른 영향 최소화.
단점:
• 포트와 어댑터 구현으로 인해 초기 개발 시 추가적인 코드가 필요함.
• 간단한 프로젝트에는 과도한 설계로 느껴질 수 있음.
헥사고날 아키텍처는 복잡한 애플리케이션에서 높은 확장성과 유지보수성을 제공하기 위해 사용되며, 마이크로서비스와 도메인 주도 설계(DDD)에 잘 어울리는 구조입니다.
레이어드 아키텍처(Layered Architecture)와 헥사고날 아키텍처(Hexagonal Architecture)의 비교
를 하기 전에,
레이어드 아키텍처란?
애플리케이션을 수직적인 계층 구조로 나누는 아키텍처 패턴입니다. 각각의 레이어는 특정한 책임과 역할을 가지며, 레이어 간의 의존성은 일반적으로 위에서 아래로만 흐릅니다.
특징
1. 계층 간 의존성
• 상위 레이어는 하위 레이어에만 의존합니다. (일반적으로 Presentation → Application → Domain → Infrastructure)
• 의존성 흐름이 단방향이므로 구조가 단순하고 이해하기 쉽습니다.
2. 분리된 책임
• 각 레이어는 고유의 책임을 가지고 있으며, 다른 레이어의 세부 구현을 알 필요가 없습니다.
3. 유연성 부족
• 레이어 간의 고정된 의존성으로 인해 변경 사항이 상위 계층으로 전파되거나 전체 구조를 수정해야 할 수 있습니다.
• 비즈니스 로직이 특정 데이터베이스나 외부 시스템에 의존하게 되는 경우가 빈번합니다.
한 눈에 보기 쉽게 비교
결론 ,
레이어드 아키텍처는 단순한 구조와 빠른 개발이 필요한 애플리케이션에 적합합니다. 하지만 시스템이 커질수록 의존성이 복잡해지고 유연성이 떨어질 수 있습니다.
헥사고날 아키텍처는 비즈니스 로직과 외부 의존성을 철저히 분리하여 테스트 가능성과 확장성을 중시하는 현대적인 프로젝트에 더 적합합니다.
따라서, 프로젝트의 요구 사항과 복잡성에 따라 두 아키텍처 중 하나를 선택하면 됩니다.
'Programming > Java' 카테고리의 다른 글
[Java] 객체지향의 핵심 개념 & Spring Boot란? (0) | 2024.12.29 |
---|---|
[ElasticSearch] 엘라스틱 서치 도입 (2) | 2024.11.27 |
[JPA] N+1 문제 해결 (1) | 2024.07.10 |
[Java] 캡슐화 (Encapsulation) (1) | 2024.07.06 |
[SpringBoot] Entity간의 관계 설정 (3) | 2024.06.23 |