LOOP AT의 두 가지 방식
ABAP에서 내부 테이블을 순회할 때 LOOP AT ... INTO와 LOOP 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
아직 댓글이 없습니다.