헥사고날 아키텍처(Hexagonal Architecture)는 애플리케이션을 도메인 로직 중심으로 설계하여 외부 의존성과의 결합을 줄이고 유연성을 확보하는 아키텍처 패턴이다.
“포트와 어댑터(Ports and Adapters)” 아키텍처로도 알려져 있으며, 도메인 로직과 외부 요소의 명확한 분리를 강조한다.
다음과 같은 문제를 해결하기 위해 헥사고날 아키텍처가 도입된다:
전자상거래 애플리케이션에서 다음과 같은 컴포넌트가 존재한다고 가정하자:
헥사고날 아키텍처를 사용하면 도메인 로직을 중심으로 설계하여 REST API와 데이터베이스와의 결합을 최소화할 수 있다.
[Input Adapter: REST API]
|
[Input Port: Use Case Interface] <---> [Domain Logic] <---> [Output Port: Repository Interface]
|
[Output Adapter: Database]
// 상품 엔티티
public class Product {
private String id;
private String name;
private double price;
// 생성자, getter 및 setter
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
// 도메인 서비스
public class ProductService {
private final ProductRepository repository;
public ProductService(ProductRepository repository) {
this.repository = repository;
}
public void addProduct(Product product) {
repository.save(product);
}
public Product getProduct(String id) {
return repository.findById(id);
}
}
// 출력 포트: 저장소 인터페이스
public interface ProductRepository {
void save(Product product);
Product findById(String id);
}
데이터베이스 어댑터:
import java.util.HashMap;
import java.util.Map;
// 메모리 기반 저장소 구현
public class InMemoryProductRepository implements ProductRepository {
private final Map<String, Product> database = new HashMap<>();
@Override
public void save(Product product) {
database.put(product.getId(), product);
}
@Override
public Product findById(String id) {
return database.get(id);
}
}
REST API 어댑터:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/products")
public class ProductController {
private final ProductService service;
public ProductController(ProductService service) {
this.service = service;
}
@PostMapping
public void addProduct(@RequestBody Product product) {
service.addProduct(product);
}
@GetMapping("/{id}")
public Product getProduct(@PathVariable String id) {
return service.getProduct(id);
}
}
InMemoryProductRepository
를 구현하여 도메인 서비스에 주입.ProductController
를 통해 클라이언트 요청을 처리.헥사고날 아키텍처는 변화와 확장에 강한 애플리케이션을 설계하는 데 유용하다.
다른 아키텍처 패턴이 궁금하다면 아래 글도 확인해보세요.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음