목차
1. PERFORM, MODULE, INCLUDE 란?
PERFORM, MODULE 그리고 INCLUDE는 프로그램의 구조를 정의하고, 코드를 모듈화하는 데 사용되는 중요한 키워드입니다. 이들은 프로그램의 가독성을 향상시키고, 재사용성을 높이며, 유지보수를 용이하게 하는데 기여합니다.
3개 모두 프로그램 내에서 반복적인 코드를 그룹화하여 재사용 목적으로 사용한다고 이해하시면 쉽습니다.
그럼 하나씩 예제를 통해 특징들을 살펴보겠습니다.
2. PERFORM 특징 및 사용 예제
PERFORM 문은 ABAP 프로그램 내에 정의된 서브루틴을 호출하는 데 사용됩니다.
서브루틴은 특정 작업을 수행하는 코드 블록으로, FORM과 ENDFORM 키워드로 정의됩니다.
PERFORM을 사용하면 코드를 모듈화하여 필요할 때마다 재사용할 수 있습니다.
TYPES: BEGIN OF TY_SFLIGHT,
CARRID TYPE SFLIGHT-CARRID,
CARRNAME TYPE SCARR-CARRNAME,
END OF TY_SFLIGHT.
DATA : GS_SFLIGHT TYPE TY_SFLIGHT,
GT_SFLIGHT TYPE TABLE OF TY_SFLIGHT.
START-OF-SELECTION.
GS_SFLIGHT-CARRID = 'AA'.
SELECT SINGLE CARRNAME
INTO GS_SFLIGHT-CARRID
FROM SCARR
WHERE CARRID = GS_SFLIGHT-CARRID.
APPEND GS_SFLIGHT TO GT_SFLIGHT.
GS_SFLIGHT-CARRID = 'LH'.
SELECT SINGLE CARRNAME
INTO GS_SFLIGHT-CARRID
FROM SCARR
WHERE CARRID = GS_SFLIGHT-CARRID.
APPEND GS_SFLIGHT TO GT_SFLIGHT.
위 예제는 항공사코드에 대한 항공사명을 찾아 내부 테이블 행을 추가하는 소스입니다.
항공사코드로 SCARR테이블에서 항공사명을 SELECT하는 부분과 구조체를 통해 내부 테이블을 APPEND하는 부분을 확인해보면 완벽히 동일한 코드가 두번 반복됩니다.
반복되는 코드를 PERFORM문으로 그룹화하도록 수정해 보겠습니다.
TYPES: BEGIN OF TY_SFLIGHT,
CARRID TYPE SFLIGHT-CARRID,
CARRNAME TYPE SCARR-CARRNAME,
END OF TY_SFLIGHT.
DATA : GS_SFLIGHT TYPE TY_SFLIGHT,
GT_SFLIGHT TYPE TABLE OF TY_SFLIGHT.
START-OF-SELECTION.
GS_SFLIGHT-CARRID = 'AA'.
PERFORM GET_CARRNAME.
GS_SFLIGHT-CARRID = 'LH'.
PERFORM GET_CARRNAME.
*&---------------------------------------------------------------------*
*& Form GET_CARRNAME
*&---------------------------------------------------------------------*
FORM GET_CARRNAME .
SELECT SINGLE CARRNAME
INTO GS_SFLIGHT-CARRID
FROM SCARR
WHERE CARRID = GS_SFLIGHT-CARRID.
APPEND GS_SFLIGHT TO GT_SFLIGHT.
ENDFORM.
GET_CARRNAME이라는 PERFORM문을 만들고 기존에 반복적으로 사용했던 로직을 PERFORM문 안쪽 FORM ~ ENDFORM 사이에 넣었습니다.
이제 프로그램에서 PERFORM GET_CARRNAME을 사용하게 되면 그 안쪽 로직을 타게 되어 이전소스와 결과는 동일하지만 소스는 간결해지고 가독성도 좋아집니다.
3. MODULE 특징 및 사용 예제
MODULE은 주로 화면(Screen) 처리 로직을 모듈화하는 데 사용됩니다.
MODULE은 화면 (Screen) 에서 발생하는 이벤트를 처리하기 위한 코드 블록으로, MODULE과 ENDMODULE 키워드로 정의됩니다. PERFORM문과 비슷하고 화면(Screen)에서 사용한다고 일단 이해하시면 됩니다.
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
PROCESS AFTER INPUT.
MODULE EXIT AT EXIT-COMMAND.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '0100'.
SET TITLEBAR '0100'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
MODULE EXIT INPUT.
CASE SY-UCOMM.
WHEN 'BACK' OR 'EXIT' OR 'CANC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " EXIT INPUT
위 예제는 화면(Screen)의 흐름로직 부분입니다. 곳곳에 MODULE을 사용한 부분이 보이고 MODULE ~ ENDMODULE부분에 해당 MODULE에 대한 로직이 들어가 있습니다.
흐름로직의 'PROCESS BEFORE OUTPUT'부분을 줄여서 PBO라고 하고 'PROCESS AFTER INPUT'부분을 줄여서 PAI로 지칭합니다. 앞으로 자주나오는 용어라서 기억해 두시면 좋습니다.
화면(Screen)에서 로직을 추가할때는 MODULE을 사용한다고만 이해하시고 ALV시간에 다시 설명드리겠습니다.
4. INCLUDE 특징 및 사용 예제
INCLUDE 문은 다른 프로그램 또는 라이브러리의 코드 블록을 현재 프로그램 내로 포함시키는 데 사용됩니다.
코드를 여러 파일로 분리하여 관리할 수 있게 해주며, 이를 통해 코드의 중복을 방지하고 재사용성을 높일 수 있습니다.
아직 이해하기 어려운 부분이기 때문에 이번장에서는 아래와 같은 기능을 한다 정도로만 이해하시면 됩니다.
PERFORM, MODULE을 사용하게 되면 FORM ~ ENDFORM, MODULE ~ ENDMODULE 이부분이 MAIN 프로그램에 위치하게 됩니다. 해당 소스가 MAIN프로그램에 보이게되면 이또한 지저분해지고 가독성이 안좋아지기 때문에 이 부분을 INCLUDE안에 정리를 합니다.
REPORT ZEDU11.
*-----------------------------------------------------------------------
* INCLUDE
*-----------------------------------------------------------------------
INCLUDE ZEDU11_TOP.
INCLUDE ZEDU11_F01.
INCLUDE ZEDU11_O01.
INCLUDE ZEDU11_I01.
보통 REPORT프로그램을 생성하면 4개의 INCLUDE를 만듭니다.
INCLUDE갯수와 네이밍은 꼭 그래야 하는건 아니지만 이번장은 INCLUDE를 활용하는 방법을 알려드리는 시간이라 이 기준으로 설명드리겠습니다.
TOP INCLUDE : 프로그램 내에서 사용할 변수, 구조체, 내부 테이블등을 선언하는 INCLUDE입니다.
F01 INCLUDE : FORM ~ ENDFORM을 위한 INCLUDE입니다. 필요하면 F02, F03으로 생성하여 관리합니다.
O01 INCLUDE : MODULE ~ ENDMODULE를 위한 INCLUDE입니다. 화면(Screen)의 PBO쪽 MODULE이 대상입니다.
I01 INCLUDE : MODULE ~ ENDMODULE를 위한 INCLUDE입니다. 화면(Screen)의 PAI쪽 MODULE이 대상입니다.
5. PERFORM, MODULE, INCLUDE 장점
INCLUDE, PERFORM, MODULE 키워드는 각각 코드의 재사용성, 모듈화, 그리고 유지보수성을 강화하는 데 기여하며, ABAP 프로그램 개발에서 더 나은 코드 구조와 프로그램 효율성을 달성하는 데 중요한 도구입니다.