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

[SAP ABAP] CL_SECXML_HELPER 파일 업/다운로드 — FILE_F4 · UPLOAD_FILE · SAVE_FILE 3개 메소드 (XSTRING 흐름)

by Song.sh 2026. 5. 22.

SAP 리포트에서 사용자 PC 의 파일을 SAP 측으로 올렸다가 다시 PC 로 내려주는 흐름을 구현해야 할 때가 자주 있습니다. 일반적으로 cl_gui_frontend_servicesfile_open_dialog · file_save_dialog + GUI_UPLOAD · GUI_DOWNLOAD 4개 API 를 직접 묶어서 처리하는데, 코드 라인이 길어지고 binary 변환(XSTRINGBIN1024) 도 매번 직접 다뤄야 해서 부담이 큽니다.

 

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|.

내부 동작:

  1. GUI_UPLOAD 함수로 파일을 BIN1024 테이블로 읽음
  2. LOOP 로 CONCATENATE ... IN BYTE MODE 로 합쳐서 XSTRING 생성
  3. 정확한 파일 크기만큼만 잘라서 반환

직접 구현하면 보통 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

내부 동작:

  1. file_save_dialog 로 사용자가 저장 위치 / 파일명 결정
  2. XSTRING 을 1024 바이트 청크로 쪼개서 BIN1024 테이블 변환
  3. 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_dialogmultiselection = 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 를 직접 사용하는 것이 더 적합합니다.