SAP에서 인터페이스(I/F) 개발을 하다 보면 펑션 모듈(Function Module)을 만들 때 Processing Type 을 골라야 하는 순간이 옵니다. SE37 에서 펑션을 새로 만들 때 보이는 라디오 버튼 — Normal / Remote-Enabled / Update Module — 의 차이를 정확히 모르면 외부 시스템에서 호출이 안 되거나 SAP 내부에서 의도와 다르게 동작합니다.
가장 헷갈리는 부분은 "SAP가 보내는 거냐, 받는 거냐" 에 따라 Processing Type 선택이 반대가 된다는 점입니다.
송신은 외부 시스템이 SAP 펑션을 부르는 것이고,
수신은 SAP 안에서 펑션을 직접 부르는 것이라는 관점 전환이 필요합니다.
이 글은 RFC 펑션의 Processing Type 종류·선택 기준·개발 후 인계 절차 를 정리한 메모입니다.
핵심 원리
Function Module은 누가 호출하느냐 에 따라 Processing Type을 다르게 잡아야 합니다. 잘못 잡으면 외부에서 호출 시도 자체가 거부되거나(Remote-Enabled가 아닌 경우), 반대로 SAP 내부 호출이 RFC 오버헤드를 거치게 됩니다.
| Processing Type | 호출 주체 | 언제 쓰는가 |
|---|---|---|
| Normal Function Module | SAP 내부 ABAP | 동일 시스템 내 프로그램에서 호출. 외부 접근 불가 |
| Remote-Enabled Module (RFC) | 외부 시스템 (MES, Web, 타 SAP 등) | 외부에서 SAP 펑션을 호출해야 할 때. RFC 인터페이스 노출 |
| Update Module | SAP 내부 (LUW 단위) | DB 변경을 트랜잭션 LUW 끝에서 한꺼번에 처리. COMMIT WORK 시점 동기 |
핵심은 "외부에서 부른다면 무조건 Remote-Enabled" 라는 점입니다. 내가 SAP에서 외부로 데이터를 보낸다고 해도, 결국 그 송신을 수행하는 펑션을 외부 시스템이 호출한다면 Remote-Enabled여야 합니다.
1단계 — SE37 Attributes 화면에서 Processing Type 선택
SE37 에서 펑션을 새로 만들거나 변경 모드로 열고 Attributes 탭으로 이동하면 Processing Type 라디오 버튼이 보입니다.

| 옵션 | 의미 |
|---|---|
| Normal Function Module | SAP 내부 사용 전용. 가장 일반적인 유형 |
| Remote-Enabled Module | RFC 노출. 외부에서 호출 가능. 인터페이스용 펑션은 모두 이 옵션 |
| Update Module → 즉시 시작 | LUW 종료 시 즉시 업데이트 (가장 일반적인 V1 업데이트) |
| Update Module → Immediate Start, No Restart | 실패 시 재시작 안 함. 로그성 업데이트에 사용 |
| Update Module → Start Delayed (V2) | V1 업데이트가 끝난 후 비동기로 실행. 통계·요약성 작업용 |
| Update Module → 일괄 실행 (Collective Run) | 여러 LUW를 모았다가 한 번에 처리 (V3) |
| BasXML supported (체크박스) | 웹 서비스로 노출할 때 체크. 일반 RFC에는 불필요 |
대부분의 인터페이스 개발은 Remote-Enabled Module 하나만 알면 됩니다. Update Module은 SAP 표준 트랜잭션 안에서 DB 업데이트를 분리할 때 쓰는 특수 옵션이라, 일반 CBO RFC에서는 사용 빈도가 낮습니다.
2단계 — 인터페이스 방향에 따른 분기
이 단계가 가장 헷갈리는 부분입니다. "SAP에서 보내냐, 받느냐" 가 아니라 "누가 펑션 호출 코드를 실행하느냐" 로 판단해야 합니다.
| 방향 | 펑션을 호출하는 쪽 | 선택할 타입 |
|---|---|---|
| SAP → MES (송신) | MES (외부 시스템) | Remote-Enabled — MES가 SAP 펑션을 호출해서 데이터를 가져감 |
| MES → SAP (수신) | SAP 내부 (수신용 처리 펑션) | Normal — SAP가 받은 데이터를 자체 펑션으로 처리 |
| 외부 Web → SAP | Web 시스템 (외부) | Remote-Enabled — Web에서 SAP 데이터를 조회·등록 |
| SAP → 타 SAP 시스템 | 호출 측 SAP | Remote-Enabled — CALL FUNCTION ... DESTINATION 사용 |
판단 공식은 단순합니다 — 펑션 본체가 있는 시스템 기준으로, 그 펑션을 부르는 코드가 다른 시스템에 있으면 Remote-Enabled.
3단계 — Remote-Enabled 호출 흐름 이해
외부에서 SAP RFC를 호출하는 일반적인 흐름은 다음과 같습니다.
| 단계 | 위치 | 동작 |
|---|---|---|
| 1 | 외부 시스템 (MES 등) | SAP RFC 클라이언트 라이브러리로 펑션 호출 요청 |
| 2 | SAP Gateway | RFC 접속 인증 (ID/PW) + 호출 라우팅 |
| 3 | SAP RFC 펑션 | 파라미터 받기 → 비즈니스 로직 수행 → 결과 리턴 |
| 4 | 외부 시스템 | 리턴값 수신 → 후속 처리 |
SAP 측에서 RFC Destination 설정은 SM59 에서 확인·관리합니다. 반대로 외부 시스템이 SAP에 접속할 때 쓰는 RFC 계정(ID/PW)은 별도 관리되며, 보통 BC(Basis) 담당자에게 발급을 요청합니다.
4단계 — 개발 후 인계 정보 (타 시스템 담당자에게)
RFC를 만든 다음 외부 시스템 담당자(MES·Web 등)가 실제로 호출할 수 있도록 정보를 넘겨야 합니다.
| 전달할 정보 | 설명 |
|---|---|
| 펑션 모듈 이름 | 호출할 RFC 펑션의 정확한 이름 (예: Z_XX_INTERFACE) |
| SAP 접속 정보 | 시스템 호스트, 시스템 번호(System Number), 클라이언트(Client) 번호 |
| RFC 접속 계정 (ID/PW) | 신규 계정이면 BC 담당자에게 발급 요청. 기존 계정 재사용이면 그대로 전달 |
| 파라미터 명세 | IMPORTING / EXPORTING / TABLES / EXCEPTIONS 각 항목과 데이터 타입 |
| 호출 예제·테스트 데이터 | 최초 연동 테스트용 샘플 입력값과 기대 출력값 |
ID/PW 발급 절차는 사이트마다 다르므로 신규 계정이 필요한 상황이면 BC 담당자에게 미리 협의해두는 게 안전합니다. 운영 이송 직전에 계정 이슈로 인터페이스가 막히는 사고가 의외로 자주 발생합니다.
흔히 빠뜨리는 함정
Normal로 만들고 외부에서 호출 시도
외부에서 호출했을 때 펑션이 RFC로 노출되지 않으면 SAP Gateway 단계에서 거부됩니다. 에러 메시지로는 "function not remote-enabled" 형태가 나오는데, 이 경우 SE37에서 Attributes 탭의 Remote-Enabled 옵션이 켜져있는지 먼저 확인.
Remote-Enabled로 변경 후 활성화(Activation) 누락
라디오 버튼만 바꾸고 저장만 한 채로 두면 메타데이터는 바뀌어도 호출 시점 정의가 갱신되지 않습니다. 반드시 활성화(Activation) 까지 완료해야 외부에서 인식됩니다.
EXPORTING 파라미터에 비-Character 타입 사용
RFC 펑션은 일부 ABAP 전용 타입(예: 깊은 구조, 참조 변수)을 외부 시스템에 그대로 넘기지 못합니다. 외부와 주고받는 파라미터는 CHAR / NUMC / DEC 등 표준 DDIC 타입 + DDIC 구조체로만 정의해야 합니다.
트랜스포트 누락
RFC 펑션을 새로 만들면 펑션 모듈 자체 외에도 펑션 그룹 / DDIC 구조체 / 인클루드 가 함께 생성됩니다. 운영 이송 시 펑션 모듈 하나만 담아서 보내면 호출 시점에 구조체를 못 찾아 덤프 발생. 펑션 그룹 단위로 모두 포함했는지 점검 필요.
요약
| 단계 | 위치 | 할 일 |
|---|---|---|
| 1 | SE37 Attributes |
Processing Type 선택 (대부분 Remote-Enabled) |
| 2 | 방향 판단 | 호출하는 쪽이 외부면 Remote-Enabled, SAP 내부면 Normal |
| 3 | SM59 |
RFC Destination 확인 + 외부 시스템 인증 흐름 이해 |
| 4 | 개발 후 인계 | 펑션명·접속 정보·ID/PW·파라미터 명세 전달 (신규 계정은 BC에 요청) |
| 5 | 운영 이송 | 펑션 그룹·DDIC 구조체·인클루드까지 동반 이송 확인 |
Function Module Processing Type 선택은 한 번 잘못 잡으면 나중에 호출 자체가 막혀서 인터페이스 전체가 재작업되는 경우가 종종 있습니다. "내가 보내는지 받는지" 가 아니라 "어느 쪽에서 펑션을 부르는 코드가 돌아가는지" 로 판단하는 습관을 들이면 헷갈리지 않습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. SAP 버전·시스템 구성·인터페이스 패턴(EAI / PI / 직접 RFC 등)에 따라 세부 절차가 다를 수 있으므로 운영 환경 적용 전 개발 시스템에서 동작을 확인하시기 바랍니다.