SAP 가 다른 시스템(레거시 ERP · MES · 외부 DB · 클라우드 서비스) 과 데이터를 주고받아야 할 때 가장 자주 검토되는 두 가지 방식이 RFC(Remote Function Call) 와 DB LINK(외부 DB 직접 연결) 입니다.
이 둘은 비슷한 목적을 가지지만 연결 계층이 다릅니다. RFC 는 Application 끼리 함수 호출 방식으로 통신하고, DB LINK 는 SAP 가 외부 DB 에 직접 SQL 을 던지는 방식입니다. 성능·보안·정합성·구현 난이도가 모두 달라서, 두 방식을 잘못 선택하면 운영 단계에서 데이터 정합성 사고나 보안 이슈가 발생할 수 있습니다.
이 글은 RFC 와 DB LINK 의 차이, 각 방식의 사용 절차(SM59 · DBCO), 선택 기준, ABAP 호출 예시까지 정리한 메모입니다.
핵심 — RFC 와 DB LINK 는 연결 계층이 다릅니다
가장 큰 차이는 "어디서 연결되느냐" 입니다. RFC 는 애플리케이션 계층 에서, DB LINK 는 DB 계층 에서 연결합니다. 이 한 가지 차이가 보안·성능·정합성에 큰 영향을 줍니다.
| 항목 | RFC | DB LINK |
|---|---|---|
| 연결 방식 | Application To Application — 함수 호출 | DB To DB — 직접 SQL |
| 관리 트랜잭션 | SM59 (RFC Destination) |
DBCO (DB Connection) |
| 보안성 | 상대 시스템의 로직·권한 통과 — 안전 | DB 직접 접근 — 권한 우회 위험 |
| 정합성 | 상대 시스템 비즈니스 로직 적용됨 | DB 컬럼만 변경 — 비즈니스 로직 우회 |
| 속도 | 중간 — 함수 호출 오버헤드 | 빠름 — DB 직접 SQL |
| 대용량 처리 | 함수 한 번에 처리할 수 있는 양 제한 | 대용량 일괄 처리에 유리 |
| 대표 사용 케이스 | 레거시 ERP · MES 송수신 인터페이스 | 외부 DB 보고서 조회 · 일괄 데이터 추출 |
| 실무 권장 | 대부분 1순위 — 안전 · 표준 · 추적 가능 | 조회 중심 · 외부 시스템 DB 직접 INSERT 는 비권장 |
💡 SAP 가이드 측면에서는 외부 시스템 DB 에 SAP 가 직접 INSERT/UPDATE 하는 방식은 권장하지 않습니다. 외부 시스템의 비즈니스 로직·트리거를 우회하므로 데이터 정합성을 깨뜨릴 수 있고, 권한 체계도 뚫리기 때문입니다. DB LINK 는 가능한 한 조회(SELECT) 용도 로만 사용하고, 데이터 변경은 RFC 또는 표준 인터페이스(IDoc · BAPI · OData) 로 보내는 게 안전합니다.
1단계 — RFC (Application To Application)
RFC 는 SAP 가 다른 시스템의 함수를 원격으로 호출 하는 방식입니다. 호출하는 SAP 측에서는 마치 자기 시스템 함수처럼 코드를 쓰지만, 실제로는 네트워크를 거쳐 상대 시스템 함수가 실행됩니다.
SM59 에서 RFC Destination 생성·조회
SM59 → RFC Destinations
→ 좌측 트리에서 연결 유형 선택
3 (ABAP Connections) : 다른 SAP 시스템
T (TCP/IP Connections) : 외부 프로그램·MES
H (HTTP Connections to ABAP) : HTTP 기반 SAP 호출
G (HTTP Connections to External)
L (Logical Destinations)
→ Create 또는 기존 Destination 선택
→ Connection Test · Authorization Test 로 연결 확인

ABAP 에서 RFC 호출
" 다른 시스템의 함수를 호출 — DESTINATION 키워드 추가
CALL FUNCTION 'BAPI_MATERIAL_GET_DETAIL'
DESTINATION 'EXT_MES_SYS' " SM59 에 등록된 Destination 이름
EXPORTING
material = lv_matnr
IMPORTING
material_general_data = ls_data
EXCEPTIONS
system_failure = 1 MESSAGE lv_msg
communication_failure = 2 MESSAGE lv_msg
OTHERS = 3.
호출 측 코드는 일반 CALL FUNCTION 과 거의 같고 DESTINATION 한 줄만 추가됩니다.
RFC 종류
| 유형 | 동작 | 사용 케이스 |
|---|---|---|
| Synchronous RFC (sRFC) | 호출 후 응답 받을 때까지 대기 | 조회 · 즉시 결과 필요 |
| Asynchronous RFC (aRFC) | 호출 후 응답 안 기다리고 진행 | 백그라운드 처리 · 병렬 작업 |
| Transactional RFC (tRFC) | 고유 TID 로 1회만 실행 보장 | 데이터 변경 인터페이스 · 중복 방지 |
| Queued RFC (qRFC) | 큐에 쌓아두고 순차 처리 | 순서 보장 · 대량 인터페이스 |
레거시 시스템과의 인터페이스에서는 tRFC + qRFC 조합으로 "한 번만 · 순서대로" 보장하는 패턴이 표준입니다.
2단계 — DB LINK (DBCO 로 외부 DB 직접 연결)
DB LINK 는 SAP 가 외부 DB(Oracle · MSSQL · MySQL 등) 에 직접 SQL 을 던지는 방식입니다. DBCO(Database Connection) 트랜잭션으로 연결 정보를 등록합니다.
DBCO 에서 외부 DB Connection 등록
DBCO → Connection Maintenance
→ New Entries
Connection Name : EXT_ORACLE_DB (자체 ID, ABAP 에서 사용)
DBMS : ORA / MSS / MYSQL / DB6 … (외부 DB 종류)
User Name : (외부 DB 의 사용자)
Password : (저장 방식 주의)
Conn. Info : (TNS 또는 host:port:SID 형식)
Permanent : ☑ (영구 연결 유지 여부)
→ 저장

ABAP 에서 DB LINK 사용 — 두 가지 방법
방법 A — Native SQL (EXEC SQL)
DATA: lt_ext_data TYPE TABLE OF ty_ext_data,
ls_ext_data TYPE ty_ext_data.
EXEC SQL PERFORMING append_row.
CONNECT TO 'EXT_ORACLE_DB' " DBCO 의 Connection Name
SELECT empno, ename, sal
INTO :ls_ext_data
FROM emp
WHERE deptno = 10
ENDEXEC.
FORM append_row.
APPEND ls_ext_data TO lt_ext_data.
ENDFORM.
EXEC SQL.
DISCONNECT 'EXT_ORACLE_DB'
ENDEXEC.
오래된 패턴이지만 단순한 조회에는 여전히 유효합니다.
방법 B — ADBC (ABAP Database Connectivity, 권장)
DATA: lo_sql_stmt TYPE REF TO cl_sql_statement,
lo_result_set TYPE REF TO cl_sql_result_set,
lr_ref TYPE REF TO data.
" 1) Statement 생성 — DBCO Connection Name 지정
lo_sql_stmt = NEW cl_sql_statement( con_ref =
cl_sql_connection=>get_connection( 'EXT_ORACLE_DB' )
).
" 2) SQL 실행
lo_result_set = lo_sql_stmt->execute_query(
|SELECT empno, ename, sal FROM emp WHERE deptno = 10|
).
" 3) 결과를 인터널 테이블에 받기
GET REFERENCE OF lt_ext_data INTO lr_ref.
lo_result_set->set_param_table( lr_ref ).
lo_result_set->next_package( ).
lo_result_set->close( ).
ADBC 는 객체지향 신택스로 예외 처리도 깔끔하고, 성능 트레이스도 잘 잡힙니다. 신규 코드는 ADBC 권장입니다.
3단계 — 선택 기준 (어떤 상황에 무엇을 쓰나)
| 상황 | 권장 방식 |
|---|---|
| SAP ↔ SAP 시스템 간 인터페이스 (예: ECC ↔ S/4HANA) | RFC (sRFC 또는 tRFC) |
| SAP ↔ 외부 ERP / MES (생산관리) — 데이터 송수신 | RFC (T-type · 외부 프로그램이 RFC SDK 사용) |
| SAP 가 외부 데이터를 보고서로 조회만 (변경 없음) | DB LINK (조회 한정 — ADBC SELECT) |
| 대량 추출 후 SAP 가 가공해 보고서로 | DB LINK (속도 중요 · 변경 없음) |
| 외부 시스템 DB 에 데이터 직접 INSERT/UPDATE | RFC 또는 표준 인터페이스 (DB LINK 비권장) |
| 실시간 조회 응답 필요 (사용자 화면 클릭 → 즉시) | RFC (sRFC) 또는 빠른 DB LINK 조회 |
| 순서 보장 · 1회만 실행 (재고 이동 · 회계 전표) | RFC (tRFC + qRFC) |
| 웹 서비스 · REST API 통신 | RFC (G/H-type) 또는 OData (S/4HANA) |
원칙 한 줄: 데이터 변경이 들어가면 무조건 RFC, 단순 조회면 성능 우선으로 DB LINK 도 고려.
4단계 — 같이 알아둘 관련 트랜잭션
RFC 와 DB LINK 운영·디버깅 시 자주 함께 쓰는 트랜잭션입니다.
| T-Code | 용도 |
|---|---|
SM59 |
RFC Destination 관리 · 연결 테스트 |
DBCO |
외부 DB Connection 관리 |
DB02 |
DB 모니터링 — 외부 Connection 사용량 일부 조회 |
SM58 |
tRFC 큐 모니터링 — 실패한 RFC 호출 재처리 |
SMQ1 · SMQ2 |
qRFC 큐 모니터링 — 송신(SMQ1)·수신(SMQ2) |
ST05 |
Performance Trace — SQL · RFC · Enqueue 트레이스 |
ST22 |
ABAP 덤프 분석 — RFC 호출 실패 시 원인 확인 |
SLG1 |
Application Log — 자체 인터페이스 로그 조회 |
SE37 |
Function Module 테스트 — RFC FM 단독 실행 |
흔히 빠뜨리는 함정
Function Module 이 Remote-Enabled 가 아님
RFC 로 호출하려면 SE37 에서 함수 속성을 Remote-Enabled Module 로 지정해야 합니다. 일반 Function Module 은 같은 시스템 내에서만 호출 가능하며, DESTINATION 키워드로 부르면 런타임 에러가 납니다.
SM59 권한 테스트 통과 ≠ 데이터 권한 통과
SM59 의 Authorization Test 가 OK 라고 RFC FM 실행 시 권한이 다 있는 것은 아닙니다. FM 내부의 SAP 권한 체크(AUTHORITY-CHECK) 는 별도로 통과해야 합니다.
DB LINK 로 외부 시스템 변경 시도 → 정합성 사고
가장 흔한 사고. 외부 시스템의 비즈니스 로직(상태 변경 트리거 · 이력 적재 · 권한 체크) 을 우회하므로 데이터는 들어갔어도 "그 외 모든 후속 처리" 가 안 일어납니다. 외부 시스템에서 보면 데이터 무결성이 깨지는 셈입니다.
RFC 호출 후 COMMIT WORK 위치
데이터 변경 RFC 호출 후 COMMIT WORK 또는 BAPI_TRANSACTION_COMMIT 호출이 빠지면 상대 시스템에 변경이 반영되지 않습니다. 또한 tRFC 의 경우 호출 측에서 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 직후 COMMIT WORK AND WAIT 또는 명시적 COMMIT WORK 으로 큐 적재를 완료시켜야 합니다.
DBCO 비밀번호 평문 노출
DBCO 에 등록한 비밀번호는 시스템 내부에서 암호화되어 저장되지만, 외부 DB 의 사용자 권한이 광범위하다면 위험이 큽니다. 외부 DB 사용자는 읽기 전용 권한으로 제한하는 것이 안전합니다.
Native SQL 의 알파 변환 누락
ABAP MATNR(선행 0 포함) 과 외부 DB 의 자재번호 포맷이 다른 경우 매칭이 안 됩니다. Native SQL 에서는 자동 alpha conversion 이 안 되므로 호출 전에 ABAP 측에서 변환합니다.
EXEC SQL 의 예외 처리 누락
EXEC SQL 은 옛 구문이라 예외 처리가 ABAP 표준과 다르게 작동합니다. 외부 DB 가 다운돼 있으면 호출 측 프로그램이 멈춰버립니다. ADBC(cl_sql_connection) 사용 시 TRY · CATCH cx_sql_exception 로 처리합니다.
대량 RFC 호출 시 응답 시간 지연
LOOP 안에서 행마다 RFC 호출하면 네트워크 왕복 비용이 누적돼 성능이 급격히 저하됩니다. 가능하면 인터널 테이블 단위로 묶어 한 번에 호출하거나, qRFC 로 큐에 쌓아 백그라운드 처리합니다.
전체 코드 — 복사용 통합본
RFC 호출과 DB LINK 조회를 모두 보여주는 데모입니다. SE38 에 그대로 붙여 실행 가능합니다(DESTINATION · DB Connection 은 SM59 · DBCO 에 사전 등록 필요).
REPORT z_rfc_db_link_demo.
PARAMETERS: p_dest TYPE rfcdest DEFAULT 'NONE',
p_dbcn TYPE dbcon_name DEFAULT 'EXT_ORACLE_DB',
p_matnr TYPE matnr.
* ★ 1) RFC 호출 — 다른 SAP 시스템의 자재 마스터 조회
DATA: ls_mara TYPE bapimathead.
DATA: lt_ret TYPE STANDARD TABLE OF bapiret2.
CALL FUNCTION 'BAPI_MATERIAL_GET_DETAIL'
DESTINATION p_dest
EXPORTING
material = p_matnr
IMPORTING
material_general_data = ls_mara
TABLES
return = lt_ret
EXCEPTIONS
system_failure = 1
communication_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE: / 'RFC 호출 실패 — sy-subrc:', sy-subrc.
ELSE.
WRITE: / 'RFC 결과 — Material:', ls_mara-material,
'MTART:', ls_mara-matl_type.
ENDIF.
* ★ 2) DB LINK — ADBC 로 외부 DB 조회
DATA: lo_conn TYPE REF TO cl_sql_connection,
lo_stmt TYPE REF TO cl_sql_statement,
lo_result TYPE REF TO cl_sql_result_set,
lr_ref TYPE REF TO data.
TYPES: BEGIN OF ty_ext_row,
empno TYPE i,
ename TYPE c LENGTH 30,
sal TYPE p DECIMALS 2 LENGTH 10,
END OF ty_ext_row.
DATA: lt_ext_data TYPE STANDARD TABLE OF ty_ext_row.
TRY.
lo_conn = cl_sql_connection=>get_connection( p_dbcn ).
lo_stmt = NEW cl_sql_statement( con_ref = lo_conn ).
lo_result = lo_stmt->execute_query(
|SELECT empno, ename, sal FROM emp WHERE deptno = 10|
).
GET REFERENCE OF lt_ext_data INTO lr_ref.
lo_result->set_param_table( lr_ref ).
lo_result->next_package( ).
lo_result->close( ).
WRITE: / / '=== DB LINK 결과 ==='.
LOOP AT lt_ext_data INTO DATA(ls).
WRITE: / ls-empno, ls-ename, ls-sal.
ENDLOOP.
CATCH cx_sql_exception INTO DATA(lx_sql).
WRITE: / 'DB LINK 실패 —', lx_sql->get_text( ).
ENDTRY.
* ★ 3) 정리 — 명시적 disconnect 는 ADBC 가 자동 처리하지만 권장
TRY.
IF lo_conn IS BOUND.
lo_conn->close( ).
ENDIF.
CATCH cx_sql_exception ##NO_HANDLER.
ENDTRY.
요약
| 단계 | 방식 | 핵심 |
|---|---|---|
| 1 | RFC | App ↔ App · SM59 Destination · CALL FUNCTION ... DESTINATION |
| 2 | DB LINK | DB ↔ DB · DBCO Connection · ADBC(cl_sql_*) |
| 3 | RFC 종류 | sRFC(즉시) · aRFC(비동기) · tRFC(1회 보장) · qRFC(순서 보장) |
| 4 | 선택 원칙 | 변경 = RFC · 조회 = DB LINK 가능 · 외부 DB INSERT 비권장 |
| 5 | 관련 T-Code | SM58(tRFC) · SMQ1/SMQ2(qRFC) · ST05 · ST22 · SLG1 |
RFC 와 DB LINK 는 연결되는 계층의 차이 입니다. Application 계층에서 함수를 호출하는 RFC 는 상대 시스템의 비즈니스 로직과 권한을 그대로 거치므로 안전하지만 약간 느립니다. DB 계층에 직접 SQL 을 던지는 DB LINK 는 빠르지만 외부 시스템의 무결성을 깨뜨릴 위험이 있어 일반적으로 조회 한정 으로만 권장됩니다. 데이터를 외부 시스템에 넣어야 한다면 무조건 RFC 또는 표준 인터페이스(IDoc · BAPI · OData) 로 가는 것이 안전한 기본 원칙입니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
SM59 · DBCO · SM58 · SMQ1 · SMQ2 · ST05 · SLG1 트랜잭션과 CALL FUNCTION ... DESTINATION 구문, EXEC SQL · cl_sql_connection · cl_sql_statement ADBC 클래스는 SAP NetWeaver 표준 기능으로 시스템 버전 의존 없이 동작합니다. RFC Destination 의 유형 코드(3 = ABAP, T = TCP/IP, G/H = HTTP, L = Logical 등) 는 SAP 표준이지만 SAP Cloud Connector · S/4HANA 환경에서는 추가 유형이나 권장 방식이 다를 수 있으니, 신규 인터페이스 설계 시 베이시스·보안팀과 사전 검토를 권장합니다. EXEC SQL 은 오래된 Native SQL 구문이라 예외 처리가 까다로워 신규 코드는 ADBC(cl_sql_*) 사용을 권장하며, 외부 DB Connection 의 사용자 권한은 가능한 한 읽기 전용으로 제한하시기 바랍니다.