ABAP SQL 튜닝 ⑦ - S/4HANA Code-to-Data

ABAP SQL 튜닝 7편 배너

ABAP SQL 튜닝 시리즈 마지막 글입니다.

방향이 뒤집혔다

전통적인 ABAP 개발은 이런 모양이었습니다.

데이터를 애플리케이션 서버로 가져와서, ABAP으로 계산한다.

DB는 느리고 애플리케이션 서버는 상대적으로 빠르다는 전제였습니다. DB는 저장소 역할에 가까웠고, 로직은 ABAP이 담당했습니다.

S/4HANA로 오면서 이 전제가 흔들립니다. HANA는 대량 데이터의 집계·조인·필터링을 매우 빠르게 처리합니다. 그러면 굳이 데이터를 다 끌고 와서 계산할 이유가 줄어듭니다.

계산을 데이터가 있는 곳으로 내려보낸다.

이것이 Code-to-Data(또는 Code Pushdown)입니다.

Data-to-Code데이터를 코드로 가져온다

100만 건을 내부 테이블에 담고 ABAP에서 루프를 돌며 집계합니다. 전송량과 메모리를 그대로 부담합니다.

Code-to-Data코드를 데이터로 내려보낸다

집계를 DB에서 끝내고 결과만 받습니다. 전송량도 메모리도 최소화됩니다.

사실 이 시리즈는 처음부터 이 방향을 이야기해 왔습니다. ②편의 "DB에서 걸러라", ③편의 "집계는 DB에서"가 모두 같은 원리입니다. 이번 편은 그 연장선에서, 더 큰 단위로 옮기는 방법입니다.

세 가지 층

내려보내는 방법은 크게 세 단계로 나뉩니다.

1단계ABAP SQLJOIN · 집계 · 케이스식
2단계CDS View재사용 가능한 조회 모델
3단계AMDPSQLScript 직접 작성

중요한 것은 순서입니다. 아래로 갈수록 강력하지만 DB에 종속되고 유지보수가 어려워집니다. 위쪽에서 해결되면 굳이 내려갈 이유가 없습니다.

1단계 - ABAP SQL로 충분한 경우

가장 많은 경우가 여기서 끝납니다. 최신 ABAP SQL은 생각보다 많은 걸 할 수 있습니다.

1" 조인 + 집계 + 조건부 계산을 한 번에
2SELECT o~werks,
3       SUM( o~netwr ) AS total,
4       COUNT(*)       AS cnt,
5       CASE WHEN SUM( o~netwr ) > 1000000 THEN 'A'
6            ELSE 'B'
7       END AS grade
8  FROM zorder AS o
9  INNER JOIN kna1 AS c ON c~kunnr = o~kunnr
10  WHERE o~gjahr = @lv_gjahr
11  GROUP BY o~werks
12  INTO TABLE @DATA(lt_summary).

이걸 ABAP 루프로 짰다면 원본 전건을 받아야 했을 겁니다. SQL 한 문장으로 끝나면 그게 최선입니다.

2단계 - CDS View

같은 조회 로직을 여러 프로그램에서 반복해서 쓴다면 CDS View로 만들어 둘 만합니다.

  • 조회 모델을 한 곳에서 정의하고 재사용
  • 뷰 위에 뷰를 쌓아 단계적으로 구성
  • Fiori·OData 노출의 기반이 됨
INFO

CDS View는 성능 도구이면서 동시에 모델링 도구입니다. "빨라지니까 쓴다"보다 **"이 조회 개념을 자산으로 만들 가치가 있는가"**를 기준으로 판단하는 편이 낫습니다.

3단계 - AMDP

선언적인 뷰로 표현할 수 없는 절차적 로직을 DB에서 돌려야 할 때 씁니다. 임시 테이블을 만들고 단계적으로 가공하는 식의 처리입니다.

AMDP의 구체적인 작성 방법과 CDS View와의 선택 기준은 AMDP - HANA DB 프로시저 글에서 따로 다룹니다.

WARNING

AMDP는 SQLScript로 작성되므로 특정 DB에 종속됩니다. 또 ABAP 개발자에게 익숙하지 않은 문법이라 유지보수 부담이 있습니다. 정말 필요한 곳에만 쓰세요.

어디까지 내려보낼 것인가

여기서 중요한 균형 감각이 필요합니다. "DB로 다 내려보내면 좋다"는 아닙니다.

내려보내기 좋은 것
  • 대량 데이터의 필터링·조인·집계
  • 결과를 크게 줄이는 연산
  • 데이터 가공에 가까운 처리
!남겨두는 게 나은 것
  • 복잡한 업무 규칙·분기
  • 표준 모듈 호출이 필요한 처리
  • 자주 바뀌는 정책성 로직
  • 소량 데이터 처리

업무 규칙을 SQLScript 안에 깊이 박아 넣으면, 나중에 그 규칙을 찾고 고치기가 매우 어려워집니다. 성능을 얻고 유지보수성을 잃는 거래가 됩니다.

TIP

판단 기준 하나를 제안하자면 **"이 연산이 결과 건수를 크게 줄이는가?"**입니다. 100만 건을 10건으로 줄이는 연산이라면 내려보낼 가치가 큽니다. 10건을 10건으로 가공하는 연산이라면 ABAP에 두는 편이 읽기 쉽습니다.

흔한 오해

WARNING

"HANA니까 알아서 빨라진다"는 오해를 경계하세요. 이 시리즈에서 다룬 문제들은 HANA에서도 그대로 문제입니다.

DB가 빨라진 것은 사실이지만, 네트워크 왕복과 애플리케이션 서버 메모리는 그대로입니다.

시리즈 마무리

일곱 편을 한 줄씩 정리하면 이렇습니다.

한 줄 요약
측정하지 않고 튜닝하지 마라
필요한 만 — DB에서 걸러라
필요한 만 — SELECT * 를 버려라
덜 가라 — 루프 안의 SELECT와 FAE 함정
대량 조회의 속도 — OFFSET vs 키셋
대량 조회의 메모리 — PACKAGE SIZE와 커서
계산을 데이터 쪽으로 — CDS·AMDP

결국 전부 하나로 모입니다.

DB에 덜 가고, 갈 때는 꼭 필요한 만큼만 가져오고, 계산은 데이터가 있는 곳에서 한다.

그리고 무엇을 하든 측정이 먼저입니다. 고치기 전에 재고, 고친 뒤에 다시 재세요.

함께 보면 좋은 글

:::info 문법 지원 범위와 도구 명칭은 ABAP 릴리스·SP에 따라 다를 수 있습니다. 실제 시스템에서 확인하세요.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.