본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] ArchiveLink 첨부파일 업/다운로드 — ARCHIV_CREATE_TABLE · TOA01 · 외부 시스템 RFC 게이트웨이

by Song.sh 2026. 5. 22.

SAP 의 첨부파일 저장 방식은 크게 두 갈래 — SAP Office(SOFFCONT1) 와 ArchiveLink(TOA01·Content Server) 가 있습니다. 일반적으로 표준 트랜잭션에서 GOS 메뉴로 첨부하는 파일은 SOFFCONT1 에 들어가고, 외부 시스템(WEB · MES · 그룹웨어) 에서 SAP 로 첨부를 송신 하거나 SAP 의 Content Server 에 영구 보관 해야 하는 경우는 ArchiveLink 를 사용합니다.

 

ArchiveLink 흐름의 핵심은 외부 시스템 → RFC 호출 → ARCHIV_CREATE_TABLE → TOA01 등록 → Content Server 저장 의 단방향 게이트. 다운로드는 그 반대로 TOA01 SELECT → URL FM 호출 → 외부 시스템이 URL 로 직접 다운로드 합니다. 표준 GOS 와 달리 외부 시스템이 SAP Login 없이 RFC 만으로 파일을 주고받을 수 있다 는 점이 핵심 강점입니다.

 

이 글에서는 ArchiveLink IMG 3단계 세팅(OAD2·OAC2·OAC3) · 핵심 테이블(TOA01·TOADD) · 업로드 표준 FM ARCHIV_CREATE_TABLE · 다운로드 URL FM · 외부 시스템 연동 RFC 패턴 · 자주 빠뜨리는 함정까지 정리합니다.

핵심 — ArchiveLink vs SOFFCONT1 vs GOS

구분 ArchiveLink SOFFCONT1 + GOS
저장 위치 Content Server (외부 저장소) SAP DB 내부 (SOFFCONT1 테이블)
메타데이터 테이블 TOA01 · TOADD SRGBRBREL · SOOD
외부 시스템 접근 RFC 로 직접 송수신 (URL 방식) SAP Login 필요 (화면 의존)
대용량 파일 유리 (외부 스토리지) DB 부하 (수십 MB 이상 비권장)
운영 비용 Content Server 별도 관리 SAP DB 만
주 사용 외부 시스템 연동 / 대용량 / 영구 보관 SAP 내부 사용자 첨부

선택 기준 — WEB / MES 같은 외부 시스템이 첨부를 직접 다루어야 하면 ArchiveLink, SAP 내부 사용자가 GOS 메뉴로만 다루면 SOFFCONT1. 두 방식을 같은 회사에 혼용하는 것도 일반적.


1단계 — IMG 세팅 3단계

ArchiveLink 를 처음 셋업할 때 IMG 에서 3개 T-Code 를 순서대로 처리.

[1] OAD2 — 문서 유형 지정 (Document Type)
     SPRO → Document Management → ... → Documents
     → AR_OBJECT 명 정의 (예: ZXXWEB)
     → 문서 종류 (PDF · DOC · XLS 등) 매핑

[2] OAC2 — 문서 유형 타입 생성 (Global Document Type)
     문서 유형의 글로벌 카테고리 정의
     → 디스플레이 / 출력 / 삭제 정책

[3] OAC3 — 링크 저장소 생성 (Links: BO ↔ ArchiveLink)
     SAP 비즈니스 객체와 AR_OBJECT 매핑
     → SAP_OBJECT (예: ZXXWEBGOS) 정의
     → 저장소 (Content Repository) 연결

3단계가 끝나야 표준 FM 이 그 AR_OBJECT 를 인식. 운영 이송 시 OAD2 → OAC2 → OAC3 순서를 깨지 않고 한 CTS 에 묶어서 보내야 합니다.

 

확인용 SQL:

" AR_OBJECT 가 IMG 에 등록되어 있는지
SELECT * FROM toaom
  INTO TABLE @DATA(lt_toaom)
 WHERE ar_object = 'ZXXWEB'.

" 허용된 문서 유형 (확장자)
SELECT * FROM toadd
  INTO TABLE @DATA(lt_toadd).

2단계 — 핵심 테이블 구조

ArchiveLink 의 운영 데이터가 들어가는 표준 테이블.

테이블 의미
TOA01 메인 연결 테이블 (AR_OBJECT · OBJECT_ID · SAP_OBJECT · ARC_DOC_ID · ARCHIV_ID)
TOAOM AR_OBJECT × SAP_OBJECT 매핑 (OAC3)
TOADD 허용된 문서 유형 (DOC_TYPE — PDF·DOC·XLS 등)
TOADV AR_OBJECT 기본 DOC_TYPE 매핑

TOA01 의 키 컬럼:

ARCHIV_ID    — Content Repository ID (저장소)
ARC_DOC_ID   — 문서 고유 키 (GUID)
AR_OBJECT    — 문서 유형 (예: ZXXWEB)
SAP_OBJECT   — SAP 객체 매핑 (예: ZXXWEBGOS)
OBJECT_ID    — 호출자가 지정하는 키 (예: PO 번호 + 첨부 순번)

같은 객체에 여러 첨부를 붙이려면 OBJECT_ID 에 순번을 포함하는 게 일반적 (예: 4500000001 + GUID).


3단계 — 업로드 — ARCHIV_CREATE_TABLE

표준 FM. PC 파일이 아닌 외부 시스템에서 받은 binary 데이터(1024 바이트 청크 테이블) 로 업로드하는 패턴. 외부 RFC 게이트웨이의 핵심 FM.

DATA: lt_binarchivobject TYPE TABLE OF tbl1024,
      ls_binline         TYPE tbl1024,
      ls_outdoc          TYPE toadt.

" 외부 시스템(WEB) 에서 받은 binary 를 1024 바이트씩 쪼개서 적재
" (실제 데이터는 RFC IMPORTING 파라미터로 들어옴)

CALL FUNCTION 'ARCHIV_CREATE_TABLE'
  EXPORTING
    ar_object                = 'ZXXWEB'         " IMG 정의 문서 유형
    object_id                = lv_object_id     " 호출자 지정 키
    sap_object               = 'ZXXWEBGOS'      " SAP 객체 매핑
    doc_type                 = 'PDF'            " 또는 PDF·DOC·XLS
    flength                  = lv_fsize         " 파일 크기
  IMPORTING
    outdoc                   = ls_outdoc        " 생성 결과 (arc_doc_id 등)
  TABLES
    binarchivobject          = lt_binarchivobject
  EXCEPTIONS
    error_archiv             = 1
    error_communicationtable = 2
    error_connectiontable    = 3
    error_kernel             = 4
    error_parameter          = 5
    error_user_exit          = 6
    error_mandant            = 7
    OTHERS                   = 8.

IF sy-subrc <> 0.
  " 에러 처리
  MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
  " ls_outdoc-arc_doc_id 에 생성된 문서 키
  WRITE: / '문서 키:', ls_outdoc-arc_doc_id.
ENDIF.

핵심 파라미터:

  • AR_OBJECT — IMG 의 OAD2 에서 정의한 문서 유형
  • SAP_OBJECT — OAC3 에서 매핑한 SAP 비즈니스 객체
  • OBJECT_ID — 회사 자체 키 (PO 번호 / 첨부 순번 / GUID 등)
  • DOC_TYPE — 확장자 (TOADD 에 등록된 것만)
  • BINARCHIVOBJECT — TBL1024 라인 테이블 (1024 바이트 청크)

FM 호출 직후 TOA01 에 한 행 + Content Server 에 실제 binary 가 저장됩니다. ARC_DOC_ID 는 SAP 가 자동 생성하는 GUID.


4단계 — XSTRING 으로 업로드 (간단 패턴)

위 패턴이 청크 테이블이라 복잡하면, XSTRING 으로 한 번에 넘기는 방식도 가능합니다.

DATA: lv_xstr   TYPE xstring,
      ls_outdoc TYPE toadt.

" PC 파일 → XSTRING (CL_SECXML_HELPER 활용)
cl_secxml_helper=>upload_file(
  EXPORTING filename = lv_filename
  IMPORTING bindata  = lv_xstr ).

CALL FUNCTION 'ARCHIV_CREATE_TABLE'
  EXPORTING
    ar_object  = 'ZXXWEB'
    object_id  = lv_object_id
    sap_object = 'ZXXWEBGOS'
    doc_type   = 'PDF'
    document   = lv_xstr               " ★ XSTRING 직접 전달
  IMPORTING
    outdoc     = ls_outdoc.

내부적으로 SAP 가 XSTRING 을 1024 바이트 청크로 자동 분리해서 처리합니다. RFC 외부 호출과 GUI 업로드 양쪽 모두에 동일한 FM 사용 가능.


5단계 — 다운로드 — Content Server URL 받기

외부 시스템이 SAP 의 Content Server 에서 파일을 직접 다운로드하려면 URL 만 받아오면 됩니다. 표준 FM 으로 URL 을 추출 후 외부 시스템이 HTTP 로 직접 접근.

DATA: ls_toa01      TYPE toa01,
      lt_uri_tab    TYPE TABLE OF toadurl_s,
      ls_uri        LIKE LINE OF lt_uri_tab,
      ls_bapireturn TYPE bapiret2,
      lv_uri        TYPE saeuri.

" 1) TOA01 에서 ARC_DOC_ID 조회
SELECT SINGLE *
  INTO @ls_toa01
  FROM toa01
 WHERE ar_object  = 'ZXXWEB'
   AND sap_object = 'ZXXWEBGOS'
   AND object_id  = @lv_object_id.

IF sy-subrc <> 0.
  MESSAGE '첨부파일이 존재하지 않습니다' TYPE 'E'.
ENDIF.

" 2) ARC_DOC_ID 로 다운로드 URL 받기 (자체 RFC 또는 표준 FM)
CALL FUNCTION 'Z_XX_ALINK_DOCUMENT_URL_GET'
  EXPORTING
    im_docid  = ls_toa01-arc_doc_id
    im_crepid = ls_toa01-archiv_id
  IMPORTING
    ex_message = ls_bapireturn
  TABLES
    ex_urls    = lt_uri_tab.

" 3) data 컴포넌트 URL 추출
READ TABLE lt_uri_tab WITH KEY docid       = ls_toa01-arc_doc_id
                              compid+0(4) = 'data'
                     INTO ls_uri.

IF sy-subrc = 0.
  lv_uri = ls_uri-url.
  " 외부 시스템에 이 URL 반환 → 외부에서 HTTP GET 으로 파일 다운로드
ENDIF.

URL 은 일회성. 외부 시스템이 받은 URL 로 HTTP 접근하면 Content Server 가 파일을 직접 송신. SAP 측은 binary 를 메모리에 올리지 않으므로 대용량 파일도 부담 없습니다.


6단계 — SAP 내부에서 직접 다운로드 (XSTRING)

외부 URL 방식이 아닌 SAP 프로그램 내부에서 binary 를 받으려면 SCMS_AO_TABLE_GET 또는 ARCHIVOBJECT_GET_TABLE 사용.

DATA: lt_binarchivobject TYPE TABLE OF tbl1024,
      lv_length          TYPE i,
      lv_xstr            TYPE xstring.

" Content Server 에서 binary 직접 가져오기
CALL FUNCTION 'SCMS_AO_TABLE_GET'
  EXPORTING
    archiv_id     = ls_toa01-archiv_id
    archiv_doc_id = ls_toa01-arc_doc_id
  IMPORTING
    length        = lv_length
  TABLES
    binarchivobject = lt_binarchivobject
  EXCEPTIONS
    OTHERS        = 1.

" 청크 테이블 → XSTRING
LOOP AT lt_binarchivobject ASSIGNING FIELD-SYMBOL(<ls_bin>).
  CONCATENATE lv_xstr <ls_bin>-line INTO lv_xstr IN BYTE MODE.
ENDLOOP.

" 정확한 크기만큼 잘라냄
lv_xstr = lv_xstr(lv_length).

" 이제 lv_xstr 로 다양한 작업 가능
" 예: cl_secxml_helper=>save_file( ... bindata = lv_xstr )

XSTRING 으로 받은 후 PC 다운로드 / 이메일 첨부 / HTML Viewer 표시 등에 그대로 활용 가능.


7단계 — 외부 시스템 연동 RFC 패턴

외부 시스템(WEB · MES · 그룹웨어) 이 ArchiveLink 에 직접 첨부를 올리고 내리는 표준 RFC 구조.

*&---------------------------------------------------------------------*
*& Z_XX_FILE_UPLOAD — 외부 시스템 → SAP 파일 업로드 게이트웨이
*&---------------------------------------------------------------------*
FUNCTION z_xx_file_upload.
*"  IMPORTING
*"     VALUE(I_AR_OBJECT)  TYPE  SAEOBJART
*"     VALUE(I_OBJECT_ID)  TYPE  SAEOBJID
*"     VALUE(I_SAP_OBJECT) TYPE  SAEANWDID
*"     VALUE(I_DOC_TYPE)   TYPE  SAEDOKTYP OPTIONAL
*"     VALUE(I_FILE)       TYPE  CHAR255 OPTIONAL
*"     VALUE(I_FSIZE)      TYPE  SDOK_FSIZE OPTIONAL
*"     VALUE(IT_BINARCHIVOBJECT) TYPE ZLTBL1024 OPTIONAL
*"  EXPORTING
*"     VALUE(E_ARC_DOC_ID) TYPE  SAEARDOID
*"     VALUE(E_MTYPE)      TYPE  BAPI_MTYPE
*"     VALUE(E_MTEXT)      TYPE  BAPI_MSG

  DATA: ls_toa01 TYPE toa01,
        l_doc_type TYPE saedoktyp,
        l_extension TYPE char7.

  CLEAR: e_arc_doc_id, e_mtype.

  " ★ 1) 동일 OBJECT_ID 중복 체크
  SELECT SINGLE *
    INTO ls_toa01
    FROM toa01
   WHERE sap_object = i_sap_object
     AND object_id  = i_object_id
     AND ar_object  = i_ar_object.

  IF sy-subrc = 0.
    e_mtype = 'E'.
    e_mtext = '동일한 오브젝트가 존재합니다.'.
    EXIT.
  ENDIF.

  " ★ 2) 파일 확장자 → DOC_TYPE 자동 결정
  l_doc_type = i_doc_type.
  IF l_doc_type IS INITIAL AND i_file IS NOT INITIAL.
    cl_bcs_utilities=>split_name(
      EXPORTING
        iv_name      = i_file
        iv_delimiter = '.'
      IMPORTING
        ev_extension = l_extension ).

    l_doc_type = l_extension.
    TRANSLATE l_doc_type TO UPPER CASE.

    " TOADD 에 허용된 확장자인지 검증
    SELECT COUNT(*) FROM toadd
      WHERE doc_type = l_doc_type.
    IF sy-subrc <> 0.
      e_mtype = 'E'.
      e_mtext = '허용된 파일유형이 아닙니다.'.
      EXIT.
    ENDIF.
  ENDIF.

  " ★ 3) ARCHIV_CREATE_TABLE 표준 FM 호출
  CALL FUNCTION 'ARCHIV_CREATE_TABLE'
    EXPORTING
      ar_object                = i_ar_object
      object_id                = i_object_id
      sap_object               = i_sap_object
      doc_type                 = l_doc_type
      flength                  = i_fsize
    TABLES
      binarchivobject          = it_binarchivobject
    EXCEPTIONS
      error_archiv             = 1
      error_communicationtable = 2
      error_connectiontable    = 3
      error_kernel             = 4
      error_parameter          = 5
      OTHERS                   = 6.

  IF sy-subrc <> 0.
    e_mtype = 'E'.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
       INTO e_mtext.
    EXIT.
  ENDIF.

  " ★ 4) 생성 결과 확인
  SELECT SINGLE *
    INTO ls_toa01
    FROM toa01
   WHERE sap_object = i_sap_object
     AND object_id  = i_object_id
     AND ar_object  = i_ar_object.

  IF sy-subrc = 0.
    e_mtype = 'S'.
    e_arc_doc_id = ls_toa01-arc_doc_id.
  ELSE.
    e_mtype = 'E'.
    e_mtext = '첨부파일 등록 후 확인 시 데이터가 없습니다.'.
  ENDIF.

ENDFUNCTION.

이 RFC 를 외부 시스템(WEB) 이 호출하면서 binary 청크 + 메타데이터를 넘기면 됩니다. 내부적으로 ARCHIV_CREATE_TABLE 표준 FM 을 한 번 호출 → TOA01 등록 + Content Server 저장이 한 LUW 에 완료됩니다.


흔히 빠뜨리는 함정

AR_OBJECT 가 IMG 에 없음

OAD2 에서 정의하지 않은 AR_OBJECT 를 RFC 로 넘기면 ERROR_CONNECTIONTABLE 예외. IMG 의 OAD2 → OAC2 → OAC3 세 단계가 모두 완료되어 있어야 표준 FM 이 인식합니다.

TOADD 에 등록 안 된 DOC_TYPE

확장자가 PDF / DOC / XLS 가 아닌 회사 자체 확장자(.dwg·.hwp 등) 면 사전에 TOADD 에 등록. 등록 안 된 확장자는 ARCHIV_CREATE_TABLE 이 거부.

Object_ID 중복

같은 SAP_OBJECT × AR_OBJECT × OBJECT_ID 조합으로 두 번 호출하면 두 번째는 동일한 오브젝트가 존재합니다. 호출 전 TOA01 SELECT 로 중복 체크하거나, OBJECT_ID 에 GUID / 순번을 포함해서 항상 유일하게.

Binary 청크 길이 / 1024 라인

TBL1024 의 한 줄은 정확히 1024 바이트. 마지막 라인은 부족할 수 있어 FLENGTH 파라미터로 정확한 크기를 명시해야 합니다. FLENGTH 가 0 이면 SAP 가 임의로 계산하다 잘못 잘릴 수 있음.

Content Server 미연결

OAC3 에서 ARCHIV_ID 가 매핑되어도 실제 Content Server(HTTP 또는 디스크 기반) 가 가동 중이 아니면 ERROR_ARCHIV. OAC0 에서 저장소 상태 확인 + SM59 RFC 연결 점검.

다운로드 URL 만료

ArchiveLink 가 발급하는 URL 은 시간 제한이 있습니다(보통 수십 분). 외부 시스템이 받은 즉시 다운로드해야 하며, 캐싱해 두면 만료 후 실패. 외부 호출 직전에 URL 을 새로 받아오는 패턴이 안전.

RFC binary 전송 오버헤드

대용량 파일(100MB+) 을 RFC 로 한 번에 전송하면 메모리 / 타임아웃 위험. 외부 시스템 측에서 청크 분할 전송 → SAP RFC 가 누적해서 한 번에 ARCHIV_CREATE_TABLE 호출하는 패턴이 표준.

MANDT 불일치

multi-client 시스템에서 RFC 호출자의 MANDT 가 다르면 ERROR_MANDANT. RFC Destination 의 client 설정 확인.

외부 노출 보안

URL 방식은 외부 시스템에 직접 노출되는 인터페이스라 SAP Login 없이도 접근 가능. 사용자 인증 / 권한 / 토큰 같은 보안 레이어를 외부 시스템 단에서 보강 필수. 회사 보안팀과 함께 정책 수립.


같이 보면 좋은 글

  • "CL_GOS_MANAGER 첨부파일 활용 — 자체 화면에 표준 GOS 서비스 끼우기" — SOFFCONT1 첨부 방식 (비교 대상)
  • "SWU_OBJECT_PUBLISH ALV GOS 아이콘 만드는 방법" — ALV + GOS 메뉴 통합
  • "CL_SECXML_HELPER 파일 업/다운로드" — XSTRING 단일 흐름 wrapper
  • "BAPI · BDC 에러 메시지 확인 방법" — RFC 호출 시 에러 처리

요약

단계 하는 일 핵심 포인트
1 IMG 세팅 OAD2OAC2OAC3
2 업로드 ARCHIV_CREATE_TABLE + binary 청크
3 다운로드 URL TOA01 SELECT → URL FM → 외부 HTTP
4 내부 다운로드 SCMS_AO_TABLE_GET → XSTRING
5 RFC 게이트웨이 중복 / TOADD / 에러 처리 캡슐화
6 보안 검증 URL 만료 · 권한 · MANDT · 외부 인증

ArchiveLink 첨부 흐름은 IMG 3단계 세팅(OAD2·OAC2·OAC3) + ARCHIV_CREATE_TABLE 표준 FM + TOA01 메타데이터 관리 세 기둥으로 구성됩니다.

외부 시스템이 SAP Login 없이 RFC + URL 만으로 첨부를 주고받을 수 있다는 점이 SOFFCONT1 방식과의 결정적 차이입니다. 대용량 파일 / 영구 보관 / WEB · MES 연동이 필요한 시나리오라면 ArchiveLink, SAP 내부 사용자가 GOS 메뉴로 다루는 단순 첨부라면 SOFFCONT1 — 두 방식을 회사 정책에 맞춰 분기 운영하시면 됩니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

ARCHIV_CREATE_TABLE Function Module 시그니처 · TOA01 / TOADD 테이블 구조 · IMG OAD2/OAC2/OAC3 동작은 SAP NetWeaver 표준(패키지 SAOP · ECC 6.0 / S/4HANA on-premise) 기준이며, 사내 Content Server 설정 · 외부 시스템 인터페이스 정책 · 보안 규정에 따라 일부 동작이 다를 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다. URL 노출 / RFC 외부 인터페이스는 보안팀과 함께 권한 / 토큰 / 만료 정책을 수립하시기 바랍니다.