-
4. ABAP 서브루틴, 함수SAP/개념정리 2025. 6. 19. 13:24
ABAP에서 subroutine과 function module은 둘 다 기능별로 모듈화 하고 코드를 재사용하기 위한 구조이다.
하지만 둘의 역할과 활용 방식이 다르다.
1. Subroutine(서브루틴)
- ABAP 프로그램 안에서 FORM ... ENDFORM 구문으로 정의된 내부 프로시저 (Loacal Modularization)
특징
- 같은 프로그램 안에서 재사용하거나 PERFORM ... IN PROGRAM으로 다른 프로그램에서도 호출 가능
- 전역 변수에 의존
- 간단한 로직 처리에 자주 사용
- 구조가 단순해서 빠르게 작성 가능
- 모듈화는 되어 있지만 캡슐화는 약함
※ 캡슐화
- 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것.
서브루틴 코드 작성 예시
PERFORM write_data. FORM write_data. WRITE 'Subroutine Test'. ENDFORM.
서브루틴의 파라미터 전달 방식
1. USING
- 값을 읽기 전용으로 넘길 때, 해당 방식으로 값을 전달하는 경우 서브루틴 안에서 읽기만 하는 용도로 사용한다.
FORM say_hello USING p_name TYPE string. WRITE: / 'Hello', p_name. ENDFORM. START-OF-SELECTION. PERFORM say_hello USING 'Alice'.
2. CHANGING
- 값을 변경해서 돌려줄 때, 값을 넘기고 서브루틴 안에서 그 값을 수정한 결과를 되돌려주는 용도로 사용한다.
FORM increase_count CHANGING p_count TYPE i. p_count = p_count + 1. ENDFORM. START-OF-SELECTION. DATA(lv_cnt) = 5. PERFORM increase_count CHANGING lv_cnt. WRITE: / '결과:', lv_cnt. " 출력: 결과: 6
USING과 CHANGING 함께 사용하기
FORM calculate_area USING p_width TYPE i p_height TYPE i CHANGING p_area TYPE i. p_area = p_width * p_height. ENDFORM. START-OF-SELECTION. DATA: lv_w TYPE i VALUE 10, lv_h TYPE i VALUE 5, lv_a TYPE i. PERFORM calculate_area USING lv_w lv_h CHANGING lv_a. WRITE: / '넓이:', lv_a. " 출력: 넓이: 50
- lv_w, lv_h는 읽기 용도 (USING)
- lv_a는 계산 결과가 담겨서 되돌아옴 (CHANGING)
3. VALUE 구문
- Call by Value로 값 전달. (VALUE 구문을 사용하지 않으면 Call by Reference로 값 전달)
DATA(val) = 10. PERFORM change_val USING VALUE(val). WRITE: / 'After FORM:', val. FORM change_val USING VALUE(pval). pval = 999. "이 변경은 외부 val에는 영향 없음 ENDFORM. * 결과 After FORM: 10
DATA(val) = 10. PERFORM change_val USING val. WRITE: / 'After FORM:', val. FORM change_val USING pval. pval = 999. "이 변경은 외부 val에는 영향 없음 ENDFORM. * 결과 After FORM: 999
CHANGING에서 VALUE 구문을 사용할 경우
- Call by Value and Result 방식, 값을 복사해 사용하고 내부에서 값을 변경하여 외부로 전달
DATA : gv_val1 TYPE i VALUE 2. DATA : gv_val2 TYPE i VALUE 3. DATA : gv_sum TYPE i. PERFORM sum_data USING gv_val1 gv_val2 CHANGING gv_sum. WRITE : / 'Result: ', gv_sum. FORM sum_data USING value(p_val1) value(p_val2) CHANGING value(p_sum). p_sum = p_val1 + p_val2. ENDFORM. * 결과 Result: 5
* 용어 정리
- Actual Parameter : 서브루틴을 호출할 때 사용되는 파라미터, PERFORM 구문 작성시 사용하는 파라미터.
- Formal Parameter : 서브루틴에서 사용되는 파라미터, FORM 구문 작성시 사용하는 파라미터.
서브루틴 파라미터로 구조체를 사용할 수 있다. (STRUCTURE, TYPE, LIKE를 사용하여 정의할 수 있다.)
FORM subr USING p_str STRUCTURE str. FORM subr USING p_str TYPE str. FORM subr USING p_str LIKE str.
인터널 테이블도 사용할 수 있다.
FORM subr USING pt_itab TYPE TABLE. FORM subr USING pt_itab TYPE ANY TABLE. FORM subr USING pt_itab TYPE INDEX TABLE. FORM subr USING pt_itab TYPE STANDARD TABLE. FORM subr USING pt_itab TYPE SORTED TABLE. FORM subr USING pt_itab TYPE HASHED TABLE. FORM subr USING pt_itab TYPE t_itab. FORM subr USING pt_itab LIKE gt_itab.
4. 외부 서브루틴 호출
지금까지 내부에 있는 서브루틴만 호출했지만, 다른 프로그램의 서브루틴을 호출하는 방법도 있다.
REPORT ZTEST01. FORM sum_data USING value(p_val1) value(p_val2) CHANGING p_sum. p_sum = p_val1 + p_val2. ENDFORM.
REPORT ZTEST02. DATA : gv_val1 TYPE i VALUE 4. DATA : gv_val2 TYPE i VALUE 3. DATA : gv_sum TYPE i. PERFORM sum_data(ztest01) IF FOUND USING gv_val1 gv_val2 CHANGING gv_sum. WRITE : / 'Result: ', gv_sum. * 결과 Result: 7
* IF FOUND : 해당 서브루틴이 존재하는지 체크한다.
REPORT ZTEST02. DATA : gv_val1 TYPE i VALUE 4. DATA : gv_val2 TYPE i VALUE 3. DATA : gv_sum TYPE i. PERFORM sum_data IN PROGRAM ztest01 IF FOUND USING gv_val1 gv_val2 CHANGING gv_sum. WRITE : / 'Result: ', gv_sum.
- IN PROGRAM을 사용해서 호출할 수 있다. 해당 구문을 사용하면 동적지정도 가능하다.
5. 서브루틴 호출 옵션
- ON COMMIT: COMMIT WORK를 만나면 서브루틴 호출.
- ON ROLLBACK : ROLLBACK WORK를 만나면 서브루틴 호출.
DATA : gs_scarr LIKE scarr, gv_flg TYPE. SELECT * SINGLE * FROM scarr INTO gs_scarr WHERE carrid = 'AA'. PERFORM delete_data USING as_scarr. PERFORM insert_data ON COMMIT. IF gv_flg = 'X'. COMMIT WORK. ENDIF. FORM delete_data USING value(as_scarr) TYPE scarr. DELETE scarr FROM ps_scarr. IF sy-subrc EQ 0. gv_flg = 'X'. ENDIF. ENDFORM. FORM insert_data. INSERT scarr FROM gs_scarr. ENDFORM.
2. Function Module(함수)
- SAP의 Function Builder(SE37)에서 작성하는 독립적인 재사용 가능한 프로그램 단위 (Global Modularization)
특징
- 어떤 프로그램에서도 호출 가능
- 인터페이스 명확: IMPORT / EXPORT / CHANGING / TABLES 파라미터
- 에러 처리를 위한 예외 처리 기능(EXCEPTIONS) 제공
- SAP 표준 함수도 대부분 이 구조 사용
- RFC(Remote Function Call)이 가능 (다른 시스템에서도 호출 가능)
- 재사용성과 유지보수성이 뛰어남
* Function Module의 인터페이스
- 함수 모듈이 어떻게 호출되고 어떤 데이터를 주고받는지를 정의하는 구조.
즉, 함수 모듈에 전달해야하는 입력값, 함수가 돌려주는 출력값, 테이블 파라미터, 예외 처리 방식등을 말한다.
Import Parameters 호출 시 함수에 전달하는 값 Export Parameters 함수 실행 후, 함수가 결과로 돌려주는 값 Changing Parameters 함수에 넘겨준 값을 함수 내부에서 변경한 뒤, 다시 받아오고 싶을 때 사용 Tables 인터널 테이블을 넘겨주고 결과도 받아올 수 있는 파라미터 Exceptions 에러에 대한 정보를 제공 CALL FUNCTION 'Z_CALCULATE_TAX' EXPORTING iv_price = 100 IMPORTING ev_tax = lv_tax EXCEPTIONS invalid_price = 1 OTHERS = 2.
위 코드는 다음과 같은 인터페이스를 가진다.
- iv_price : IMPORT, 함수에 넘겨주는 가격
- ev_tax : EXPORT, 세금 결과를 받아오는 값
- invalid_price : EXCEPTIONS, 가격이 유효하지 않은 경우에 대한 예외 처리
Function Group
- SAP에서는 Function Module을 단독으로 만들 수 없고, 반드시 Function Group 안에 포함시켜야 한다.
즉, Function Group은 하나 이상의 Function Module을 포함하는 컨테이너 역할을 한다.
- 비슷한 기능을 수행하는 Function Module들을 한데 모아서 관리하면 유지보수와 개발이 쉽다.
- Function Group은 하나의 프로그램처럼 동작해서, 메모리에 한 번 로드되면 그룹 내의 Function Module들은 추가 로드 없이 사용가능하다.
Function Group 구조
- Function Group은 단순히 여러 Function Module을 묶은 폴더가 아니라, SAP 시스템 내에서는 하나의 ABAP 프로그램처럼 작동하는 구조이다.
이 프로그램은 여러 개의 Include 파일로 구성된다.
예를 들어 ZFG_TEST라는 Function Group을 만들었다고 가정하면, 시스템이 자동 생성하는 프로그램은 아래와 같다.
SAPLZFG_TEST Main Program - Function Group 전체의 본체 LZFG_TESTTOP Include - 전역 변수 선언, CONSTANTS, TYPES 등. LZFG_TESTUXX Include – 각 Function Module의 구현부 (U01, U02, ...). LZFG_TESTF01 Include – 서브루틴 정의 (선택 사항). LZFG_TESTO01 Include – 모듈 Pool 요소 정의 (선택 사항). 개념 정리
- Function Builder : SAP GUI에서 Function Group과 Module을 생성/관리하는 도구.
- Main Program : Function Group의 중심 프로그램.
- Include Program : 실제 Function Module 구현이 들어가는 프로그램 조각.
3. Function Group 및 Functio Module 생성
1. se37로 들어간다.
2. 상단의 탭에 Goto > Function Groups > Create Group을 선택하여, Function Group을 생성한다.
package는 보통 모듈명을 넣지만 지금은 임시 패키지로 생성.
여기까지 function grouo 생성 완료, 아래는 function module을 생성.
3. Function Module에 생성할 모듈 이름을 작성하고 Create 버튼을 누른다.
4. 아래와 같이 창이 뜨면 Function Group에 생성했던 앞서 생성했던 그룹명을 입력하고 저장한다.
5. Import 탭과 Export 탭에서 파라미터를 작성한다.
import : 받아오는 값
export : 내보내는 값
6. Source code 탭에서 함수가 동작할 코드를 작성한다. 여기까지 작성했으면 활성화 버튼을 눌러준다.
7. 활성화를 시켜주면 해당 창이 뜨게 되는데 3개 다 활성화 시켜주면 된다. 그러면 Function Module 생성 작업이 완료된다.
코드에서 함수 모듈 사용
1. se80에서 함수 호출할 프로그램에서 상단에 Pattern 버튼을 누른다.
2. 생성했던 모듈 중 호출할 모듈명을 입력한다.
3. 그럼 아래 사진과 같이 코드에 'ZTEST' 함수를 호출하는 코드가 자동으로 입력된다.
4. 필요한 코드를 추가적으로 작성하면 완료.
DATA: NUM1 TYPE i, NUM2 TYPE i, RESULT TYPE i. NUM1 = 10. NUM2 = 20. CALL FUNCTION 'ZTEST' EXPORTING i_num1 = NUM1. i_num2 = NUM2. IMPORTING i_result = RESULT.
EXPORTING : import 탭에 입력했던 파라미터
IMPORTING : export 탭에 입력했던 파라미터
4. RFC (Remote Function Call)
- SAP 시스템 간 또는 SAP과 외부 시스템 간에 함수를 호출할 수 있도록 해주는 메커니즘.
주요 특징
- 통신 방식 : SAP 시스템 간 또는 SAP ↔ 외부 시스템 간 데이터 교환
- 사용 방법 : RFC로 호출 가능한 Function Module은 특별히 Remote-Enabled로 설정해야 함
- 실행 방식 : 동기(Synchronous) / 비동기(Asynchronous) 방식 모두 가능
- 예외 처리 : 네트워크 오류나 시스템 문제에 대한 예외 처리를 할 수 있음
RFC 사용 방법
- Function Module을 생성하고
- 속성에서 Remote-Enabled Module로 지정
- CALL FUNCTION ... DESTINATION '...' 구문으로 호출
'SAP > 개념정리' 카테고리의 다른 글
7. Lock Object (0) 2025.06.27 5. ABAP 인터널 테이블 (0) 2025.06.22 3. ABAP 조건문, 반복문 (0) 2025.06.19 2. ABAP SQL (0) 2025.06.16 1. ABAP 데이터 타입 (0) 2025.06.10