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 세팅 | OAD2 → OAC2 → OAC3 |
| 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 외부 인터페이스는 보안팀과 함께 권한 / 토큰 / 만료 정책을 수립하시기 바랍니다.