CdsService 30초 만에 타입 안전 쿼리 완성 #shorts #SAP #CAP
Moderator
· 조회 2
CAP Java에서 CdsService를 직접 쓰면 문자열 쿼리 대신 타입 안전한 빌더 API로 데이터를 조회할 수 있습니다. OData 핸들러 밖에서도 CAP 엔티티를 쿼리해야 할 때 실제로 어떻게 쓰는지 코드로 확인해봅니다.
이 글이 답하는 질문
CdsServicevsEntityManager— 언제 무엇을 쓰나?- 타입 안전 쿼리 빌더로 WHERE 조건을 어떻게 표현하나?
- 결과를
Result로 받아서 어떻게 처리하나?
직접 해보기
1. CdsService 주입 + 단건 조회
@Autowired
@Qualifier("OrderService")
private CdsService orderService;
CqnSelect query = Select.from(Orders_.class)
.where(o -> o.orderId().eq(42));
Result result = orderService.run(query);
Orders order = result.single(Orders.class);
Orders_는 CDS → Maven 플러그인이 자동 생성한 타입 클래스입니다. 문자열 엔티티명이 아니라 클래스를 직접 참조하므로 컴파일 타임에 오류를 잡을 수 있습니다.
2. 복합 조건 + 목록 조회
CqnSelect listQuery = Select.from(Orders_.class)
.where(o -> o.status().eq("OPEN")
.and(o.amount().gt(1000)))
.orderBy(o -> o.createdAt().desc())
.limit(20);
List<Orders> orders = orderService
.run(listQuery)
.listOf(Orders.class);
3. Result 처리 — Optional 패턴
Optional<Orders> found = orderService
.run(query)
.first(Orders.class);
found.ifPresentOrElse(
o -> log.info("found: {}", o.getOrderId()),
() -> { throw new ServiceException(
HttpStatus.NOT_FOUND, "Order not found"); }
);
삽질 노트
result.single()은 결과가 0건이면 예외 — 확실히 1건임을 보장할 때만 사용CdsService는 CAP 이벤트 루프 안에서 동작하므로@Transactional과 충돌 가능 —PersistenceService와 구분해서 사용- Maven 플러그인이 타입 클래스를 생성하지 않으면
cds-maven-plugingoalgenerate실행 여부 확인
핵심 한 줄
CdsService 빌더 API로 30초 만에 타입 안전 쿼리 — 문자열 없이 컴파일 타임 오류 검출.
더 파볼 주제
- CQL INSERT/UPDATE/DELETE 빌더 패턴
- PersistenceService vs CdsService 선택 기준
- CAP Java Remote Service 쿼리 위임 패턴