Enterprise Features
1. 개요
ElastiCORE는 단순한 CRUD 자동화를 넘어 대규모 엔터프라이즈 환경에서 요구되는 다양한 기능을 지원합니다. 다중 데이터소스 분리, 도메인별 블루프린트 파일 관리, 커스텀 인 터페이스 구현, 감사 로깅, 보안 통합, 캐싱 전략까지 — 복잡한 시스템을 체계적으로 구성할 수 있는 도구를 제공합니다.
이 문서는 여러 팀이 협업하거나 복수의 데이터베이스/도메인을 다루는 중대형 프로젝트에 특히 유용합니다.
2. 다중 DataSource 설정
env.yml에서 데이터소스 정의
대규모 서비스에서는 업무 도메인별로 데이터베이스를 분리하는 경우가 많습니다. ElastiCORE는 env.yml에서 복수의 데이터소스를 선언하고, 각 포트(Port)에서 사용할 데이터소스를 명시적으로 지정할 수 있습니다.
# src/main/resources/elasticore/env.yml
datasource:
main:
type: jpa
url: jdbc:postgresql://db-main:5432/maindb
username: app_user
password: ${DB_MAIN_PASSWORD}
hikari:
maximum-pool-size: 20
analytics:
type: jpa
url: jdbc:postgresql://db-analytics:5432/analyticsdb
username: analytics_user
password: ${DB_ANALYTICS_PASSWORD}
hikari:
maximum-pool-size: 10
log:
type: jpa
url: jdbc:mysql://db-log:3306/logdb
username: log_user
password: ${DB_LOG_PASSWORD}
운영 환경에서는 비밀번호를 ${ENV_VAR} 형태로 주입하는 것을 강력히 권장합니다. Kubernetes Secret이나 AWS Secrets Manager와 연동하면 보안성을 높일 수 있습니다.
Port DSL에서 데이터소스 지정
포트 정의 시 @datasource("...") 어노테이션으로 어떤 데이터소스를 사용할지 명시합니다.
transaction:
port:
# 메인 DB를 사용하는 사용자 서비스
UserService:
meta: dbms @datasource("main")
methods:
findByEmail:
params:
email: string
return: User
# 분석 DB를 사용하는 통계 서비스
AnalyticsService:
meta: dbms @datasource("analytics")
methods:
getDailyStats:
params:
date: localdate
return: DailyStatsDTO
# 로그 DB에 접근하는 감사 서비스
AuditLogService:
meta: dbms @datasource("log")
methods:
saveAuditLog:
params:
log: AuditLogDTO
return: void
트랜잭션 포트별 데이터소스 분리 예시
ElastiCORE가 생성하는 코드는 데이터소스별로 독립적인 EntityManagerFactory와 트랜잭션 매니저를 구성합니다. 따라서 도메인 경계를 넘는 분산 트랜잭션은 명시적으로 처리해야 합니다.
// 생성된 서비스 코드 예시 (참고용)
@Service
@Transactional("mainTransactionManager")
public class UserServiceImpl implements UserService {
// main 데이터소스 트랜잭션 범위 내에서 동작
}
@Service
@Transactional("analyticsTransactionManager")
public class AnalyticsServiceImpl implements AnalyticsService {
// analytics 데이터소스 트랜잭션 범위 내에서 동작
}
서로 다른 데이터소스에 걸친 단일 트랜잭션이 필요한 경우, JTA(Java Transaction API) 또는 Saga 패턴 적용을 검토하세요. ElastiCORE는 단일 데이터소스 트랜잭션을 자동 관리하지만, 분산 트랜잭션은 애플리케이션 레벨에서 직접 처리해야 합니다.
3. 대규모 모델 관리
도메인별 블루프린트 파일 분리 전략
수십 개 이상의 엔티티를 단일 파일로 관리하면 충돌이 잦고 가독성이 떨어집니다. ElastiCORE는 블루프린트 파일을 여러 개로 분리하는 것을 지원합니다. elasticore/ 디렉토리 안의 모든 .yml 파일을 자동으로 인식합니다.
멀티모듈 프로젝트 구조 예시
project/
├── module-user/
│ └── src/main/resources/elasticore/
│ ├── env.yml
│ └── user-domain.yml # User, Role, Permission 엔티티
├── module-order/
│ └── src/main/resources/elasticore/
│ ├── env.yml
│ └── order-domain.yml # Order, OrderItem, Payment 엔티티
├── module-inventory/
│ └── src/main/resources/elasticore/
│ ├── env.yml
│ └── inventory-domain.yml # Product, Stock, Warehouse 엔티티
└── module-common/
└── src/main/resources/elasticore/
└── common-domain.yml # 공통 Enumeration, 공유 DTO
각 모듈의 build.gradle에 ElastiCORE 플러그인을 독립적으로 적용합니다.
// module-order/build.gradle
plugins {
id 'io.elasticore' version '1.x.x'
}
elasticore {
basePackage = 'com.example.order'
blueprintPath = 'src/main/resources/elasticore'
}