728x90
반응형
1. 패키지 구조 (Standard Layout)
가장 일반적으로 사용되는 패키지 구성은 **내부(Domain/Application)**와 **외부(Infrastructure/Adapter)**를 엄격히 나누는 방식입니다.
- adapter (외부 영역)
- in: 외부에서 시스템으로 들어오는 요청 처리 (예: web, api)
- out: 시스템에서 외부로 나가는 요청 처리 (예: persistence, external-service)
- application (내부 영역)
- port: 인터페이스 정의
- in: 유스케이스 인터페이스 (Input Port)
- out: 저장소나 외부 통신을 위한 인터페이스 (Output Port)
- service: 비즈니스 로직 구현체 (Use Case 구현)
- port: 인터페이스 정의
- domain (핵심 영역)
- 비즈니스 엔티티와 순수 도메인 로직 (외부 라이브러리 의존성 없음)
2. Controller부터 흐름도 (Data Flow)
핵사고날 아키텍처의 핵심은 **"의존성은 항상 안쪽(Domain)으로 향한다"**는 것입니다. 흐름을 따라가 보시죠.
① Adapter In (Controller)
사용자의 요청을 받는 시작점입니다.
- Web Adapter에 속한 Controller가 HTTP 요청을 받습니다.
- 입력값의 유효성 검사(Validation)를 수행한 뒤, 이를 Input Port(Interface)로 전달합니다.
② Port In (Use Case)
- 애플리케이션이 수행할 작업의 목록(Interface)입니다.
- Controller는 구현체가 무엇인지 알 필요 없이 이 인터페이스에만 의존합니다.
③ Service (Use Case Implementation)
- 인터페이스를 구현한 실제 비즈니스 로직입니다.
- 도메인 엔티티를 불러와 비즈니스 규칙을 실행합니다.
- 데이터를 저장하거나 외부 시스템을 호출해야 한다면 Port Out을 호출합니다.
④ Port Out
- 데이터베이스 저장이나 외부 API 호출을 위한 인터페이스입니다.
⑤ Adapter Out (Persistence/External)
- Port Out 인터페이스를 실제로 구현한 영역입니다.
- 예를 들어, JPA를 사용하여 DB에 저장하거나 RestTemplate으로 타사 API를 호출하는 로직이 여기 담깁니다.
3. 요약: 컴포넌트 간 관계
단계 구성 요소 역할
| Trigger | Controller | 요청 접수 및 응답 반환 |
| Boundary | Input Port | 애플리케이션 진입로 (Interface) |
| Logic | Service | 핵심 비즈니스 로직 수행 |
| Boundary | Output Port | 외부 인프라 연결 통로 (Interface) |
| Execution | Repository/Client | 실제 DB 저장 및 외부 통신 |
핵심 포인트: Controller(In)와 DB Repository(Out)는 서로를 전혀 모릅니다. 둘 사이의 모든 소통은 중간의 Port를 통해서만 이루어지기 때문에, 나중에 DB를 MySQL에서 MongoDB로 바꾸더라도 비즈니스 로직(Service)은 한 줄도 고칠 필요가 없게 됩니다.
728x90
반응형
'개발 > spring boot' 카테고리의 다른 글
| 헥사고날 아키텍처 — 싱글 모듈에서 멀티 모듈로 (0) | 2026.03.05 |
|---|---|
| self-invocation 때문에 서비스 검증(@Validated)이 안 걸리는 문제 코드와, 실무에서 제일 흔한 해결책인 검증이 필요한 메서드를 다른 빈으로 분리 방법 (0) | 2026.02.26 |
| (Spring) sso 외부 인증 토큰을 검증하고 세션에 사용자 정보를 저장하는 흐름 (0) | 2026.01.07 |
| resolveLocale(req)가 하는 일 - 이 요청의 언어/국가(locale)를 어떻게 정할까? (0) | 2025.10.15 |
| Authentication을 SecurityContext 저장하는 사용방 (0) | 2025.10.13 |