
RFC(Remote Function Call)는 원격 시스템에 있는 SAP 기능(함수 모듈)을 호출할 수 있는 메커니즘입니다. 복잡한 연동 모듈 없이도 SAP 시스템의 기능을 외부에서 직접 실행할 수 있는 장점이 있습니다.
예를 들어:
RFC 개발을 위해 다음과 같은 환경 설정이 필요합니다.
| T-Code | 설명 |
|---|---|
SE37 | 펑션 모듈 생성 및 관리 |
SM59 | RFC Destination (원격 접속 정보) 설정 |
SE37에서 구현할 기능을 정의합니다.Z로 시작하는 그룹명을 사용합니다.SM59에서 외부 시스템의 접속 정보(IP, 포트, 사용자 ID 등)를 입력합니다.RFC용 펑션 모듈을 구현할 때 핵심은 다음과 같습니다:
Pass by Value 사용 권장🔧 Remote-Enabled Module 옵션 (SE37에서 설정)
SAP에서 RFC를 위한 펑션 모듈을 만들 때, SE37에서 반드시 설정해야 하는 항목이 있습니다.
펑션 모듈을 생성하거나 수정할 때, 상단의 속성 중에 다음과 같은 라디오 버튼(Radio Button) 형태의 옵션이 나옵니다:
Normal Function Module (기본값)
Remote-Enabled Module ✅ (✔️ 이걸 선택해야 RFC 가능!)
Update Module
✅ Pass by Value란?
Pass by Value는 값 자체를 복사해서 전달하는 방식입니다.
즉, 외부 시스템이 어떤 데이터를 SAP로 보낼 때, 그 데이터의 복사본이 SAP로 전달되고, SAP 내에서 그 값을 수정해도 원래 값(외부 시스템의 값)은 바뀌지 않습니다.
📌 RFC에서 Pass by Value를 써야 하는 이유
데이터 일관성 유지: 외부 시스템의 원본 데이터를 보호할 수 있습니다.
보안성과 안정성 향상: 의도치 않게 외부 데이터를 변경하는 위험 방지
RFC에서는 기본적으로 권장되는 방식
VALUE(NUM1) TYPE I위처럼 VALUE(...)를 쓰면 Pass by Value로 설정된 것입니다.
SE37의 파라미터 설정 화면에서 Pass Value 체크박스를 체크해도 같은 의미입니다.
트랜잭션 코드: SE37
상단 메뉴에서 Function Module → Create 선택
Function Module Name: Z로 시작하는 이름 권장 (예: Z_MY_RFC_MODULE)
Function Group: 기존 그룹 또는 새 그룹 입력
✅ 반드시 Remote-Enabled Module 선택 (라디오 버튼)
이 설정이 되어 있어야 RFC 호출 가능
| 항목 | 설명 |
|---|---|
| Parameter Name | NUM1, NUM2, SUM 등 원하는 변수명 입력 |
| Type Spec | Type / Like 선택 (보통은 Type 사용) |
| Associated Type | 예: I (정수), CHAR20 (문자열), 구조 타입 등 |
| Pass Value | ✅ 체크 시 Pass by Value로 값 복사 방식 전달 (RFC에서 매우 중요!) |
Pass Value 체크박스가 체크되어 있어야 원격 호출 시 복사 방식으로 값이 전달됨
체크하지 않으면 Pass by Reference가 되어 의도치 않게 외부 데이터가 변경될 수 있음
SUM1 = NUM1 + NUM2.
----------------------------------------
| Function Module: Z_MY_RFC_MODULE |
----------------------------------------
| Processing Type: |
| ( ) Normal |
| (•) Remote-Enabled Module ✅ |
| ( ) Update Module |
----------------------------------------
[Import Parameters]
| Name | Type | Type Spec | Assoc. Type | Pass Value |
|-------|------|-----------|--------------|-------------|
| NUM1 | I | Type | I | ✅ |
| NUM2 | I | Type | I | ✅ |
[Export Parameters]
| Name | Type | Type Spec | Assoc. Type | Pass Value |
|-------|------|-----------|--------------|-------------|
| SUM1 | I | Type | I | ✅ |
SAP ABAP에서는 RFC를 다음과 같이 호출합니다:
CALL FUNCTION 'Z_ADD_NUMBERS'
DESTINATION 'RFC_DEST_ID'
EXPORTING
NUM1 = lv_num1
NUM2 = lv_num2
IMPORTING
SUM1 = lv_sum1.
"RFC_DEST_ID라는 이름의 외부 시스템에 접속해서
거기에 있는 Z_ADD_NUMBERS라는 Function Module을 호출하고,
두 숫자(NUM1, NUM2)를 전달해 덧셈 결과(SUM1)를 받아와라."
외부 시스템에서 이 펑션을 RFC로 호출하면, SAP는 결과를 계산해 반환합니다.
| 항목 | 설명 |
|---|---|
| Exception | RFC 실행 중 발생 가능한 오류 상황을 미리 정의하여, 호출 측에서 오류를 감지 가능하게 함 |
| Validation | 외부 입력값의 형식, 값, 누락 등을 사전에 검사하여 잘못된 데이터 유입을 차단 |
IF NUM1 IS INITIAL OR NUM2 IS INITIAL.
RAISE INPUT_MISSING.
ENDIF.
IF NUM1 < 0 OR NUM2 < 0.
RAISE INVALID_INPUT.
ENDIF.
위 예시에서 INPUT_MISSING, INVALID_INPUT은 SE37의 Exception 탭에서 미리 정의한 사용자 정의 예외입니다.
RFC Function Module의 Exceptions 탭에 등록하여 사용할 수 있는 대표적인 예외 이름입니다.
직관적인 이름을 정의하면 외부 시스템에서도 오류 상황을 명확하게 파악할 수 있습니다.
| Exception 이름 | 설명 |
|---|---|
INPUT_MISSING | 필수 입력값이 누락된 경우 |
INVALID_INPUT | 형식이 잘못된 값이 입력된 경우 |
AUTHORIZATION_ERROR | 권한이 부족한 경우 |
NO_DATA_FOUND | 조회 결과가 없을 때 |
SYSTEM_FAILURE | 시스템 오류, DB 연결 실패 등 |
CUSTOM_ERROR | 기타 사용자 정의 예외 상황 |
⚠️ 주의사항
라이센스 문제
RFC 호출은 SAP 사용자로 인식되기 때문에 호출 주체에 따라 라이센스 비용이 부과됩니다.
단순 데이터 조회 목적이라면 RFC 대신 DB 직접 연동이 더 경제적일 수 있습니다.
보안 이점
DB 정보를 직접 노출하지 않기 때문에 RFC 방식이 보안적으로 더 안전합니다.
외부에서 SAP 시스템을 직접 접근하는 위험을 줄일 수 있습니다.
RFC는 외부 시스템이 SAP의 DB에 직접 접근하지 않고,
SAP가 제공하는 기능(RFC 모듈)을 호출하는 방식이라
SAP 내부 구조나 DB 정보가 외부에 노출되지 않아 보안상 안전합니다.
RFC Destination(원격 호출 접속 정보)를 관리하는 트랜잭션 코드
