본문 바로가기
BAPI · BADI · RFC · Interface

[SAP ABAP] RFC vs DB LINK — SM59·DBCO·ADBC로 보는 시스템 연동 방식 차이

by Song.sh 2026. 5. 18.

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 의 사용자 권한은 가능한 한 읽기 전용으로 제한하시기 바랍니다.