ABAP Clean Code

ABAP 클린 코드 - 테이블 [3-2]

Dev Do 2024. 8. 15. 22:47
반응형
“READ TABLE이나 LOOP AT보다 LINE EXISTS 구문을 사용하라”는 지침은 특정 상황에서 데이터를 탐색할 때, 보다 효율적인 방법을 사용하라는 의미입니다. LINE EXISTS 구문은 테이블에서 특정 조건에 맞는 행이 존재하는지 여부를 빠르게 확인할 때 사용하는 구문으로, 단순한 존재 여부를 확인할 때 READ TABLE이나 LOOP AT보다 성능과 가독성 측면에서 이점이 있습니다.

 

LINE EXISTS 구문의 사용

  • LINE EXISTS 구문은 ABAP에서 테이블에 특정 조건을 만족하는 행이 있는지 확인하는 데 사용됩니다. 이 구문은 READ TABLE이나 LOOP AT과 달리, 데이터를 실제로 읽어오지 않고, 해당 조건을 만족하는 행이 존재하는지 여부만 확인합니다.
* line_exists 사용
IF line_exists( lt_table[ field = 'value' ] ).
* 해당 행이 존재할 때 수행할 로직을 작성
ENDIF.

위 코드에서 line_existslt_table 내부에서 field'value'인 행이 있는지 확인합니다.

 

READ TABLE 구문의 사용

  • READ TABLE은 테이블에서 특정 조건을 만족하는 행을 실제로 읽어와서 해당 변수에 할당합니다. 하지만 단순히 행이 존재하는지만 확인할 경우, 데이터를 읽어올 필요 없이 존재 여부만 확인하는 것이 더 효율적입니다.
* READ TABLE의 잘못된 패턴
READ TABLE lt_table WITH KEY field = 'value' INTO ls_row.
IF sy-subrc = 0.
* 행이 존재할 때 수행할 로직을 작성
ENDIF.

 

LOOP AT 구문의 사용

  • LOOP AT은 테이블의 모든 행을 순회하며 특정 조건을 만족하는 행을 찾습니다. 하지만 단순한 존재 여부 확인을 위해 LOOP AT을 사용하는 것은 비효율적입니다.
* LOOP AT의 잘못된 패턴
LOOP AT lt_table INTO ls_row WHERE field = 'value'.
* 첫 번째 일치하는 행을 찾았을 때
  EXIT.
ENDLOOP.
IF sy-subrc = 0.
* 행이 존재할 때 수행할 로직을 작성
ENDIF.

 

LINE EXISTS 구문의 장점

  1. 성능: LINE EXISTS는 데이터를 실제로 읽지 않으므로, READ TABLE이나 LOOP AT보다 성능이 더 좋습니다. 이는 특히 대용량 테이블에서 큰 차이를 만들 수 있습니다.
  2. 가독성: LINE EXISTS는 코드의 의도를 더 명확하게 표현합니다. 이 구문은 단순히 행이 존재하는지 여부만 확인하기 때문에, 코드가 간결하고 쉽게 이해할 수 있습니다.
  3. 효율성: LINE EXISTS는 조건을 만족하는 첫 번째 행을 찾는 즉시 종료되므로, 성능적으로 더 효율적입니다. 반면, LOOP AT은 조건을 만족하는 행을 찾더라도 루프가 계속될 수 있으며, 이는 불필요한 성능 저하를 초래할 수 있습니다.
“READ TABLE이나 LOOP AT보다 LINE EXISTS 구문을 사용하라”는 단순히 특정 조건을 만족하는 행이 테이블에 존재하는지 여부만 확인할 때는 LINE EXISTS를 사용하라는 의미입니다. 이 구문은 성능적으로 더 효율적이며, 코드의 가독성과 명확성을 높여줍니다. 특히 대용량 테이블이나 단순 존재 확인 작업에서는 READ TABLE이나 LOOP AT보다 더 적합한 선택입니다.

 

“LOOP AT보다 READ TABLE 구문을 사용하라”는 지침은 ABAP에서 데이터를 검색할 때 불필요한 반복을 피하고, 더 효율적인 검색 방법을 사용하라는 의미입니다. 이 지침은 특히 특정 조건을 만족하는 단일 행을 검색할 때 성능을 최적화하고, 코드의 명확성을 높이는 데 중점을 둡니다.

 

LOOP AT과 READ TABLE의 차이점

 

LOOP AT

  • LOOP AT은 내부 테이블의 모든 행을 순차적으로 순회하면서 특정 조건에 맞는 데이터를 찾는 데 사용됩니다.
  • 만약 테이블의 특정 행을 찾기 위해 LOOP AT을 사용하면, 테이블의 크기가 커질수록 성능이 저하될 수 있습니다. 테이블의 모든 항목을 순차적으로 탐색하기 때문에, 첫 번째로 발견한 항목을 찾더라도 루프는 계속 실행될 수 있습니다.

READ TABLE

  • READ TABLE은 내부 테이블에서 특정 조건을 만족하는 단일 행을 검색하는 데 사용됩니다. 이 구문은 조건에 맞는 행을 찾으면 즉시 작업을 종료하므로, 성능이 더 뛰어납니다.
  • READ TABLE은 키 기반 검색 시 특히 유용하며, 내부적으로 효율적인 검색 알고리즘을 사용하여 테이블 크기에 관계없이 빠르게 데이터를 찾습니다.

왜 READ TABLE이 더 효율적일까?

  1. 성능 최적화: LOOP AT은 내부 테이블의 모든 행을 순차적으로 탐색하는 반면, READ TABLE은 조건에 맞는 단일 행을 즉시 검색합니다. 특히 키 기반 검색에서는 READ TABLE이 내부적으로 더 최적화된 검색 방식을 사용하므로, 성능이 뛰어납니다.
  2. 명확성: READ TABLE은 특정 조건을 만족하는 행을 검색하려는 의도를 명확하게 표현합니다. 단일 행을 검색할 때 READ TABLE을 사용하면 코드의 가독성이 높아지며, 의도가 명확해집니다.
  3. 불필요한 반복 제거: LOOP AT을 사용하면 조건을 만족하는 행을 찾더라도 루프는 계속 실행될 수 있습니다. 이 경우 EXIT 구문으로 루프를 조기 종료해야 하지만, 코드가 복잡해지고 실수의 여지가 생깁니다. READ TABLE은 불필요한 반복을 피하고, 조건을 만족하는 첫 번째 행을 즉시 반환합니다.
  4. 조건부 검색: READ TABLE은 특정 조건을 만족하는 행을 찾아 데이터를 반환할 뿐만 아니라, 이 과정에서 여러 가지 검색 옵션을 제공하므로 다양한 조건에 맞게 검색할 수 있습니다.

언제 READ TABLE을 사용 해야 할까?

  1. 단일 행 검색: 테이블에서 특정 조건을 만족하는 단일 행을 검색하려는 경우, READ TABLE을 사용하면 더 효율적입니다.
  2. 키 기반 검색: 정렬 테이블(SORTED TABLE)이나 해시 테이블(HASHED TABLE)을 사용할 때, 키 기반 검색에 READ TABLE을 사용하면 성능 이점을 얻을 수 있습니다.
  3. 단순 존재 확인: 단순히 특정 조건을 만족하는 행이 존재하는지 여부를 확인할 때도 READ TABLE이 적합합니다. 이 경우 데이터를 실제로 읽지 않고 존재 여부만 확인하려면 LINE EXISTS 구문을 사용할 수도 있습니다.
“LOOP AT보다 READ TABLE 구문을 사용하라”는 특정 조건을 만족하는 단일 행을 찾는 작업에서는 READ TABLE이 LOOP AT보다 성능과 가독성 면에서 더 효율적이라는 의미입니다. READ TABLE은 테이블 검색 작업을 최적화하고, 불필요한 반복을 제거하여 코드의 명확성과 유지보수성을 높여줍니다. 이 지침을 따르면 ABAP 코드의 성능을 크게 개선할 수 있습니다.

 

“중첩된 IF문보다 LOOP AT 구문을 사용하라”는 지침은 복잡한 조건문 대신 반복문을 사용하여 코드의 가독성과 효율성을 높이자는 의미입니다. 이 지침은 특히 여러 조건을 확인해야 하거나 동일한 유형의 작업을 반복적으로 수행할 때, 중첩된 IF문이 코드의 복잡성을 증가시킬 수 있기 때문에 이를 피하라는 조언입니다.

중첩된 IF문의 문제점

중첩된 IF문은 코드의 가독성을 저하시키고 유지보수성을 어렵게 만듭니다. 여러 조건이 중첩될수록 코드가 복잡해지고, 논리 흐름을 파악하기 어려워집니다. 

IF condition1 = '1'.
  IF condition2 = '2'.
    IF condition3 = '3'.
*      특정 작업 수행
    ENDIF.
  ENDIF.
ENDIF.

이와 같은 중첩된 IF문은 여러 조건을 확인해야 할 때 코드의 복잡성을 증가시키며, 읽고 이해하기 어렵습니다. 이 경우 LOOP AT을 사용하여 조건을 반복적으로 처리하는 것이 더 나을 수 있습니다.

 

LOOP AT 구문을 사용하는 이유

  1. 가독성 향상: LOOP AT 구문을 사용하면 코드의 논리가 단순해지고, 가독성이 향상됩니다. 중첩된 조건문 대신, 테이블에서 반복적으로 조건을 확인하거나 작업을 수행할 수 있습니다.
  2. 효율성: LOOP AT은 테이블의 모든 항목을 순회하면서 조건에 맞는 항목을 처리할 수 있습니다. 이 방식은 중첩된 IF문보다 코드의 구조가 더 명확해지며, 효율적인 데이터 처리를 가능하게 합니다.
  3. 유지보수성 증가: LOOP AT은 동일한 유형의 작업을 반복적으로 수행하는 경우에 적합하며, 중첩된 조건문을 제거함으로써 코드의 유지보수성을 높입니다. 코드 수정 시 중첩된 IF문보다 구조적으로 더 안정적입니다.
* 잘못된 패턴
IF lt_table IS NOT INITIAL.
  IF lt_table[ 1 ]-field1 = '1'.
    IF lt_table[ 1 ]-field2 = '2'.
      WRITE: / 'OK'.
    ENDIF.
  ENDIF.
ENDIF.

 

* LOOP AT 사용
LOOP AT lt_table INTO ls_row WHERE field1 = '1' AND field2 = '2'.
  WRITE: / 'OK'.
ENDLOOP.

 

언제 LOOP AT을 사용해야 할까?

  1. 데이터 집합을 처리할 때: 내부 테이블이나 목록을 순회하면서 특정 조건을 확인해야 할 때, LOOP AT을 사용하여 중첩된 조건문을 대체할 수 있습니다.
  2. 조건이 반복적일 때: 여러 항목에 대해 동일한 조건을 반복적으로 확인해야 한다면, LOOP AT 구문이 더 적합합니다. LOOP AT은 테이블의 각 항목을 처리하는 데 효율적입니다.
  3. 유사한 작업을 반복적으로 수행할 때: 중첩된 IF문에서 여러 조건에 따라 유사한 작업을 반복적으로 수행해야 한다면, LOOP AT을 사용하여 작업을 단순화하고 코드의 가독성을 높일 수 있습니다.
“중첩된 IF문보다 LOOP AT 구문을 사용하라”는 복잡한 조건문 대신 반복문을 사용하여 코드의 가독성과 효율성을 높이자는 의미입니다. 중첩된 IF문은 코드의 복잡성을 증가시키고 유지보수성을 저하시킬 수 있기 때문에, 반복적으로 조건을 확인하거나 처리해야 하는 경우에는 LOOP AT 구문을 사용하는 것이 더 나은 선택입니다.

 

“불필요한 테이블 읽는 것을 피하라”는 지침은 ABAP 프로그래밍에서 데이터베이스 또는 내부 테이블에 대한 불필요한 읽기 작업을 최소화하라는 의미입니다. 이는 성능 최적화, 코드 효율성, 그리고 시스템 자원의 적절한 사용을 위해 중요한 원칙입니다.

 

왜 불필요한 테이블 읽기를 피해야 하는가?

  1. 성능 저하: 데이터베이스 테이블이나 내부 테이블을 반복적으로 읽는 작업은 시스템 성능을 저하시킬 수 있습니다. 특히, 대규모 데이터베이스에서 자주 수행되는 읽기 작업은 실행 시간을 크게 늘릴 수 있습니다.
  2. 자원 낭비: 불필요한 읽기 작업은 시스템 자원(메모리, CPU 등)을 낭비하게 됩니다. 효율적으로 데이터를 읽고 관리하면, 자원 사용을 최적화할 수 있습니다.
  3. 중복 작업: 동일한 데이터를 반복해서 읽는 것은 중복된 작업을 초래할 수 있습니다. 이는 유지보수성을 저하시킬 수 있으며, 잘못된 결과를 가져올 수 있습니다.

1. 중복된 읽기 작업을 제거하라

 

데이터를 여러 번 읽지 않도록, 필요하다면 한 번 읽어서 필요한 곳에서 재사용하는 것이 중요합니다. 예를 들어, 동일한 데이터를 반복해서 읽지 않도록 한 번 읽은 데이터를 메모리에 저장한 후 사용합니다.

* 잘못된 패턴
READ TABLE lt_data WITH KEY id = '1' INTO ls_data.
IF sy-subrc = 0.
  WRITE: / ls_data-key.
ENDIF.

READ TABLE lt_data WITH KEY id = '1' INTO ls_data.
IF sy-subrc = 0.
  WRITE: / ls_data-value.
ENDIF.

 

* 올바른 패턴
READ TABLE lt_data WITH KEY id = '1' INTO ls_data.
IF sy-subrc = 0.
  WRITE: / ls_data-key,
           ls_data-value.
ENDIF.

 

2. 필요한 데이터만 읽어라

 

불필요한 데이터를 읽어오지 말고, 필요한 데이터만 선택적으로 읽는 것이 중요합니다. 이를 위해서 SQL 쿼리에서 SELECT 문을 사용할 때는 필드를 제한하거나, 조건을 사용하여 특정 데이터만 가져옵니다.

* 잘못된 패턴
SELECT * FROM mara INTO TABLE lt_mara.

 

* 올바른 패턴
SELECT matnr, ersda FROM mara INTO TABLE lt_mara WHERE matnr = '1'.

 

3. 필터링을 잘 활용하라

 

내부 테이블에서 특정 조건을 만족하는 데이터를 가져올 때는, 루프를 사용하여 모든 데이터를 순차적으로 확인하기보다는 필터링을 통해 필요한 데이터만 처리하는 것이 좋습니다.

* 잘못된 패턴
LOOP AT lt_table INTO ls_row.
  IF ls_row-field = '1'.
*    특정 작업 수행
  ENDIF.
ENDLOOP.

 

* 올바른 패턴
LOOP AT lt_table INTO ls_row WHERE field = '1'.
*  특정 작업 수행
ENDLOOP.

 

4. 캐시 사용 고려

 

동일한 데이터를 반복적으로 읽어야 하는 경우, 데이터를 메모리에 캐싱하여 다시 사용함으로써 데이터베이스 접근을 최소화할 수 있습니다.

 

예를 들어, 프로그램 실행 중 동일한 참조 데이터를 여러 번 사용할 경우, 처음에 한 번만 읽고 나머지 작업에서는 이 데이터를 메모리에서 참조할 수 있습니다.

 

5. 데이터베이스 접근 최소화

 

데이터베이스 테이블에서 데이터를 읽어오는 작업은 내부 테이블에서 데이터를 읽는 것보다 더 많은 리소스를 소모합니다. 가능한 한 데이터를 한 번에 읽어오고, 그 이후에는 내부 테이블에서 작업을 수행하는 것이 좋습니다.

* 잘못된 패턴
LOOP AT lt_keys INTO lv_key.
  SELECT * FROM mara INTO ls_mara WHERE matnr = lv_key.
*   특정 작업 수행
ENDLOOP.

 

* 올바른 패턴
SELECT * FROM mara INTO TABLE lt_mara FOR ALL ENTRIES IN lt_keys WHERE matnr = lt_keys-matnr.
LOOP AT lt_mara INTO ls_mara.
*   특정 작업 수행
ENDLOOP.

 

“불필요한 테이블 읽는 것을 피하라”는 지침은 성능 최적화와 코드 효율성을 높이기 위해 데이터베이스 및 내부 테이블 접근을 최소화하라는 의미입니다. 중복된 읽기 작업을 제거하고, 필요한 데이터만 선택적으로 읽으며, 필터링과 캐싱을 잘 활용하는 것이 중요합니다. 이를 통해 ABAP 프로그램의 성능을 크게 향상시킬 수 있습니다.
반응형

'ABAP Clean Code' 카테고리의 다른 글

ABAP 클린 코드 - Boolean 불리언 [5]  (0) 2024.08.17
ABAP 클린 코드 - 문자열 [4]  (0) 2024.08.16
ABAP 클린 코드 - 테이블 [3-1]  (0) 2024.08.14
ABAP 클린 코드 - 변수 [2]  (0) 2024.08.13
ABAP 클린 코드 - 상수 [1]  (0) 2024.08.13