RFC 통신과 함수 모듈

함수 모듈(FM) 기초

함수 모듈이란?

함수 모듈(Function Module)은 ABAP에서 재사용 가능한 코드 블록입니다. 입력/출력 파라미터를 가지며, 다른 프로그램에서 CALL FUNCTION으로 호출할 수 있습니다. 함수 그룹(Function Group) 안에 소속되어 관리됩니다.

SE37 트랜잭션

함수 모듈의 생성, 수정, 테스트는 SE37 (Function Builder) 트랜잭션에서 수행합니다.

FM 인터페이스

파라미터방향설명필수 여부
IMPORTING입력 → FM호출자가 FM에 전달하는 값선택/필수 지정 가능
EXPORTINGFM → 출력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 2SAP R/2 시스템
ABAP 연결Type 3SAP R/3 또는 S/4HANA 시스템
HTTP 연결Type GHTTP/HTTPS 기반 외부 시스템
TCP/IP 연결Type T외부 프로그램 (RFC SDK, JCo 등)

RFC 사용 가능 FM

일반 FM을 RFC로 호출하려면 SE37에서 해당 FM의 Processing TypeRemote-Enabled Module로 설정해야 합니다.

RFC 호출 방식

sRFC (동기 호출)

Synchronous RFC: 호출자가 응답을 받을 때까지 대기합니다. 가장 일반적인 방식입니다.

1" sRFC: DESTINATION 키워드로 원격 호출
2DATA: ls_mara  TYPE mara,
3      lv_maktx TYPE maktx,
4      lv_msg   TYPE c LENGTH 200.  " RFC 에러 메시지 수신용
5
6CALL FUNCTION 'Z_GET_MATERIAL_INFO'
7  DESTINATION 'PRD_CLNT100'          " SM59에 등록된 RFC Destination
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  " RFC 전용 예외
16    system_failure        = 3  MESSAGE lv_msg  " RFC 전용 예외
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" 비동기 호출: STARTING NEW TASK
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" ── 콜백 FORM ──
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" tRFC: IN BACKGROUND TASK 키워드 사용
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" 실제 전송은 COMMIT WORK 시점
10COMMIT WORK.
11
12WRITE: / 'tRFC 전송 완료. SM58에서 상태 확인 가능.'.

RFC 호출 방식 비교

SsRFC (동기)
호출 → 대기 → 응답

⏱ 응답 대기: 대기함
🔄 결과 반환: 즉시
✅ 실행 보장: 보장 안 됨
📌 COMMIT: 불필요

용도: 실시간 조회, 즉시 결과 필요

AaRFC (비동기)
호출 → 다른 작업 → 콜백

⏱ 응답 대기: 안 함
🔄 결과 반환: 콜백(RECEIVE)
✅ 실행 보장: 보장 안 됨
📌 COMMIT: 불필요

용도: 병렬 처리, 대량 호출

TtRFC (트랜잭션)
큐잉 → COMMIT → 전송 (1회)

⏱ 응답 대기: 안 함
🔄 결과 반환: 없음
✅ 실행 보장: 정확히 1회
📌 COMMIT: 필요

용도: 데이터 변경/전송, 신뢰성 필요

시스템 A
CALL FUNCTIONDESTINATION
시스템 B

에러 핸들링

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~nEXCEPTIONS에 매핑된 번호 순서

실무 예제: 타 시스템 자재 마스터 조회

원격 SAP 시스템에서 자재 마스터를 조회하는 전체 프로그램입니다.

1REPORT Z_RFC_MATERIAL_QUERY.
2
3" ==============================
4" 1. 타입 정의
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" 2. TABLES 선언 (SELECT-OPTIONS 참조용)
15" ==============================
16TABLES: mara.
17
18" ==============================
19" 3. Selection Screen
20" ==============================
21PARAMETERS: p_dest TYPE rfcdest DEFAULT 'PRD_CLNT100'. " RFC Destination
22SELECT-OPTIONS: so_matnr FOR mara-matnr.               " 자재번호 범위
23
24" ==============================
25" 4. 데이터 선언
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" 5. 실행
34" ==============================
35START-OF-SELECTION.
36
37  " ── RFC 연결 테스트 ──
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  " ── 커스텀 RFC FM 호출 ──
54  CALL FUNCTION 'Z_GET_MATERIAL_LIST'
55    DESTINATION p_dest
56    EXPORTING
57      it_matnr_range = so_matnr[]  " Selection Screen 범위 전달
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_FAILURESYSTEM_FAILURE 예외를 반드시 처리하여 네트워크 오류에 대비합니다.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.