SAP 리포트에서 사용자 PC 의 파일을 SAP 측으로 올렸다가 다시 PC 로 내려주는 흐름을 구현해야 할 때가 자주 있습니다. 일반적으로 cl_gui_frontend_services 의 file_open_dialog · file_save_dialog + GUI_UPLOAD · GUI_DOWNLOAD 4개 API 를 직접 묶어서 처리하는데, 코드 라인이 길어지고 binary 변환(XSTRING ↔ BIN1024) 도 매번 직접 다뤄야 해서 부담이 큽니다.
SAP 가 이 흐름을 통째로 wrapping 해 둔 표준 클래스가 CL_SECXML_HELPER 입니다. 이름은 "보안 XML 헬퍼" 처럼 보이지만, 그 안에 들어 있는 3개 메소드(FILE_F4 · UPLOAD_FILE · SAVE_FILE) 는 일반 파일 업/다운로드에도 그대로 사용 가능 한 가벼운 wrapper 입니다. xstring 단일 타입만 다루므로 코드가 3분의 1 수준으로 줄어듭니다.
이 글에서는 CL_SECXML_HELPER 의 3개 메소드 시그니처 · 한 줄짜리 호출 패턴 · TRY-CATCH 예외 처리 · 122 글(file_open_dialog 직접 호출) 과의 차이 · XSTRING 활용의 후속 작업(DB 저장 / 변환 / 표시) · 함정까지 정리합니다. 첨부 파일 처리를 빠르게 구현할 때 가장 가벼운 선택지입니다.
핵심 — 3개 메소드로 끝나는 파일 흐름
| 메소드 | 하는 일 | 내부 호출 |
|---|---|---|
FILE_F4 |
PC 파일 선택 다이얼로그 | cl_gui_frontend_services=>file_open_dialog |
UPLOAD_FILE |
PC → SAP (XSTRING 으로 변환) | GUI_UPLOAD + binary concat |
SAVE_FILE |
SAP → PC (다이얼로그 + 다운로드 통합) | file_save_dialog + GUI_DOWNLOAD |
3개 메소드 모두 class-method 라서 인스턴스 생성 없이 직접 호출 가능. 작업 단위가 명확해서 한 메소드 = 한 일.
xstring 단일 타입 흐름:
[PC 파일]
↓ FILE_F4 (파일명 선택)
[filename]
↓ UPLOAD_FILE
[bindata: XSTRING] ← SAP 내부에서 자유롭게 처리
↓ SAVE_FILE
[PC 다운로드]
XSTRING 한 가지로만 다루기 때문에 DB 테이블 저장(RAWSTRING 컬럼) · 이메일 첨부 · 다른 시스템 송신이 모두 같은 변수로 처리됩니다.
1단계 — 파일 선택 (FILE_F4)
PC 의 어떤 파일을 선택할지 묻는 다이얼로그. 사용자가 OK 누르면 풀 경로가 filename 으로 반환.
DATA lv_filename TYPE string.
cl_secxml_helper=>file_f4(
EXPORTING
initial_directory = ' ' " 시작 디렉토리 (빈값 = 기본)
window_title = '파일 선택'
IMPORTING
filename = lv_filename ).
IF lv_filename IS INITIAL.
" 사용자가 취소
EXIT.
ENDIF.
파라미터:
initial_directory— 시작 경로('C:\Users\Downloads'등). 빈값이면 SAP GUI 디폴트window_title— 다이얼로그 창 제목filename(IMPORTING) — 선택된 파일의 풀 경로
내부적으로 표준 cl_gui_frontend_services=>file_open_dialog 를 호출하지만 다중 선택 / 파일 필터 같은 옵션은 사용 못 합니다. 단일 파일 선택만 지원.
2단계 — PC → SAP 업로드 (UPLOAD_FILE)
선택된 파일의 내용을 XSTRING 으로 읽어옵니다.
DATA lv_data_xstr TYPE xstring.
cl_secxml_helper=>upload_file(
EXPORTING
filename = lv_filename
IMPORTING
bindata = lv_data_xstr ).
" XSTRING 길이 확인
DATA(lv_size) = xstrlen( lv_data_xstr ).
WRITE: / |파일 크기: { lv_size } bytes|.
내부 동작:
GUI_UPLOAD함수로 파일을BIN1024테이블로 읽음- LOOP 로
CONCATENATE ... IN BYTE MODE로 합쳐서 XSTRING 생성 - 정확한 파일 크기만큼만 잘라서 반환
직접 구현하면 보통 10~15줄이 필요한 작업이 한 메소드 호출로 끝납니다. 결과 XSTRING 은 그대로 DB 저장 / 이메일 첨부 / 다른 시스템 송신에 사용 가능.
3단계 — SAP → PC 다운로드 (SAVE_FILE)
XSTRING 으로 가지고 있는 파일 데이터를 PC 로 내려줍니다. 저장 위치 선택 다이얼로그 + 실제 다운로드를 한 번에 처리.
cl_secxml_helper=>save_file(
EXPORTING
default_file_name = 'TESTFILE.pdf' " 기본 파일명
initial_directory = ' ' " 시작 경로
window_title = '다운로드'
bindata = lv_data_xstr ). " 저장할 XSTRING
내부 동작:
file_save_dialog로 사용자가 저장 위치 / 파일명 결정- XSTRING 을 1024 바이트 청크로 쪼개서
BIN1024테이블 변환 GUI_DOWNLOAD로 BIN 타입으로 다운로드
사용자가 다이얼로그에서 취소를 누르면 다운로드는 일어나지 않고 메소드가 조용히 종료. 별도 예외 체크 없이도 안전.
4단계 — 전체 흐름 (Notion 노트 기반)
3개 메소드를 TRY-CATCH 안에 묶은 표준 패턴.
TRY.
" ★ 1) 파일 선택
cl_secxml_helper=>file_f4(
EXPORTING
initial_directory = ' '
window_title = '업로드 파일 선택'
IMPORTING
filename = DATA(lv_xfile) ).
IF lv_xfile IS NOT INITIAL.
" ★ 2) PC → SAP 업로드
cl_secxml_helper=>upload_file(
EXPORTING
filename = lv_xfile
IMPORTING
bindata = DATA(lv_data_xstr) ).
IF sy-subrc = 0.
" ★ 3) (선택) SAP 내부에서 가공 / DB 저장 등 후속 처리
" 예: 자체 테이블에 저장
" INSERT zt_file FROM @( VALUE #( ... data = lv_data_xstr ) ).
" ★ 4) SAP → PC 다운로드
cl_secxml_helper=>save_file(
EXPORTING
default_file_name = 'TESTFILE'
initial_directory = ' '
window_title = '저장 위치 선택'
bindata = lv_data_xstr ).
CHECK sy-subrc = 0.
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(e_text).
WRITE: / e_text->get_text( ).
ENDTRY.
TRY-CATCH 의 의미 — 3개 메소드 어디서든 예외가 발생하면 cx_root 로 모두 catch. 운영에서는 메시지 표시 + 로그 적재로 분기 처리하면 됩니다.
5단계 — XSTRING 활용 (DB 저장 · 변환 · 표시)
업로드 후 받은 XSTRING 은 다양한 후속 작업에 그대로 사용:
DB 테이블에 저장 (RAWSTRING 컬럼):
INSERT zt_file_storage FROM @( VALUE #(
doc_id = lv_doc_id
filename = lv_xfile
filedata = lv_data_xstr " RAWSTRING 컬럼
aedat = sy-datum
uname = sy-uname ) ).
다른 사용자에게 이메일 첨부로 송신 (CL_BCS):
DATA(lo_doc) = cl_document_bcs=>create_document(
i_type = 'PDF'
i_subject = '첨부파일' ).
lo_doc->add_attachment(
i_attachment_type = 'PDF'
i_attachment_subject = 'TESTFILE.pdf'
i_att_content_hex = cl_bcs_convert=>xstring_to_solix( lv_data_xstr ) ).
브라우저 / HTML Viewer 에 표시 (PDF / 이미지):
DATA(lo_html) = NEW cl_gui_html_viewer( parent = cl_gui_container=>default_screen ).
" XSTRING → MIME type 자동 인식해서 화면에 표시
" (실제 흐름은 별도 글 참조)
XSTRING 단일 형식이 SAP 의 모든 binary 처리 API 의 공통 입력 / 출력이라 한 번 받아두면 어디서든 활용 가능합니다.
122 글과의 차이점
같은 첨부 영역의 글이지만 목적이 다릅니다.
| 항목 | CL_SECXML_HELPER (이 글) | file_open_dialog 직접 (122 글) |
|---|---|---|
| API 추상화 수준 | 상위 wrapper (3 메소드) | 하위 raw API 직접 호출 |
| 코드 라인 수 | 10줄 내외 | 30~50줄 (full features) |
| 옵션 폭 | 제한적 (시작 디렉토리 + 제목) | 광범위 (필터 · 다중 선택 · 확장자) |
| 경로 기억 | 불가 (initial_directory 만) | 가능 (메모리 ID + Z 테이블) |
| 적합 시나리오 | 빠른 첨부 처리 · XSTRING 흐름 | 정교한 UX · 다중 파일 · 필터 |
선택 — 3개 파라미터로 충분 + XSTRING 단일 흐름 이면 CL_SECXML_HELPER, 세밀한 다이얼로그 제어 / 경로 자동 복원 이 필요하면 file_open_dialog 직접 호출. 두 방식을 같은 프로젝트에 섞어 써도 무방합니다.
흔히 빠뜨리는 함정
XSTRING vs STRING 혼동
XSTRING 은 binary (raw bytes), STRING 은 character (UTF-16). 파일 데이터는 항상 XSTRING. 텍스트 파일이라도 XSTRING 으로 받은 후 CL_SECXML_HELPER=>UTF8_2_STRING 같은 메소드로 STRING 변환.
빈 파일 / 사용자 취소 처리
FILE_F4 호출 후 사용자가 다이얼로그를 취소하면 filename 이 빈값. IF lv_filename IS NOT INITIAL 체크가 필요. 체크 안 하면 UPLOAD_FILE 이 잘못된 경로로 호출되어 에러 발생.
시작 디렉토리 슬래시
initial_directory 의 끝에 슬래시가 없으면 일부 환경에서 디렉토리로 인식되지 않을 수 있습니다. 'C:\Downloads' 처럼 끝에 슬래시를 붙이는 게 안전.
파일 크기 제한
내부적으로 GUI_UPLOAD/GUI_DOWNLOAD 를 사용하므로 SAP GUI 의 메모리 / 네트워크 제약을 따릅니다. 일반적으로 수십 MB 까지는 안정적이지만 100MB+ 대형 파일은 별도 청크 처리 / Content Server 활용을 검토.
filetype 'BIN' 고정
내부적으로 filetype = 'BIN' 으로 호출됩니다. ASC 텍스트 파일도 그대로 동작하지만, 문자 코드 변환이 필요한 경우 별도로 처리해야 합니다.
TRY-CATCH 누락
PC 가 연결 끊김 / 파일 권한 없음 / 디스크 부족 등 다양한 예외가 발생할 수 있습니다. cx_root 로 한 번에 잡거나, 보다 정밀하게 cx_sy_file_access 같은 하위 클래스로 분기.
SXML_SEC 패키지의 다른 메소드 사용 금지
CL_SECXML_HELPER 에는 보안 XML 처리용 메소드(CREATE_TEMP_PSE·DECRYPT_ENCRYPTED_KEY·RESOLVE_PUBLIC_KEY 등) 도 있습니다. 이 메소드들은 인증서 처리 전용 이므로 일반 파일 업/다운로드에서는 사용하지 마시기 바랍니다.
다중 파일 처리 시 별도 구현
CL_SECXML_HELPER 는 단일 파일 단일 호출 흐름. 여러 파일을 동시에 업로드 하려면 cl_gui_frontend_services=>file_open_dialog 에 multiselection = abap_true 옵션을 직접 사용해야 합니다.
전체 코드 — 복사용 통합본
*&---------------------------------------------------------------------*
*& Report Z_XX_FILE_UPDOWN_HELPER
*&---------------------------------------------------------------------*
*& CL_SECXML_HELPER 로 파일 업/다운로드 (Notion 노트 기반)
*&---------------------------------------------------------------------*
REPORT z_xx_file_updown_helper.
PARAMETERS: p_init TYPE string LOWER CASE DEFAULT 'C:\Users\Downloads\',
p_save TYPE string LOWER CASE DEFAULT 'TESTFILE'.
START-OF-SELECTION.
TRY.
" ★ 1) PC 파일 선택 다이얼로그
cl_secxml_helper=>file_f4(
EXPORTING
initial_directory = p_init
window_title = '업로드 파일 선택'
IMPORTING
filename = DATA(lv_xfile) ).
" 사용자가 취소했는지 확인
CHECK lv_xfile IS NOT INITIAL.
WRITE: / |선택한 파일: { lv_xfile }|.
" ★ 2) PC → SAP 업로드 (XSTRING 으로 변환)
cl_secxml_helper=>upload_file(
EXPORTING
filename = lv_xfile
IMPORTING
bindata = DATA(lv_data_xstr) ).
CHECK sy-subrc = 0.
DATA(lv_size) = xstrlen( lv_data_xstr ).
WRITE: / |파일 크기: { lv_size } bytes|.
" ★ 3) (옵션) SAP 내부에서 가공 / DB 저장
" 예: INSERT zt_file_storage FROM @( VALUE #( ... ) ).
" 예: cl_bcs 이메일 첨부
" 예: HTML Viewer 표시
" ★ 4) SAP → PC 다운로드 (저장 위치 선택 + 다운로드 통합)
cl_secxml_helper=>save_file(
EXPORTING
default_file_name = p_save
initial_directory = p_init
window_title = '저장 위치 선택'
bindata = lv_data_xstr ).
CHECK sy-subrc = 0.
WRITE: / '업로드 + 다운로드 완료'.
CATCH cx_root INTO DATA(lo_ex).
WRITE: / '에러:', lo_ex->get_text( ).
ENDTRY.
같이 보면 좋은 글:
- "파일 업/다운로드 경로 자동 저장·복원 — file_open_dialog initial_directory + SPA/GPA 메모리 ID" — 경로 자동 복원이 필요할 때
- "CL_GOS_MANAGER 첨부파일 활용 — 자체 화면에 표준 GOS 서비스 끼우기" — 표준 첨부 메뉴와 함께 사용
- "SWU_OBJECT_PUBLISH ALV GOS 아이콘 만드는 방법" — ALV + GOS 메뉴 통합
- "BAPI · BDC 에러 메시지 확인 방법 — MESSAGE INTO · FORMAT_MESSAGE 빌드" — 업로드 실패 / 권한 부족 메시지 처리
요약
| 단계 | 메소드 | 핵심 포인트 |
|---|---|---|
| 1 | FILE_F4 |
PC 파일 선택 → filename |
| 2 | UPLOAD_FILE |
PC → SAP XSTRING |
| 3 | SAP 내부 처리 | DB 저장 / 이메일 / 변환 등 (선택) |
| 4 | SAVE_FILE |
SAP → PC 다이얼로그 + 다운로드 통합 |
| 5 | TRY-CATCH | cx_root 일괄 처리 |
CL_SECXML_HELPER 의 3개 메소드는 표준 GUI_UPLOAD / GUI_DOWNLOAD 흐름을 한 번에 wrapping 해서 코드를 1/3 수준으로 줄여줍니다.
XSTRING 단일 흐름이라 DB 저장 · 이메일 · 다른 시스템 송신 같은 후속 작업이 모두 같은 변수로 처리됩니다.
다중 파일 / 정교한 다이얼로그 옵션이 필요하면 file_open_dialog 직접 호출 패턴을, 단일 파일 + 빠른 처리가 필요하면 이 헬퍼 클래스를 선택하시면 됩니다. 보안 XML 패키지에 들어 있지만 인증서 / 암호화 관련 메소드와는 섞지 않고 파일 입출력 3개만 사용하시기 바랍니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
CL_SECXML_HELPER 클래스 메소드 시그니처 · 내부 GUI_UPLOAD / GUI_DOWNLOAD 동작은 SAP NetWeaver 표준(패키지 SXML_SEC · ECC 6.0 / S/4HANA on-premise) 기준이며, 사내 SAP GUI 보안 정책 · PC 권한 · 네트워크 환경에 따라 일부 동작이 다를 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다. 대용량 파일 처리 / 다중 파일 / 정교한 다이얼로그 옵션이 필요한 경우 raw API 를 직접 사용하는 것이 더 적합합니다.