
📊 데이터 처리, ABAP 인터널 테이블 없이는 상상할 수 없죠?
안녕하세요! 오늘은 ABAP 개발의 핵심 중의 핵심, 바로 **인터널 테이블(Internal Table)**을 완벽하게 파헤쳐 보겠습니다. 이 인터널 테이블만 제대로 이해하고 활용하면, SAP 프로그램의 데이터 처리 효율성을 획기적으로 높일 수 있답니다. 함께 인터널 테이블의 모든 것을 알아볼까요?
SAP 시스템을 개발하다 보면 방대한 양의 데이터를 다루는 경우가 빈번합니다. 데이터베이스에서 읽어온 데이터를 임시로 저장하거나, 프로그램 내에서 데이터를 가공하고 처리해야 할 때 ABAP 개발자에게 가장 강력한 무기가 되는 것이 바로 **인터널 테이블(Internal Table)**입니다. 인터널 테이블은 메모리 내에서 동작하는 테이블 형태로, 데이터 처리의 유연성과 성능에 결정적인 영향을 미칩니다.
오늘은 인터널 테이블의 기본적인 개념부터 선언 방법, 다양한 조작 명령어, 그리고 성능을 최적화하는 팁까지, 인터널 테이블의 모든 것을 자세히 살펴보겠습니다.
1. 인터널 테이블이란 무엇일까요? (메모리 속의 임시 테이블)
인터널 테이블은 ABAP 프로그램이 실행되는 동안 애플리케이션 서버의 메모리 공간에 임시로 데이터를 저장하는 테이블 형태의 오브젝트입니다. 실제 데이터베이스 테이블처럼 데이터를 영구적으로 저장하는 것이 아니라, 프로그램이 데이터를 처리하기 위해 일시적으로 사용합니다.
인터널 테이블의 주요 특징:
- 메모리 기반: 데이터베이스 I/O(입출력) 없이 메모리에서 직접 데이터를 읽고 쓰므로 빠른 처리 속도를 자랑합니다.
- 다양한 구조: 데이터베이스 테이블의 구조를 그대로 사용하거나, ABAP 사전(ABAP Dictionary)에 정의된 구조, 또는 프로그램 내에서 직접 정의한 구조를 가질 수 있습니다.
- 유연한 조작: 데이터 삽입, 수정, 삭제, 정렬, 필터링 등 다양한 조작을 ABAP 명령어를 통해 쉽게 수행할 수 있습니다.
- 레코드 기반: 여러 개의 행(레코드)을 저장할 수 있습니다. 각 행은 **작업 영역(Work Area)**이라는 단일 행 변수에 매핑되어 처리됩니다.
2. 인터널 테이블 선언하기 (어떤 테이블을 만들까?)
인터널 테이블을 선언하는 방법은 크게 두 가지로 나눌 수 있으며, 주로 TYPES와 DATA 키워드를 함께 사용합니다.
(1) 인라인 선언 (Inline Declaration) 간단한 경우에 많이 사용하며, DATA(lt_table) = VALUE ... 와 같이 데이터가 할당될 때 타입을 추론하게 합니다.
(2) 명시적 선언 (Explicit Declaration) 재사용성이 높고 복잡한 구조에 적합하며, ABAP 개발의 표준적인 방식입니다.
- 라인 타입(Line Type) 정의: 테이블의 한 행이 어떤 구조를 가질지 먼저 정의합니다.
-
ABAP
TYPES: BEGIN OF ty_customer, " 고객 정보를 담을 구조 정의 kunnr TYPE kna1-kunnr, " 고객 번호 name1 TYPE kna1-name1, " 고객 이름 land1 TYPE kna1-land1, " 국가 키 END OF ty_customer. - 인터널 테이블 선언: 정의된 라인 타입을 사용하여 인터널 테이블을 선언합니다.
- STANDARD TABLE: 가장 일반적인 테이블 타입으로, 인덱스를 이용한 접근과 키를 이용한 접근 모두 가능합니다. 내부적으로는 이진 검색(Binary Search) 등을 통해 성능을 최적화합니다.
- SORTED TABLE: 특정 키 필드에 따라 항상 정렬된 상태를 유지하는 테이블입니다. 키 필드를 이용한 읽기(READ TABLE WITH KEY)가 매우 빠릅니다. 데이터 삽입 시에도 자동으로 정렬 위치를 찾아 삽입합니다.
- HASHED TABLE: 고유한 키를 가지며, 해싱(Hashing) 기법을 사용하여 키 필드를 이용한 읽기(READ TABLE WITH KEY)가 매우 빠릅니다. 인덱스를 이용한 접근은 불가능합니다.
- WITH EMPTY KEY: SAP NetWeaver 7.4 이상 버전에서 기본 키를 명시적으로 지정하지 않을 때 사용합니다. 키 필드를 지정하려면 WITH UNIQUE KEY field1 field2... 또는 WITH NON-UNIQUE KEY field1 field2...와 같이 선언합니다.
- gs_customer (작업 영역): 인터널 테이블 gt_customers에서 한 행을 읽어오거나 한 행을 추가할 때 임시로 데이터를 담는 변수입니다.
-
ABAP
DATA: gt_customers TYPE STANDARD TABLE OF ty_customer WITH EMPTY KEY, " 표준 테이블 gs_customer TYPE ty_customer. " 작업 영역 (한 행)
3. 인터널 테이블 조작하기 (데이터를 다루는 기술)
인터널 테이블의 데이터를 다루는 주요 명령어들을 살펴보겠습니다.
(1) 데이터 추가 (APPEND) 인터널 테이블의 마지막에 새로운 행을 추가합니다.
gs_customer-kunnr = 'C001'.
gs_customer-name1 = '홍길동'.
gs_customer-land1 = 'KR'.
APPEND gs_customer TO gt_customers. " gt_customers에 gs_customer의 내용 추가
(2) 데이터 읽기 (READ TABLE) 인터널 테이블에서 특정 조건에 맞는 행을 읽어옵니다.
READ TABLE gt_customers INTO gs_customer WITH KEY kunnr = 'C001'.
IF sy-subrc EQ 0. " 찾았다면
WRITE: / '고객 이름:', gs_customer-name1.
ELSE.
WRITE: / '해당 고객을 찾을 수 없습니다.'.
ENDIF.
(3) 데이터 수정 (MODIFY) 인터널 테이블의 기존 행을 수정합니다.
READ TABLE gt_customers INTO gs_customer WITH KEY kunnr = 'C001'.
IF sy-subrc EQ 0.
gs_customer-name1 = '김철수'. " 작업 영역의 데이터 수정
MODIFY TABLE gt_customers FROM gs_customer. " 인터널 테이블에 반영
ENDIF.
(4) 데이터 삭제 (DELETE) 인터널 테이블에서 특정 조건에 맞는 행을 삭제합니다.
DELETE TABLE gt_customers WHERE kunnr = 'C001'.
(5) 데이터 반복 처리 (LOOP AT) 인터널 테이블의 모든 행을 반복적으로 처리합니다.
LOOP AT gt_customers INTO gs_customer.
WRITE: / gs_customer-kunnr, gs_customer-name1, gs_customer-land1.
ENDLOOP.
- LOOP AT ... ASSIGNING <fs>: 작업 영역 대신 필드 심볼(Field Symbol)을 사용하여 직접 메모리 영역에 접근하여 성능을 향상시킬 수 있습니다. 대량 데이터 처리 시 유리합니다.
- LOOP AT ... REFERENCE INTO DATA(lr_ref): 데이터 참조(Data Reference)를 통해 처리하는 방식입니다.
(6) 정렬 (SORT) 인터널 테이블을 특정 필드를 기준으로 정렬합니다.
SORT gt_customers BY land1 ASCENDING name1 DESCENDING. " 국가 오름차순, 이름 내림차순
(7) 중복 제거 (DELETE ADJACENT DUPLICATES) 연속된 중복 행을 제거합니다. (사용 전에 반드시 정렬이 필요)
SORT gt_customers BY kunnr.
DELETE ADJACENT DUPLICATES FROM gt_customers COMPARING kunnr.
4. 인터널 테이블 성능 최적화 팁 (빠르고 효율적인 코드 작성)
인터널 테이블을 잘못 사용하면 심각한 성능 저하를 초래할 수 있습니다. 다음 팁들을 통해 효율적인 코드를 작성하세요.
- 테이블 타입 선택의 중요성:
- STANDARD TABLE: 인덱스 접근(READ TABLE INDEX), LOOP AT에 적합하며, SORTED나 HASHED 테이블을 사용할 이유가 없을 때 기본적으로 사용합니다.
- SORTED TABLE: 특정 키로 자주 READ TABLE하거나, 항상 정렬된 상태를 유지해야 할 때 좋습니다. 삽입 시 정렬 오버헤드가 있습니다.
- HASHED TABLE: 고유 키로 READ TABLE이 매우 빈번할 때 최고의 성능을 보여줍니다. 키 필드를 반드시 명시해야 합니다.
- READ TABLE 시 BINARY SEARCH 활용: STANDARD TABLE에서 특정 키로 데이터를 찾을 때, 미리 테이블을 키 필드로 정렬하고 READ TABLE ... WITH KEY ... BINARY SEARCH를 사용하면 선형 검색보다 훨씬 빠르게 데이터를 찾을 수 있습니다.
- FOR ALL ENTRIES 활용: 데이터베이스에서 여러 데이터를 한 번에 가져올 때 SELECT ... FOR ALL ENTRIES IN 구문을 사용하면 LOOP 안에서 SELECT SINGLE을 사용하는 것보다 훨씬 효율적입니다.
- FIELD-SYMBOLS 활용: LOOP AT ... ASSIGNING <fs>나 READ TABLE ... ASSIGNING <fs>를 사용하면 작업 영역으로 복사하는 오버헤드를 줄여 성능을 향상시킬 수 있습니다. 대량 데이터 처리 시 특히 효과적입니다.
- 불필요한 LOOP와 SELECT 피하기: 동일한 데이터를 반복적으로 읽거나, LOOP 안에서 SELECT SINGLE을 계속 수행하는 것은 성능에 매우 치명적입니다. 최대한 데이터를 한 번에 읽어와 인터널 테이블에 담고 메모리에서 처리하는 것이 좋습니다.
- COLLECT 명령어: 키 필드가 동일한 행의 숫자 필드를 자동으로 합산하여 중복을 제거할 때 사용합니다. 간단한 합계 집계에 유용합니다.
- DELETE ADJACENT DUPLICATES 사용 전 SORT 필수: DELETE ADJACENT DUPLICATES는 인접한 중복을 제거하므로, 전체 테이블에서 중복을 제거하려면 반드시 해당 키 필드로 미리 SORT 해야 합니다.
마치며: 인터널 테이블, ABAP 개발의 핵심 경쟁력
인터널 테이블은 ABAP 개발자가 SAP 시스템에서 데이터를 효율적으로 다루기 위한 필수적인 도구입니다. 인터널 테이블의 다양한 타입과 조작 명령어를 숙지하고, 성능 최적화 팁을 적용하여 코드를 작성한다면, 더욱 빠르고 안정적인 ABAP 프로그램을 개발할 수 있을 것입니다. 인터널 테이블을 능숙하게 다루는 것은 곧 ABAP 개발 역량의 핵심 경쟁력으로 이어집니다.
다음 ABAP 포스팅에서는 ALV 리포트의 고급 기능이나 Function Module 개발 등, 여러분의 ABAP 실력을 한 단계 더 업그레이드할 수 있는 내용을 가지고 찾아뵙겠습니다.
디지털 현자 드림.
'SAP' 카테고리의 다른 글
| ABAP OData 서비스 개발: SAP 데이터를 외부 시스템과 연결하는 방법 (기본편) (2) | 2025.07.17 |
|---|---|
| SAP Smart Forms/Adobe Forms 개발: 맞춤형 출력 양식의 모든 것 (기본편) (0) | 2025.07.16 |
| SAP ALV 리포트 개발 마스터: 데이터 시각화의 모든 것 (기본편) (4) | 2025.07.14 |
| SAP SD(판매 및 유통): 영업 프로세스 효율화를 위한 핵심 모듈 (0) | 2025.07.13 |
| SAP MM(자재 관리): 효율적인 구매 및 재고 관리를 위한 필수 가이드 (0) | 2025.07.12 |