RFC 통신과 함수 모듈
함수 모듈(FM) 기초
함수 모듈이란?
함수 모듈(Function Module)은 ABAP에서 재사용 가능한 코드 블록입니다. 입력/출력 파라미터를 가지며, 다른 프로그램에서 CALL FUNCTION으로 호출할 수 있습니다. 함수 그룹(Function Group) 안에 소속되어 관리됩니다.
SE37 트랜잭션
함수 모듈의 생성, 수정, 테스트는 SE37 (Function Builder) 트랜잭션에서 수행합니다.
FM 인터페이스
| 파라미터 | 방향 | 설명 | 필수 여부 |
|---|
IMPORTING | 입력 → FM | 호출자가 FM에 전달하는 값 | 선택/필수 지정 가능 |
EXPORTING | FM → 출력 | FM이 호출자에게 반환하는 값 | 항상 선택 |
CHANGING | 입출력 ↔ | 입력 받아 수정 후 반환 | 선택/필수 지정 가능 |
TABLES | 입출력 ↔ | 내부 테이블 전달 (레거시) | 항상 선택 |
EXCEPTIONS | - | 에러 상황 정의 | - |
FM 생성 실습: Z_GET_MATERIAL_INFO
자재번호를 받아 자재 정보를 반환하는 함수 모듈을 만들어봅니다.
1FUNCTION Z_GET_MATERIAL_INFO.
2*"----------------------------------------------------------------------
3*" IMPORTING
4*" VALUE(IV_MATNR) TYPE MATNR " 자재번호
5*" EXPORTING
6*" VALUE(ES_MATERIAL) TYPE MARA " 자재 마스터 데이터
7*" VALUE(EV_MAKTX) TYPE MAKTX " 자재내역
8*" EXCEPTIONS
9*" MATERIAL_NOT_FOUND " 자재 없음
10*"----------------------------------------------------------------------
11
12
13 SELECT SINGLE *
14 FROM mara
15 INTO es_material
16 WHERE matnr = iv_matnr.
17
18 IF sy-subrc <> 0.
19 RAISE material_not_found.
20 ENDIF.
21
22
23 SELECT SINGLE maktx
24 FROM makt
25 INTO ev_maktx
26 WHERE matnr = iv_matnr
27 AND spras = sy-langu.
28
29ENDFUNCTION.
FM 호출
1DATA: ls_mara TYPE mara,
2 lv_maktx TYPE maktx.
3
4CALL FUNCTION 'Z_GET_MATERIAL_INFO'
5 EXPORTING
6 iv_matnr = '000000001000000001'
7 IMPORTING
8 es_material = ls_mara
9 ev_maktx = lv_maktx
10 EXCEPTIONS
11 material_not_found = 1
12 OTHERS = 2.
13
14CASE sy-subrc.
15 WHEN 0.
16 WRITE: / '자재유형:', ls_mara-mtart,
17 / '자재내역:', lv_maktx.
18 WHEN 1.
19 WRITE: / '자재를 찾을 수 없습니다.'.
20 WHEN 2.
21 WRITE: / '알 수 없는 오류가 발생했습니다.'.
22ENDCASE.
RFC란?
RFC 개념
RFC(Remote Function Call)는 한 SAP 시스템에서 다른 SAP 시스템(또는 외부 시스템)의 함수 모듈을 원격으로 호출하는 통신 방식입니다.
RFC Destination (SM59)
RFC 통신을 위해서는 먼저 SM59 트랜잭션에서 대상 시스템과의 연결(Destination)을 설정해야 합니다.
| 연결 유형 | 코드 | 설명 |
|---|
| R/2 연결 | Type 2 | SAP R/2 시스템 |
| ABAP 연결 | Type 3 | SAP R/3 또는 S/4HANA 시스템 |
| HTTP 연결 | Type G | HTTP/HTTPS 기반 외부 시스템 |
| TCP/IP 연결 | Type T | 외부 프로그램 (RFC SDK, JCo 등) |
RFC 사용 가능 FM
일반 FM을 RFC로 호출하려면 SE37에서 해당 FM의 Processing Type을 Remote-Enabled Module로 설정해야 합니다.
RFC 호출 방식
sRFC (동기 호출)
Synchronous RFC: 호출자가 응답을 받을 때까지 대기합니다. 가장 일반적인 방식입니다.
1
2DATA: ls_mara TYPE mara,
3 lv_maktx TYPE maktx,
4 lv_msg TYPE c LENGTH 200.
5
6CALL FUNCTION 'Z_GET_MATERIAL_INFO'
7 DESTINATION 'PRD_CLNT100'
8 EXPORTING
9 iv_matnr = '000000001000000001'
10 IMPORTING
11 es_material = ls_mara
12 ev_maktx = lv_maktx
13 EXCEPTIONS
14 material_not_found = 1
15 communication_failure = 2 MESSAGE lv_msg
16 system_failure = 3 MESSAGE lv_msg
17 OTHERS = 4.
18
19CASE sy-subrc.
20 WHEN 0.
21 WRITE: / '원격 조회 성공:', lv_maktx.
22 WHEN 2.
23 WRITE: / '통신 실패:', lv_msg.
24 WHEN 3.
25 WRITE: / '시스템 오류:', lv_msg.
26ENDCASE.
aRFC (비동기 호출)
Asynchronous RFC: 호출 후 응답을 기다리지 않고 다음 코드를 실행합니다. 결과는 콜백 FORM으로 받습니다.
1DATA: lv_task TYPE c LENGTH 10 VALUE 'TASK001',
2 lv_msg TYPE c LENGTH 200.
3
4
5CALL FUNCTION 'Z_GET_MATERIAL_INFO'
6 STARTING NEW TASK lv_task
7 DESTINATION 'PRD_CLNT100'
8 PERFORMING on_rfc_callback ON END OF TASK
9 EXPORTING
10 iv_matnr = '000000001000000001'
11 EXCEPTIONS
12 communication_failure = 1 MESSAGE lv_msg
13 system_failure = 2 MESSAGE lv_msg.
14
15IF sy-subrc <> 0.
16 WRITE: / 'aRFC 호출 실패:', lv_msg.
17ENDIF.
18
19
20WRITE: / 'aRFC 호출 완료, 결과 대기 중...'.
21
22
23WAIT UNTIL gv_callback_done = abap_true UP TO 30 SECONDS.
24
25
26FORM on_rfc_callback USING pv_task TYPE clike.
27 DATA: ls_mara TYPE mara,
28 lv_maktx TYPE maktx.
29
30 RECEIVE RESULTS FROM FUNCTION 'Z_GET_MATERIAL_INFO'
31 IMPORTING
32 es_material = ls_mara
33 ev_maktx = lv_maktx
34 EXCEPTIONS
35 material_not_found = 1
36 OTHERS = 2.
37
38 IF sy-subrc = 0.
39 WRITE: / 'aRFC 결과:', lv_maktx.
40 ENDIF.
41
42 gv_callback_done = abap_true.
43ENDFORM.
tRFC (트랜잭션 호출)
Transactional RFC: 호출을 LUW(Logical Unit of Work)로 묶어 정확히 한 번만 실행을 보장합니다. COMMIT WORK로 실제 전송합니다.
1
2CALL FUNCTION 'Z_UPDATE_MATERIAL_STATUS'
3 IN BACKGROUND TASK
4 DESTINATION 'PRD_CLNT100'
5 EXPORTING
6 iv_matnr = '000000001000000001'
7 iv_status = 'A'.
8
9
10COMMIT WORK.
11
12WRITE: / 'tRFC 전송 완료. SM58에서 상태 확인 가능.'.
RFC 호출 방식 비교
SsRFC (동기)
호출 → 대기 → 응답
⏱ 응답 대기: 대기함
🔄 결과 반환: 즉시
✅ 실행 보장: 보장 안 됨
📌 COMMIT: 불필요
AaRFC (비동기)
호출 → 다른 작업 → 콜백
⏱ 응답 대기: 안 함
🔄 결과 반환: 콜백(RECEIVE)
✅ 실행 보장: 보장 안 됨
📌 COMMIT: 불필요
TtRFC (트랜잭션)
큐잉 → COMMIT → 전송 (1회)
⏱ 응답 대기: 안 함
🔄 결과 반환: 없음
✅ 실행 보장: 정확히 1회
📌 COMMIT: 필요
CALL FUNCTION⇄DESTINATION
에러 핸들링
EXCEPTIONS 처리
FM 호출 시 반드시 EXCEPTIONS를 처리해야 안정적인 프로그램을 만들 수 있습니다.
1DATA: lv_msg TYPE c LENGTH 200.
2
3CALL FUNCTION 'Z_GET_MATERIAL_INFO'
4 DESTINATION 'PRD_CLNT100'
5 EXPORTING
6 iv_matnr = '000000001000000001'
7 EXCEPTIONS
8 material_not_found = 1
9 communication_failure = 2 MESSAGE lv_msg
10 system_failure = 3 MESSAGE lv_msg
11 OTHERS = 4.
12
13CASE sy-subrc.
14 WHEN 0.
15 WRITE: / '성공'.
16 WHEN 1.
17 WRITE: / '자재 없음 (비즈니스 예외)'.
18 WHEN 2.
19 WRITE: / '통신 실패 - 네트워크 또는 Destination 문제'.
20 WRITE: / '상세:', lv_msg.
21 WHEN 3.
22 WRITE: / '시스템 오류 - 원격 시스템 내부 에러'.
23 WRITE: / '상세:', lv_msg.
24 WHEN 4.
25 WRITE: / '기타 예외 발생'.
26ENDCASE.
RFC 전용 예외
| 예외 | 설명 | 주요 원인 |
|---|
COMMUNICATION_FAILURE | 통신 실패 | 네트워크 단절, Destination 설정 오류, 원격 시스템 다운 |
SYSTEM_FAILURE | 시스템 오류 | 원격 FM의 런타임 에러, 권한 부족, ABAP 덤프 |
팁: MESSAGE lv_msg를 예외 뒤에 추가하면 상세 에러 메시지를 변수에 받을 수 있습니다.
SY-SUBRC 값
| 값 | 의미 |
|---|
0 | 정상 실행 |
1~n | EXCEPTIONS에 매핑된 번호 순서 |
실무 예제: 타 시스템 자재 마스터 조회
원격 SAP 시스템에서 자재 마스터를 조회하는 전체 프로그램입니다.
1REPORT Z_RFC_MATERIAL_QUERY.
2
3
4
5
6TYPES: BEGIN OF ty_result,
7 matnr TYPE matnr,
8 mtart TYPE mtart,
9 maktx TYPE maktx,
10 meins TYPE meins,
11 END OF ty_result.
12
13
14
15
16TABLES: mara.
17
18
19
20
21PARAMETERS: p_dest TYPE rfcdest DEFAULT 'PRD_CLNT100'.
22SELECT-OPTIONS: so_matnr FOR mara-matnr.
23
24
25
26
27DATA: lt_results TYPE TABLE OF ty_result,
28 ls_result TYPE ty_result.
29
30DATA: lv_msg TYPE c LENGTH 200.
31
32
33
34
35START-OF-SELECTION.
36
37
38 CALL FUNCTION 'RFC_PING'
39 DESTINATION p_dest
40 EXCEPTIONS
41 communication_failure = 1 MESSAGE lv_msg
42 system_failure = 2 MESSAGE lv_msg.
43
44 IF sy-subrc <> 0.
45 WRITE: / 'RFC 연결 실패:', lv_msg.
46 WRITE: / 'Destination:', p_dest.
47 WRITE: / 'SM59에서 연결 설정을 확인하세요.'.
48 RETURN.
49 ENDIF.
50
51 WRITE: / 'RFC 연결 성공. 데이터 조회 중...'.
52
53
54 CALL FUNCTION 'Z_GET_MATERIAL_LIST'
55 DESTINATION p_dest
56 EXPORTING
57 it_matnr_range = so_matnr[]
58 IMPORTING
59 et_materials = lt_results
60 EXCEPTIONS
61 no_data_found = 1
62 communication_failure = 2 MESSAGE lv_msg
63 system_failure = 3 MESSAGE lv_msg
64 OTHERS = 4.
65
66 CASE sy-subrc.
67 WHEN 0.
68
69 WRITE: / '조회 건수:', lines( lt_results ).
70 ULINE.
71 WRITE: / '자재번호', 22 '유형', 28 '단위', 34 '자재내역'.
72 ULINE.
73
74 LOOP AT lt_results INTO ls_result.
75 WRITE: / ls_result-matnr,
76 22 ls_result-mtart,
77 28 ls_result-meins,
78 34 ls_result-maktx.
79 ENDLOOP.
80
81 ULINE.
82 WRITE: / '조회 완료.'.
83
84 WHEN 1.
85 WRITE: / '데이터가 없습니다.'.
86 WHEN 2.
87 WRITE: / '통신 실패:', lv_msg.
88 WHEN 3.
89 WRITE: / '시스템 오류:', lv_msg.
90 WHEN OTHERS.
91 WRITE: / '알 수 없는 오류.'.
92 ENDCASE.
이 프로그램에서는 RFC_PING으로 연결 상태를 먼저 확인하고, 커스텀 RFC FM을 호출하여 원격 시스템의 데이터를 조회합니다. COMMUNICATION_FAILURE와 SYSTEM_FAILURE 예외를 반드시 처리하여 네트워크 오류에 대비합니다.
Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.