ABAP 프로그램에서 사용자가 로컬 PC의 파일을 선택하도록 유도 해야 하는 상황은 자주 옵니다. Excel 업로드, PDF 표시, 첨부 파일 등록, 일괄 처리 입력 파일 지정 등. 매번 파일 경로를 텍스트로 직접 입력받기는 불편하고 오타 위험도 큽니다.
이때 사용하는 SAP 표준 클래스가 CL_GUI_FRONTEND_SERVICES 의 FILE_OPEN_DIALOG 메서드입니다. Windows 표준 "파일 열기" 다이얼로그를 띄우고, 사용자가 선택한 파일(또는 여러 개) 의 절대 경로를 ABAP 변수로 돌려줍니다. 한 줄짜리 호출이지만 옵션이 풍부합니다.
이 글은 단일·다중 파일 선택, 초기 폴더 지정, 파일 필터 적용, 사용자 취소 처리 까지 자주 쓰는 패턴을 정리한 메모입니다. 폴더(디렉토리) 선택용 DIRECTORY_BROWSE 와 헷갈리지 않게 비교까지 함께.
핵심 원리
FILE_OPEN_DIALOG 의 시그니처는 다음과 같습니다.
| 파라미터 | 방향 | 설명 |
|---|---|---|
window_title |
IMPORTING (옵션) | 다이얼로그 상단 제목 |
initial_directory |
IMPORTING (옵션) | 다이얼로그가 처음 열릴 때 보여줄 폴더 (예: 'D:\') |
multiselection |
IMPORTING (옵션) | 'X' 면 다중 선택 허용 (기본은 단일) |
file_filter |
IMPORTING (옵션) | 확장자 필터 (예: *.xlsx 만 보이게) |
file_table |
CHANGING | 사용자가 선택한 파일 경로 목록 (filetable 타입) |
rc |
CHANGING | 선택된 파일 수 (오류 시 -1) |
user_action |
CHANGING | 사용자가 OK 눌렀는지(action_ok) / 취소했는지(action_cancel) |

핵심 출력은 file_table(선택된 파일 목록) + user_action(취소 여부). 다중 선택을 켜면 결과가 여러 라인으로 들어오므로 후속 처리도 단일/다중 구분해서 만들어야 합니다.
1단계 — 기본 호출
가장 단순한 형태입니다. 변수 3개 선언하고 호출.
DATA: lt_file_table TYPE filetable,
l_rc TYPE i,
lv_action TYPE i.
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
window_title = '파일 선택'
initial_directory = 'D:\' " 시작점 폴더
multiselection = 'X' " 다중 선택 허용
CHANGING
file_table = lt_file_table " 선택된 파일 결과
rc = l_rc
user_action = lv_action ).

호출 시점에 Windows 표준 다이얼로그가 뜨고, 사용자가 파일을 고른 뒤 열기 또는 취소 를 누르면 그 결과가 변수에 채워져 돌아옵니다.
2단계 — 옵션별 활용
initial_directory — 시작 폴더 지정
매번 사용자가 어디서부터 탐색하게 할지 정합니다. 보통 자주 쓰는 경로를 미리 잡아두면 사용자 입장에서 클릭 수가 크게 줄어듭니다.
| 상황 | 권장 initial_directory |
|---|---|
| 일반 업로드 파일 | 'C:\' 또는 'D:\' |
| 사용자 바탕화면 | GET_DESKTOP_DIRECTORY 호출해서 동적 입력 |
| 임시 폴더 | GET_TEMP_DIRECTORY 호출해서 동적 입력 |
multiselection — 단일 vs 다중
기본값은 단일 선택. 'X' 로 설정하면 Ctrl/Shift 로 여러 파일 선택 가능. 후속 처리에서 단일/다중 분기 필요.
file_filter — 확장자 필터
특정 형식만 보이게 하려면 file_filter 사용. 파이프(|) 로 표시 텍스트와 패턴을 구분.
" Excel 만 보이게
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
file_filter = |Excel (*.xlsx)\|*.xlsx\||
&& |{ cl_gui_frontend_services=>filetype_all }|
...
).
3단계 — 결과 처리 (단일 vs 다중)
사용자가 OK를 눌렀는지 먼저 확인한 뒤, 선택된 파일 개수에 따라 분기합니다.
IF lv_action = cl_gui_frontend_services=>action_ok.
DATA(lv_lines) = lines( lt_file_table ).
IF lv_lines <= 1.
" 단일 파일 선택
DATA(lv_filename) = lt_file_table[ 1 ]-filename.
WRITE: lv_filename.
ELSE.
" 다중 파일 선택 — 라인별 처리
LOOP AT lt_file_table INTO DATA(ls_file_table).
WRITE: / ls_file_table-filename.
ENDLOOP.
ENDIF.
ENDIF.


핵심 포인트:
user_action = cl_gui_frontend_services=>action_ok비교 — 사용자가 취소했을 경우 분기에서 빠짐lt_file_table[ 1 ]-filename— 단일 파일이라도 결과는 테이블이므로 첫 라인 가져오기- LOOP — 다중 파일 처리. 각 라인의
filename필드에 절대 경로
전체 코드
DATA: lv_action TYPE i,
lt_file_table TYPE filetable,
l_rc TYPE i.
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
window_title = '파일 선택'
initial_directory = 'D:\'
multiselection = 'X'
file_filter = |Excel (*.xlsx)\|*.xlsx\||
&& |{ cl_gui_frontend_services=>filetype_all }|
CHANGING
file_table = lt_file_table
rc = l_rc
user_action = lv_action ).
IF lv_action = cl_gui_frontend_services=>action_ok.
DATA(lv_lines) = lines( lt_file_table ).
IF lv_lines <= 1.
DATA(lv_filename) = lt_file_table[ 1 ]-filename.
WRITE: lv_filename.
ELSE.
LOOP AT lt_file_table INTO DATA(ls_file_table).
WRITE: / ls_file_table-filename.
ENDLOOP.
ENDIF.
ENDIF.
복붙해서 SE38에 그대로 실행하면 동작합니다.
관련 다이얼로그 비교
비슷한 용도의 메서드와 헷갈리지 않도록 정리.
| 메서드 | 용도 |
|---|---|
FILE_OPEN_DIALOG |
파일 열기 (기존 파일 선택, 단일/다중 가능) |
FILE_SAVE_DIALOG |
파일 저장 (저장할 파일명·경로 지정, 단일만) |
DIRECTORY_BROWSE |
폴더(디렉토리) 선택 — 파일 아님 |
GET_DESKTOP_DIRECTORY / GET_TEMP_DIRECTORY |
다이얼로그 없이 표준 폴더 경로 조회 |
선택 대상이 파일이면 FILE_OPEN_DIALOG, 저장 위치 지정이면 FILE_SAVE_DIALOG, 폴더면 DIRECTORY_BROWSE — 단순한 규칙입니다.
흔히 빠뜨리는 함정
user_action 체크 누락
사용자가 다이얼로그를 그냥 닫거나 취소를 누르면 file_table 이 비어 있거나 이전 값이 남아 있을 수 있음. 후속 로직이 그걸 모르고 처리하면 엉뚱한 파일을 열 수 있음. 반드시 user_action = cl_gui_frontend_services=>action_ok 비교 후 처리.
단일 선택인데 결과를 무조건 LOOP 처리
다중 선택을 안 켜도 결과는 항상 테이블(filetable) 입니다. 결과를 가져올 때 lt_file_table[ 1 ] 식으로 인덱스 접근만 해도 충분. 굳이 LOOP 안 써도 됨.
다중 선택 켜놓고 단일만 가정
다중 선택 옵션(multiselection = 'X') 켜놓고 후속에서 [ 1 ] 만 사용하면 사용자가 여러 파일 선택해도 첫 번째만 처리됨. 반대 케이스는 다중 안 켰는데 LOOP — 동작은 하지만 의도가 불분명.
file_filter 구문 실수
파이프 문자가 ABAP에서 string template 특수문자이므로 | 로 이스케이프해야 함. 또한 표시명과 패턴을 두 번 써야 동작.
- 잘못된 예:
'Excel|*.xlsx' - 올바른 예:
|Excel (.xlsx)|.xlsx||
한글 경로 깨짐
filetable 결과는 한글 경로를 정상 처리하지만, 후속 단계(예: 외부 라이브러리·서버 측 처리) 에서 인코딩 문제로 깨질 수 있음. 가능하면 ASCII 경로 환경에서 테스트 권장.
initial_directory 미존재 폴더
존재하지 않는 경로를 지정하면 다이얼로그가 디폴트 위치(보통 Documents) 로 열림. directory_exist 메서드로 사전 확인 권장.
서버 사이드 실행 불가
CL_GUI_FRONTEND_SERVICES 는 SAP GUI 클라이언트 컨트롤. 배치 잡(SM37) 등 GUI 없는 환경에서 호출하면 예외 발생. 서버 파일 처리는 OPEN DATASET + AL11 사용.
요약
| 단계 | 처리 | 핵심 |
|---|---|---|
| 1 | 변수 선언 | filetable · l_rc · lv_action 3개 |
| 2 | 다이얼로그 호출 | window_title · initial_directory · multiselection · file_filter |
| 3 | 사용자 액션 확인 | IF lv_action = cl_gui_frontend_services=>action_ok |
| 4 | 결과 처리 | 단일: lt_file_table[ 1 ]-filename / 다중: LOOP |
FILE_OPEN_DIALOG 는 ABAP에서 가장 흔하게 등장하는 사용자 인터랙션 컨트롤 중 하나입니다. 옵션 한두 가지(multiselection·file_filter) 만 잘 활용해도 사용자 입장에서 훨씬 쾌적한 입력 화면을 만들 수 있습니다. 폴더가 필요할 때는 DIRECTORY_BROWSE, 저장 위치 지정에는 FILE_SAVE_DIALOG 와 같이 짝꿍 메서드를 기억해두면 어떤 시나리오에도 빠르게 적용할 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. CL_GUI_FRONTEND_SERVICES 는 SAP GUI 클라이언트 환경에서만 동작하며 서버 배치에서는 사용할 수 없습니다. SAP 버전·Windows 버전에 따라 다이얼로그 모양과 옵션이 다를 수 있으므로 운영 환경 적용 전 개발 시스템에서 확인하시기 바랍니다.