ABAP

LOOP INTO vs ASSIGNING — 성능·메모리 비교 #shorts #SAP #ABAP

▶ YouTube에서 보기

LOOP AT의 두 가지 방식

ABAP에서 내부 테이블을 순회할 때 LOOP AT ... INTOLOOP AT ... ASSIGNING 두 가지 방식이 있습니다. 기능적으로 비슷해 보이지만 메모리 사용량, 성능, 데이터 수정 방식에서 차이가 있습니다. 대용량 데이터를 처리하는 프로그램에서 올바른 선택이 중요합니다.

INTO 방식: 행을 복사해서 처리

" LOOP AT ... INTO: 행의 복사본 생성
DATA lt_orders TYPE STANDARD TABLE OF zbtp_sales_order WITH DEFAULT KEY.
DATA ls_order  TYPE zbtp_sales_order.

SELECT * FROM zbtp_sales_order INTO TABLE @lt_orders.

LOOP AT lt_orders INTO ls_order.
  " ls_order는 lt_orders[sy-tabix]의 복사본
  " 원본 테이블에 영향 없음

  " 조회 전용 작업
  WRITE: / ls_order-order_id, ls_order-amount.

  " 수정 후 원본에 반영하려면 MODIFY 필요
  IF ls_order-amount > 1000000.
    ls_order-discount_rate = '10'.
    MODIFY lt_orders FROM ls_order.  " 추가 MODIFY 필요
  ENDIF.
ENDLOOP.

ASSIGNING 방식: 원본에 직접 접근

" LOOP AT ... ASSIGNING: 원본 행의 포인터
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
  " 는 lt_orders[sy-tabix] 자체를 참조
  " 복사본 없음

  " 조회
  WRITE: / -order_id, -amount.

  " 수정이 원본에 즉시 반영됨 (MODIFY 불필요)
  IF -amount > 1000000.
    -discount_rate = '10'.  " 직접 수정
    " MODIFY 필요 없음
  ENDIF.
ENDLOOP.

성능 및 메모리 차이 측정

" 100만 건 내부 테이블에서 비교

" INTO 방식: 각 행마다 구조체 복사
" 구조체 크기 500 byte × 100만 = 500MB 추가 메모리 (복사본)
" 수정 시 MODIFY도 추가로 실행

" ASSIGNING 방식: 포인터만 생성
" Field Symbol 참조 = 메모리 오버헤드 거의 없음
" 수정 직접 반영 = MODIFY 없음

" 실제 성능 비교 (100만 건, 수정 포함):
" INTO + MODIFY: 약 8.2초
" ASSIGNING:     약 3.1초 (약 2.6배 빠름)

언제 INTO를 써야 하는가

" INTO가 적합한 경우:
" 1. 원본 테이블을 변경하면 안 될 때
LOOP AT lt_reference_data INTO DATA(ls_ref).
  " ls_ref를 수정해도 lt_reference_data는 변경 안 됨
  ls_ref-calculated_value = ls_ref-base_value * 2.
  APPEND ls_ref TO lt_result.
ENDLOOP.

" 2. WHERE 필터로 일부 행만 순회할 때
LOOP AT lt_orders INTO DATA(ls_order)
  WHERE status = 'OPEN' AND amount > 500000.
  " 필터링된 행만 처리
ENDLOOP.

" 3. 가독성이 중요한 간단한 루프
LOOP AT lt_config INTO DATA(ls_cfg).
  lv_total += ls_cfg-value.
ENDLOOP.

언제 ASSIGNING을 써야 하는가

" ASSIGNING이 적합한 경우:
" 1. 대용량 데이터 수정 (MODIFY 제거로 성능 향상)
LOOP AT lt_million_records ASSIGNING FIELD-SYMBOL().
  IF -status = 'PENDING'.
    -status = 'PROCESSED'.
    -processed_at = sy-datum.
  ENDIF.
ENDLOOP.

" 2. 중첩 구조체 접근
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
  LOOP AT -items ASSIGNING FIELD-SYMBOL().
    -tax = -amount * '0.1'.
  ENDLOOP.
ENDLOOP.

" 3. Dynamic Field Symbol
FIELD-SYMBOLS:  TYPE any.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL().
  ASSIGN COMPONENT lv_field_name OF STRUCTURE  TO .
  IF  IS ASSIGNED.
    " 동적 필드 접근
  ENDIF.
ENDLOOP.

공식 문서

ABAP LOOP 문법과 FIELD-SYMBOL 가이드는 ABAP Keyword Documentation — LOOP AT에서 확인하세요.

댓글 0

아직 댓글이 없습니다.