피드로 돌아가기
Dev.toBackend
원문 읽기
CAP Java가 CDS 기반 Remote Services 패턴으로 S/4HANA OData API와 REST 서비스를 mashup하여 로컬 데이터와 외부 데이터를 단일 프로젝션으로 통합
CAP Remote Services & Mashups — Consuming External APIs
AI 요약
Context
마이크로서비스 아키텍처에서 로컬 데이터베이스와 S/4HANA, REST API 등 외부 시스템의 데이터를 함께 제공해야 하는 상황에서 각 데이터 소스를 별도로 호출하고 애플리케이션 레이어에서 수동으로 병합하는 방식은 N+1 쿼리 문제, 트랜잭션 관리 복잡도, 보안 설정 분산으로 인한 유지보수 부담을 초래한다.
Technical Solution
- CDS 모델에서 외부 서비스 정의: EDMX 파일을
cds import명령으로 자동 변환하여@cds.external어노테이션이 붙은 CDS 엔티티로 원격 API 스키마를 선언적으로 임포트 - Destination Service 기반 인증 관리: BTP Destination Service에 OAuth2SAMLBearerAssertion, Client ID/Secret을 중앙 집중식으로 설정하여 애플리케이션 코드에서 자격증명을 제거
- Mashup 서비스 구성: 로컬 엔티티와 원격 엔티티를 동일한 서비스 내 프로젝션으로 정의하여 클라이언트는 단일 API 엔드포인트로 접근
- CQN-to-OData 자동 변환: CAP 런타임이
CqnSelect쿼리를 OData V2 $filter, $select, $top 파라미터로 자동 변환하여 원격 시스템에 전송하므로 개발자는 CQN만 작성 - 재시도 및 에러 핸들링: ServiceException 상태 코드(503, 429, 408)를 감지하여 재시도하고, 실패 시 USER_ERROR 또는 BAD_GATEWAY로 구분하여 클라이언트에 전파
- 캐싱 전략: Spring Cache의
@Cacheable어노테이션과 Caffeine 백엔드로 원격 데이터를 최대 500건, TTL 5분으로 로컬 캐시
Impact
아티클은 정량적 성능 수치를 제시하지 않음.
Key Takeaway
원격 서비스 통합 시 Destination Service를 통한 중앙 집중식 인증 관리와 CQN 기반 자동 쿼리 변환은 보안 포즈를 개선하고 개발 복잡도를 낮추지만, N+1 쿼리 방지를 위해 배치 필터링과 프로젝션 최소화가 필수이며, 원격 시스템의 장애 격리를 위해 명시적 에러 핸들링과 캐싱이 반드시 구현되어야 한다.
실천 포인트
CAP Java를 사용하는 팀이 S/4HANA와의 데이터 mashup을 구현할 때, Destination 이름을 `application.yaml`의 `cds.remote.services[서비스명].destination.name`으로 설정하고 `type: odata-v2`를 명시하며, 핸들러에서 `@Cacheable` 어노테이션과 IN 필터를 적용하면 URL/자격증명 노출을 방지하고 원격 호출 횟수를 획기적으로 줄일 수 있다.