JPA Entity와 Core Domain의 관계
헥사고날 아키텍처에서 JPA Entity를 Core Domain에 포함할지 여부는 설계 철학과 프로젝트 요구 사항에 따라 신중히 결정해야 합니다. 이 문서에서는 두 가지 접근 방식의 장단점과 적용 방안을 설명합니다.
1. Core Domain에 JPA Entity 포함
장점:
데이터 매핑 간소화:
JPA Entity를 Core Domain에서 바로 사용하면 데이터베이스와의 매핑 로직이 단순화됩니다.
빠른 구현:
애플리케이션 초기 개발 단계에서 데이터베이스와의 연동 작업이 빠르게 진행될 수 있습니다.
재사용성:
동일한 객체를 데이터베이스 작업 및 비즈니스 로직에 사용할 수 있어 코드 중복을 줄입니다.
단점:
기술 의존성 증가:
Core Domain이 JPA에 의존하게 되어 기술 독립성이 약화됩니다.
순수성 훼손:
Core Domain 객체가 JPA 어노테이션(@Entity, @Id 등)으로 오염되며, 순수 비즈니스 로직만 포함해야 한다는 원칙이 무너질 수 있습니다.
테스트 어려움:
JPA Entity가 포함된 Core Domain은 데이터베이스가 없는 환경에서 테스트하기 어렵습니다.
2. JPA Entity를 Core Domain에서 분리
접근 방식:
Core Domain에서는 순수 도메인 객체를 사용하고, JPA Entity는 Outbound Adapter에서 관리합니다.
Core Domain 객체와 JPA Entity 간 변환기를 사용하여 데이터를 주고받습니다.
장점:
기술 독립성 유지:
Core Domain은 특정 기술(JPA)에 의존하지 않으므로, 기술 교체나 변경이 용이합니다.
도메인 객체의 순수성 보장:
비즈니스 로직과 데이터베이스 관련 로직이 분리되어 유지보수성이 향상됩니다.
테스트 용이성:
데이터베이스 없이도 순수 도메인 객체를 테스트할 수 있습니다.
단점:
변환 비용 증가:
Core Domain 객체와 JPA Entity 간 변환 로직을 추가로 구현해야 합니다.
개발 속도 저하:
초기 설계 및 구현 단계에서 추가 작업이 필요합니다.
예시:
Core Domain 객체
public class NotificationConfig {
private String name;
private boolean isActive;
// Getter, Setter, 비즈니스 로직
}
JPA Entity
@Entity
public class NotificationConfigEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private boolean isActive;
// Getter, Setter
}
변환기
public class NotificationConfigMapper {
public static NotificationConfig toDomain(NotificationConfigEntity entity) {
NotificationConfig config = new NotificationConfig();
config.setName(entity.getName());
config.setActive(entity.isActive());
return config;
}
public static NotificationConfigEntity toEntity(NotificationConfig config) {
NotificationConfigEntity entity = new NotificationConfigEntity();
entity.setName(config.getName());
entity.setActive(config.isActive());
return entity;
}
}
적용 시 고려사항
프로젝트 규모:
작은 프로젝트나 프로토타입 단계에서는 JPA Entity를 Core Domain에 포함하는 것이 효율적일 수 있습니다.
대규모 프로젝트에서는 기술 독립성과 유지보수성을 고려해 JPA Entity를 분리하는 것이 적합합니다.
팀 역량:
팀이 헥사고날 아키텍처의 철학과 설계 원칙에 익숙하지 않다면, 단순한 구조로 시작한 뒤 점진적으로 분리하는 접근이 유리합니다.
도메인 복잡성:
도메인 로직이 단순하면 JPA Entity를 Core Domain에 포함해도 무방하지만, 복잡할수록 분리하는 것이 권장됩니다.
결론
JPA Entity를 Core Domain에 포함할지 여부는 프로젝트의 요구사항, 복잡성, 팀 역량에 따라 다르게 접근해야 합니다. 기술 독립성과 도메인 순수성을 중요하게 여긴다면 JPA Entity를 Core Domain에서 분리하는 것이 권장됩니다. 반면, 간소화된 설계가 필요하다면 JPA Entity를 포함하는 것도 현실적인 선택일 수 있습니다. 두 가지 접근 방식을 상황에 맞게 조합하여 최적의 설계를 구현하세요.