피드로 돌아가기
CAP Advanced Patterns — Drafts, i18n, Audit Logging & Production Readiness
Dev.toDev.to
Backend

SAP CAP 프레임워크가 Draft 처리, 다국어 지원, 감사 로깅, 배포 토폴로지를 통해 Fiori UI 기반 엔터프라이즈 애플리케이션을 프로덕션 준비 상태로 구성하는 패턴 정립

CAP Advanced Patterns — Drafts, i18n, Audit Logging & Production Readiness

Aliaksandr Tsviatkou2026년 3월 26일12intermediate

Context

Fiori UI 기반 엔터프라이즈 애플리케이션은 다중 단계 편집 세션, 다국어 콘텐츠, 규제 준수를 위한 변경 이력 추적, 다양한 배포 환경(MTA vs Helm)을 동시에 지원해야 한다. CAP Java 애플리케이션은 시작 시 CDS 컴파일로 30~60초가 소요되어 Kubernetes 준비 상태 감지 실패의 위험이 있다.

Technical Solution

  • Draft 테이블 자동 생성: @odata.draft.enabled 어노테이션으로 DRAFT_{entity} 테이블 자동 생성, draftEdit/draftActivate/draftPrepare OData 액션 자동 제공
  • Draft 핸들러 구현: EVENT_DRAFT_SAVE 이벤트에서 필드 검증(예: title 필수, price > 0), EVENT_DRAFT_PREPARE에서 경고 메시지 추가 (거부 없음)
  • Draft 자동 삭제: cds.drafts.cancellation-timeout을 15d로 설정하여 미완료 Draft 자동 폐기
  • 다국어 지원 구조: entity 필드에 localized 키워드 적용 → 자동으로 {entity}.texts 테이블 생성 (locale, ID를 복합 키로 사용), i18n/messages.properties와 messages_de.properties로 언어별 메시지 관리
  • 시간 데이터 자동 관리: cuid, managed 측면 사용으로 createdAt/modifiedAt (서버 타임스탬프), createdBy/modifiedBy (JWT 사용자 ID) 자동 삽입
  • 변경 이력 기록: @changelog: [field1, field2] 어노테이션으로 지정 필드의 구값·신값·사용자·타임스탬프 자동 기록
  • 배치 INSERT 최적화: 루프 내 단건 Insert 대신 Insert.into().entries(list) 사용으로 다중 행 일괄 삽입
  • 데이터베이스 연결 풀 튜닝: HikariCP maximum-pool-size 10, minimum-idle 2, connection-timeout 30000ms, idle-timeout 600000ms, max-lifetime 1800000ms 설정
  • Spring Cache 도입: @Cacheable로 장르 목록 메모리 캐싱, @CacheEvict로 데이터 변경 시 캐시 무효화
  • Startup Probe 설정: Kubernetes의 startup probe로 30~60초 CDS 컴파일 대기 시간 확보

Impact

CAP Java 앱 시작 시 CDS 컴파일 소요 시간이 30~60초임을 명시적으로 인식하고 Kubernetes startup probe 구성 필수. 개별 INSERT 작업을 배치 처리로 변경하면 "orders of magnitude" (10배 이상) 성능 향상.

Key Takeaway

Production CAP 애플리케이션은 Fiori 편집 패턴(Draft), 다국어 쿼리(localized), 규제 감사(managed aspects, @changelog)를 아키텍처 초기 단계에서 설계해야 하며, 배포 단계에서 MTA 디스크립터 관리, 연결 풀 튜닝, 배치 작업이 서비스 안정성을 결정하는 핵심 요소이다.


CAP Java 기반 Fiori 애플리케이션을 개발할 때 entity 정의 시점에 localized 키워드를 적용하고 Draft 처리를 @odata.draft.enabled로 활성화하면, 후속 데이터베이스 마이그레이션 없이 편집 세션과 다국어 지원이 자동으로 구성된다. 또한 루프 내 개별 쿼리 대신 Insert.into().entries(list)와 같은 배치 API를 사용하고, HikariCP 연결 풀을 명시적으로 튜닝(maximum-pool-size, idle-timeout)한 후 Kubernetes startup probe를 30~60초 범위로 설정하면 프로덕션 배포 시 Pod 재시작 실패를 방지할 수 있다.

원문 읽기