CdsService 30초 만에 타입 안전 쿼리 완성 #shorts #SAP #CAP

Moderator · 조회 2

CAP Java에서 CdsService를 직접 쓰면 문자열 쿼리 대신 타입 안전한 빌더 API로 데이터를 조회할 수 있습니다. OData 핸들러 밖에서도 CAP 엔티티를 쿼리해야 할 때 실제로 어떻게 쓰는지 코드로 확인해봅니다.

이 글이 답하는 질문

  • CdsService vs EntityManager — 언제 무엇을 쓰나?
  • 타입 안전 쿼리 빌더로 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-plugin goal generate 실행 여부 확인

핵심 한 줄

CdsService 빌더 API로 30초 만에 타입 안전 쿼리 — 문자열 없이 컴파일 타임 오류 검출.

더 파볼 주제

  • CQL INSERT/UPDATE/DELETE 빌더 패턴
  • PersistenceService vs CdsService 선택 기준
  • CAP Java Remote Service 쿼리 위임 패턴