바로투입이력카드
SAP 게시판

정보·팁

Clean ABAP ③ 내부 테이블 잘 쓰는 법: 키, 읽기, 루프

에이든ABAP 개발자운영자모듈 MMSD기타조회 4

3줄 요약

  • 테이블 종류는 용도로 골라요. HASHED 는 한 번 채우고 키로 자주 읽는 큰 테이블, SORTED 는 계속 정렬돼 있어야 하거나 부분 키로 읽는 큰 테이블, STANDARD 는 작은 테이블과 배열이에요.

  • WITH DEFAULT KEY 는 피하고, 키를 명시하거나 EMPTY KEY 를 써요.

  • 존재 확인에는 line_exists, 한 건 읽기에는 READ TABLE, 조건 루프에는 LOOP AT ... WHERE 로 의도를 드러내요.

어떤 상황에서 쓰나요

내부 테이블은 ABAP 코드의 절반쯤을 차지해요. 그래서 "어떤 종류로 선언하나", "있는지 어떻게 확인하나" 같은 사소한 선택이 쌓여 코드의 읽기 쉬움과 성능을 갈라요. Clean ABAP 가이드의 이 장은 그 선택에 대한 기본값을 정리해 줘요.

핵심 내용

테이블 종류 고르기 (가이드 스스로 "대략적인 지침"이라고 말해요)

  • HASHED: 큰 테이블, 한 번에 채움, 거의 수정 안 함, 키로 자주 읽음. 내용이 바뀔 때마다 해시를 다시 계산하는 비용이 크니 자주 바뀌는 테이블에는 맞지 않아요. 데이터가 많고 읽기가 많을 때만 값어치가 있어요.

  • SORTED: 큰 테이블, 항상 정렬돼 있어야 함, 조금씩 채우거나 수정함, 전체 키나 부분 키로 자주 읽음. 삽입할 자리를 찾아야 하지만 나머지 인덱스를 다시 맞출 필요는 없어요.

  • STANDARD: 작은 테이블, 순서가 상관없거나 넣은 순서대로 처리해야 하는 배열, 인덱스 접근과 SORT+BINARY SEARCH 접근이 둘 다 필요한 경우.

`DEFAULT KEY` 를 피해요. 새 함수형 문장을 쓰려고 습관처럼 붙이는 경우가 많은데, 키는 대부분 필요 없는데 자원만 쓰고 숫자형 필드를 키에 포함해 엉뚱한 결과를 낼 수 있어요. 특히 필드 목록 없는 SORT, DELETE ADJACENT DUPLICATES 는 기본 키를 따라가므로, READ TABLE ... BINARY SEARCH 와 함께 쓰면 예상 밖의 결과가 나올 수 있다고 해요.

DATA itab2 TYPE STANDARD TABLE OF row_type WITH NON-UNIQUE KEY comp1 comp2.
DATA itab1 TYPE STANDARD TABLE OF row_type WITH EMPTY KEY.

주의: EMPTY KEY 테이블을 필드 지정 없이 SORT 하면 아무것도 정렬되지 않아요. 키가 비어 있음을 정적으로 알 수 있으면 문법 경고가 나와요.

`INSERT INTO TABLE` 을 우선해요. 모든 테이블 종류와 키 종류에 쓸 수 있어서, 나중에 성능 때문에 테이블 종류를 바꿔도 이 문장은 고칠 필요가 없어요. APPEND TO 는 STANDARD 테이블을 배열처럼 쓰며 "맨 끝에 붙인다"는 점을 강조하고 싶을 때만 써요.

읽기는 의도가 보이게 써요.

IF line_exists( my_table[ key = 'A' ] ).                       " 있는지만 볼 때
READ TABLE my_table REFERENCE INTO DATA(line) WITH KEY key = 'A'.  " 한 건 읽을 때
LOOP AT my_table REFERENCE INTO DATA(line) WHERE key = 'A'.    " 조건에 맞는 모두

READ TABLE ... TRANSPORTING NO FIELDS 와 sy-subrc 검사, 또는 LOOP AT 안에서 EXIT 하는 방식은 같은 일을 더 길게 말해요. LOOP 안의 IF 로 거르는 것도 WHERE 로 바꾸는 게 의도가 분명해요.

불필요한 이중 읽기를 피해요. 행이 있을 거라고 기대하는 경우라면 먼저 line_exists 로 물어본 뒤 다시 읽지 말고, 한 번 읽고 예외로 처리해요.

TRY.
    DATA(row) = my_table[ key = input ].
  CATCH cx_sy_itab_line_not_found.
    RAISE EXCEPTION NEW /clean/my_data_not_found( ).
ENDTRY.

원문은 이것이 성능뿐 아니라 "정상 흐름과 오류 처리를 한 곳에 섞지 말라"는 일반 규칙의 한 경우라고 설명해요(이 연재의 여덟 번째 회에서 다뤄요).

주의할 점

  • 테이블 종류 선택은 가이드도 말하듯 대략적인 기준이에요. 데이터 크기와 접근 패턴을 실제로 재 보고 정하세요. 자세한 기준은 ABAP 언어 도움말의 "테이블 종류 선택" 항목에 있어요.

  • [ ] 테이블 식, VALUE #( ... OPTIONAL ), REFERENCE INTO DATA(...), RAISE EXCEPTION NEW 는 7.40 이상(일부는 그보다 높은 릴리스)에서만 돼요. ECC 에서는 쓰기 전에 문법 검사를 해 보세요. (7.40 기준은 원문에 적힌 것이 아니라 일반적으로 알려진 정보예요.)

  • 이 글은 원문을 읽고 정리한 것이에요. 예제를 직접 실행해 보지는 못했어요.

  • 원문은 2019년에 처음 공개되어 2025년 3월에 마지막으로 고쳐진 문서예요(제가 읽은 판은 2026년 10월 기준). 이 글은 읽고 정리한 것이고 예제를 직접 실행해 보지는 않았어요.

원문 주소: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#tables

출처와 이용 안내
  • 원문: Clean ABAP - Tables · 작성자 SAP SE and contributors SAP/styleguides · 작성일 2019-05-01 · 기준 릴리스에 따라 다름 원문은 최신 ABAP 기준 · 확인일 2026-10-25

  • 이 글은 위 원문을 읽고 한국어로 요약·재구성한 글이며 번역본이 아니에요. 원문의 저작권은 작성자와 SAP에 있어요.

  • 원문은 CC BY 3.0 라이선스(https://creativecommons.org/licenses/by/3.0/)로 공개된 자료예요. 이 글은 내용을 한국어로 줄이고 순서를 바꾼 변경본이며, 원저작자가 이 글을 보증하지 않아요.

  • 설정과 화면은 릴리스마다 달라요. 적용하기 전에 원문과 SAP Help Portal, 관련 SAP Note에서 최신 내용을 확인해 주세요.

  • SAP와 SAP 제품명은 SAP SE의 상표예요. 바로투입은 SAP와 관련이 없어요.

댓글 0

아직 댓글이 없어요.

정보·팁 목록전체 목록