QnA

STANDARD vs SORTED vs HASHED — ABAP 면접 1번 문제 #shorts #SAP #ABAP

▶ YouTube에서 보기

왜 내부 테이블 타입이 면접 단골 문제인가

SAP ABAP에서 내부 테이블(Internal Table)은 가장 자주 사용하는 데이터 구조입니다. 세 가지 타입(STANDARD, SORTED, HASHED)의 차이를 모르면 대용량 데이터 처리 시 심각한 성능 문제가 발생합니다. 면접에서 이 질문이 나오면 단순히 차이를 말하는 것을 넘어, 언제 어떤 타입을 선택해야 하는지 설명할 수 있어야 합니다.

STANDARD TABLE: 순서 보장, 중복 허용

DATA: lt_orders TYPE STANDARD TABLE OF zbtp_order_item
                WITH DEFAULT KEY,
      ls_order  TYPE zbtp_order_item.

" 순서대로 APPEND
APPEND VALUE #( order_id = 'SO001' item_no = 10 product = 'LAPTOP' qty = 2 )
  TO lt_orders.
APPEND VALUE #( order_id = 'SO001' item_no = 20 product = 'MOUSE'  qty = 5 )
  TO lt_orders.

" 선형 검색 (READ TABLE ... WITH KEY)
READ TABLE lt_orders
  WITH KEY order_id = 'SO001' item_no = 20
  INTO DATA(ls_item).

" 100만 건에서 READ TABLE: O(n) — 느림

STANDARD TABLE은 인덱스나 해시가 없어 READ TABLE이 항상 선형 검색(O(n))입니다. 데이터가 많을수록 느려집니다. 순서가 중요하거나 중복 허용이 필요할 때, 혹은 전체 LOOP 처리만 할 때 적합합니다.

SORTED TABLE: 자동 정렬, 이진 탐색

DATA: lt_products TYPE SORTED TABLE OF zbtp_product
                  WITH UNIQUE KEY product_id.

" INSERT 시 자동 정렬 유지
INSERT VALUE #( product_id = 'P003' name = 'USB Hub' price = '15000' )
  INTO TABLE lt_products.
INSERT VALUE #( product_id = 'P001' name = 'Keyboard' price = '45000' )
  INTO TABLE lt_products.

" 결과는 P001, P003 순으로 정렬된 상태

" 이진 탐색: O(log n)
READ TABLE lt_products
  WITH TABLE KEY product_id = 'P001'
  INTO DATA(ls_prod).

" 100만 건에서 READ TABLE: O(log n) — 빠름

SORTED TABLE은 INSERT 시 자동으로 KEY 순서로 정렬됩니다. READ TABLE WITH TABLE KEY가 이진 탐색으로 O(log n)입니다. 데이터를 정렬된 상태로 유지해야 하거나, 범위 검색(BETWEEN)이 필요할 때 적합합니다.

HASHED TABLE: 해시 기반, 최고 속도

DATA: lt_config TYPE HASHED TABLE OF zbtp_config
               WITH UNIQUE KEY config_key.

" INSERT: 해시 계산 후 저장
INSERT VALUE #( config_key = 'MAX_RETRY' config_value = '3' )
  INTO TABLE lt_config.
INSERT VALUE #( config_key = 'TIMEOUT_SEC' config_value = '30' )
  INTO TABLE lt_config.

" 해시 검색: O(1) — 건수 무관하게 일정 시간
READ TABLE lt_config
  WITH TABLE KEY config_key = 'MAX_RETRY'
  INTO DATA(ls_cfg).

IF sy-subrc = 0.
  DATA(lv_max_retry) = CONV i( ls_cfg-config_value ).
ENDIF.

HASHED TABLE은 READ TABLE이 O(1)로 가장 빠릅니다. 단, UNIQUE KEY만 가능하고, LOOP 순서가 보장되지 않으며, APPEND/INSERT INTO INDEX가 불가합니다. KEY로 빈번한 단일 검색이 필요한 경우(설정값 조회, 코드 매핑 테이블)에 최적입니다.

성능 비교: 실전 케이스

" 시나리오: 100만 건 재고 테이블에서 상품별 조회
" 케이스 A: STANDARD TABLE (잘못된 선택)
DATA lt_stock_std TYPE STANDARD TABLE OF zbtp_stock WITH DEFAULT KEY.
SELECT * FROM zbtp_stock INTO TABLE @lt_stock_std.

DO 1000 TIMES.
  " 매번 O(n) 선형 검색 — 1000 * 1,000,000 = 10억 번 비교
  READ TABLE lt_stock_std WITH KEY product_id = lv_pid INTO DATA(ls).
ENDDO.

" 케이스 B: HASHED TABLE (올바른 선택)
DATA lt_stock_hash TYPE HASHED TABLE OF zbtp_stock
                   WITH UNIQUE KEY product_id.
SELECT * FROM zbtp_stock INTO TABLE @lt_stock_hash.

DO 1000 TIMES.
  " 매번 O(1) — 1000번만 실행
  READ TABLE lt_stock_hash WITH TABLE KEY product_id = lv_pid INTO DATA(ls).
ENDDO.

LOOP에서 ASSIGNING을 쓰는 이유

" 대량 수정 시: LOOP ... ASSIGNING이 INTO보다 빠름
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL(<ls_order>).
  IF <ls_order>-qty > 100.
    <ls_order>-discount_rate = '10.00'.  " 직접 수정 (복사 없음)
  ENDIF.
ENDLOOP.

" INTO는 행을 복사해서 수정 후 다시 저장해야 함 — 오버헤드 발생
LOOP AT lt_orders INTO DATA(ls_order).
  IF ls_order-qty > 100.
    ls_order-discount_rate = '10.00'.
    MODIFY lt_orders FROM ls_order.  " 추가 MODIFY 필요
  ENDIF.
ENDLOOP.

면접 모범 답변 요약

  • STANDARD: 순서 중요, LOOP만 사용, 중복 허용 필요 시
  • SORTED: 정렬 상태 유지 + 범위 검색 필요 시, O(log n)
  • HASHED: KEY로만 단일 검색, 중복 불허, O(1) 최고 성능
  • 대용량 데이터에서 READ TABLE을 빈번히 하면 반드시 SORTED 또는 HASHED 선택

공식 문서

내부 테이블 타입 전체 설명은 ABAP Keyword Documentation — Internal Tables에서 확인하세요.

댓글 0

아직 댓글이 없습니다.