도입
ABAP 개발을 하다 보면 SELECT 쿼리나 Internal Table 처리 시 중복된 데이터를 다뤄야 할 경우가 많습니다. 예를 들어 고객 리스트, 오더 내역, 자재 코드 등을 불러올 때 동일한 값이 여러 번 조회되면 이후 처리 로직이나 보고서 출력 시 문제가 될 수 있습니다.
이번 글에서는 ABAP에서 중복 데이터를 제거하는 여러 가지 방법을 소개하고, 각 방법의 장단점과 주의사항, 실무에서 자주 사용하는 코드 예제를 함께 안내드립니다.
SELECT DISTINCT를 활용한 중복 제거
SQL 레벨에서 가장 간단하게 중복을 제거할 수 있는 방법은 SELECT DISTINCT 구문을 사용하는 것입니다.
예제
SELECT DISTINCT matnr
INTO TABLE lt_matnr
FROM mara
WHERE mtart = 'FERT'.
위 예제는 자재 유형이 ‘FERT’인 자재 번호(matnr)를 중복 없이 가져오는 방식입니다.
주의사항
- DISTINCT는 SELECT된 모든 필드가 동일해야 중복으로 인식됩니다.
- PERFORMANCE 이슈가 발생할 수 있으므로 대량 데이터 처리 시 주의해야 합니다.
Internal Table에서 중복 제거하기
내부 테이블에 데이터를 SELECT 한 후 중복 제거가 필요한 경우가 있습니다. 이때는 DELETE ADJACENT DUPLICATES BY 구문을 사용합니다.
예제
DATA: lt_data TYPE TABLE OF mara,
lt_result TYPE TABLE OF mara.
SELECT matnr mtart
INTO TABLE lt_data
FROM mara
WHERE matnr LIKE 'A%'.
SORT lt_data BY matnr.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING matnr.
lt_result = lt_data.
이 코드는 matnr 기준으로 중복된 데이터를 제거합니다.
중요 포인트
- SORT 구문이 반드시 필요합니다. 정렬이 되지 않으면 예상치 못한 결과가 나올 수 있습니다.
- 중복 판단 기준은 COMPARING 절에 명시된 필드입니다.
여러 필드를 기준으로 중복 제거
하나의 필드뿐 아니라 여러 필드를 동시에 비교해 중복을 제거할 수도 있습니다.
예제
SORT lt_data BY matnr mtart.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING matnr mtart.
이 경우 matnr과 mtart가 모두 같은 경우에만 중복으로 간주하여 삭제됩니다.
고급: HASHED TABLE을 활용한 중복 제거
데이터가 방대하거나 중복 제거가 매우 빈번한 경우에는 HASHED TABLE을 사용해 중복을 사전에 차단하는 방식도 효과적입니다.
예제
DATA: lt_unique TYPE HASHED TABLE OF mara
WITH UNIQUE KEY matnr.
SELECT matnr mtart
INTO TABLE lt_unique
FROM mara
WHERE mtart = 'FERT'.
matnr이 같은 데이터는 자동으로 무시되므로, 별도로 중복 제거가 필요 없습니다.
실무에서의 성능 고려사항
- SELECT DISTINCT는 DB 성능에 영향을 줄 수 있으므로 대량 데이터 처리 시 유의해야 합니다.
- 내부 테이블의 중복 제거는 메모리 상에서 처리되므로 상대적으로 성능에 유리합니다.
- HASHED TABLE은 검색/중복 방지에 강력하지만, 정렬이 불가능하므로 정렬이 필요한 경우는 SORTED TABLE 고려 필요
결론
ABAP에서 중복 데이터를 제거하는 방법은 상황에 따라 다양하게 존재합니다. 가장 간단한 방법은 SELECT DISTINCT지만, SELECT 후 내부 테이블에서 SORT + DELETE ADJACENT DUPLICATES 조합도 실무에서 매우 자주 사용됩니다. 또한 성능과 구조를 고려해 HASHED TABLE을 사용하는 전략도 병행하면 좋습니다.
중복 제거는 단순한 문제 같지만, 시스템 자원과 성능에 영향을 줄 수 있으므로 각 방법의 특징을 이해하고 적절히 선택하는 것이 중요합니다.