본문 바로가기
ALV · 화면 · 리포트

[SAP ABAP] SAP GUI 안에 웹 페이지 임베드 — ALV HTML Viewer (show_url + navigate_complete)

by Song.sh 2026. 6. 5.

SAP GUI 안에서 외부 웹 페이지나 HTML 문서를 띄우고 싶을 때 쓰는 클래스가 CL_GUI_HTML_VIEWER 입니다. SAPscript 미리보기, 매뉴얼 페이지 임베드, 사내 포털 호출, 동적 HTML 리포트 출력 같은 케이스에 자주 씁니다. ALV Grid 가 표 출력 전용이라면 HTML Viewer 는 자유 HTML 표시 + 브라우저 이벤트 수신 까지 가능한 더 자유로운 컨트롤.

 

핵심은 세 갈래입니다. (1) show_url — URL 한 줄로 외부 페이지 표시, (2) load_data + show_url — ABAP 에서 만든 HTML 을 메모리에 로드해 표시, (3) load_mime_object — MIME Repository(SE80) 에 올려둔 정적 HTML 표시.

 

이 글에서는 컨테이너 + HTML Viewer 생성 → URL 표시 → 이벤트 핸들러(navigate_complete) 등록 → 클릭한 URL 받기까지 정리합니다. 예시는 SAP Help Portal(help.sap.com) 같은 공개 페이지 표시 기준.

핵심 — HTML Viewer 의 3가지 표시 방식

방식 메소드 용도
URL 표시 show_url 외부 URL · 사내 포털 · SAP Help Portal 직접 호출
메모리 HTML load_data + show_url ABAP 에서 만든 동적 HTML 문자열 표시
MIME 객체 load_mime_object SE80 MIME Repository 에 업로드한 정적 HTML/이미지

전체 흐름은 다음과 같습니다.

[ Screen 200 ]
┌─────────────────────────────────────┐
│ MY_CONTAINER (Custom Container)     │
│  ┌─────────────────────────────┐    │
│  │ CL_GUI_HTML_VIEWER          │    │
│  │  → show_url(...) 호출 시    │    │
│  │  외부 페이지 / 사내 페이지  │    │
│  │  / 메모리 HTML 표시         │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘
        ↓ 사용자가 페이지 안 링크 클릭
NAVIGATE_COMPLETE 이벤트 발생 (URL importing)
        ↓
이벤트 핸들러 클래스 → URL 받아서 처리

핵심 객체 + 이벤트는 4개만 알면 끝.

요소 역할
CL_GUI_CUSTOM_CONTAINER SE51 Custom Control 을 잡는 컨테이너 (HTML Viewer 의 부모)
CL_GUI_HTML_VIEWER HTML 표시 컨트롤 본체
CNTL_SIMPLE_EVENTS 받을 이벤트 목록을 담는 테이블 타입
navigate_complete 페이지 로드 완료 이벤트 (URL 받아옴)

1단계 — 컨테이너 + HTML Viewer 생성

SE51 의 Screen 200 에 Custom Control CCONT 한 개 배치. PBO 모듈에서 컨테이너 + HTML Viewer 두 객체 생성.

DATA : html_control TYPE REF TO cl_gui_html_viewer,
       my_container TYPE REF TO cl_gui_custom_container.

* 컨테이너
CREATE OBJECT my_container
  EXPORTING container_name = 'CCONT'.

* HTML Viewer
CREATE OBJECT html_control
  EXPORTING parent = my_container.

CL_GUI_HTML_VIEWER 의 생성자는 parent 만 받으면 끝. 다른 옵션(saphtmlp = 'X' 등) 은 SAP 내부 HTML 처리용으로 보통 비워둡니다.


2단계 — URL 표시 (가장 간단)

외부 URL 을 띄우는 게 가장 짧은 패턴. show_url 한 줄.

html_control->show_url(
  EXPORTING
    url      = 'https://help.sap.com'
    in_place = abap_true ).      " 같은 컨트롤 안에 표시 (외부 브라우저 X)

in_place = abap_true 가 없으면 SAP GUI 의 디폴트 브라우저(Internet Explorer 등) 가 별창으로 열립니다. HTML Viewer 컨트롤 안에 표시하려면 필수.

사내 포털·SharePoint·매뉴얼 페이지 등 어떤 URL이든 OK. 단, SAP GUI 가 호스트 PC 의 브라우저 엔진(IE Webview / Edge Webview2) 을 호출하는 구조라 일부 최신 JS·SVG 기능은 호환성 이슈가 있을 수 있습니다.


3단계 — 메모리 HTML 표시 (동적 컨텐츠)

ABAP 에서 만든 HTML 문자열을 직접 표시하려면 load_data 로 메모리에 올린 뒤 받은 URL 로 show_url 합니다.

DATA : lt_html TYPE STANDARD TABLE OF w3html,
       lv_url  TYPE c LENGTH 200.

* HTML 라인 채우기
APPEND '<html><head><title>SAP Report</title></head>' TO lt_html.
APPEND '<body style="font-family:Arial">'             TO lt_html.
APPEND '<h1 style="color:#4338ca">조회 결과</h1>'      TO lt_html.
APPEND '<p>SFLIGHT 항공편 조회 완료</p>'              TO lt_html.
APPEND '</body></html>'                              TO lt_html.

* 메모리에 로드 → URL 받기
html_control->load_data(
  IMPORTING
    assigned_url = lv_url
  CHANGING
    data_table   = lt_html ).

* 받은 URL 로 표시
html_control->show_url( url = lv_url ).

load_data 가 임시 캐시 URL(sap://...) 을 만들어 assigned_url 로 돌려주고, 그 URL 을 show_url 에 넘기는 흐름. ALV 결과나 동적 보고서를 HTML 로 깔끔하게 보여주고 싶을 때 유용합니다.


4단계 — MIME Repository 객체 표시

SE80 → MIME Repository 에 미리 업로드한 정적 HTML / 이미지 / CSS 를 표시할 때.

html_control->load_mime_object(
  EXPORTING
    object_id    = 'ZHELP_PAGE.HTM'             " MIME Repo 의 파일명
    object_url   = 'help.htm'
  IMPORTING
    assigned_url = lv_url
  EXCEPTIONS
    object_not_found = 1
    OTHERS           = 2 ).

html_control->show_url( url = lv_url ).

회사 표준 매뉴얼 페이지나 자주 안 바뀌는 안내 페이지를 SAP 안에 임베드할 때 자주 씁니다. DB 에 BLOB 저장하는 것보다 MIME Repo 가 운영·전송에 깔끔.


5단계 — 이벤트 핸들러 등록 (navigate_complete)

사용자가 페이지 안 링크를 클릭해 URL 이 바뀌면 navigate_complete 이벤트가 발생합니다. 핸들러 클래스로 받아서 클릭한 URL 을 ABAP 변수에 저장 가능.

핸들러 클래스 정의

CLASS cl_myevent_handler DEFINITION.
  PUBLIC SECTION.
    METHODS on_navigate_complete
      FOR EVENT navigate_complete OF cl_gui_html_viewer
      IMPORTING url.
ENDCLASS.

CLASS cl_myevent_handler IMPLEMENTATION.
  METHOD on_navigate_complete.
    evurl = url.        " 전역 변수에 URL 저장
  ENDMETHOD.
ENDCLASS.

DATA : evt_receiver TYPE REF TO cl_myevent_handler,
       evurl        TYPE c LENGTH 2048.

FOR EVENT navigate_complete OF cl_gui_html_viewer IMPORTING url 이 핵심 시그니처. URL 길이는 2048 자 정도 잡아두면 안전.

이벤트 등록 + 핸들러 연결

DATA : event TYPE cntl_simple_event,
       events TYPE cntl_simple_events.

event-eventid    = cl_gui_html_viewer=>m_id_navigate_complete.
event-appl_event = 'X'.                            " 애플리케이션 이벤트
APPEND event TO events.

html_control->set_registered_events(
  EXPORTING events = events ).

CREATE OBJECT evt_receiver.
SET HANDLER evt_receiver->on_navigate_complete FOR html_control.

cl_gui_html_viewer=>m_id_navigate_complete 가 이벤트 ID 상수. SIMPLE TREE 와 동일한 패턴 — appl_event = 'X' 박아야 ABAP 핸들러가 호출됩니다.


자주 빠뜨리는 함정

in_place 누락 — 외부 브라우저로 열림

in_place = abap_true 안 박으면 컨트롤 안이 아니라 별창(시스템 디폴트 브라우저) 으로 페이지가 떠 버립니다. HTML Viewer 안에 표시할 거면 무조건.

appl_event = 'X' 누락

이벤트 등록 시 appl_event = 'X' 빠뜨리면 시스템 이벤트로 처리되어 ABAP 핸들러가 호출되지 않습니다. SAP GUI 컨트롤 이벤트의 공통 함정.

load_data 의 W3HTML 길이

W3HTML 의 라인 길이는 보통 255 자. 한 줄에 긴 HTML 박지 말고 여러 라인으로 쪼개서 APPEND. 길어지면 줄이 잘려 표시 깨짐.

한글 인코딩

ABAP 에서 만든 HTML 에 한글이 들어가면 인코딩 헤더가 필요할 수 있습니다. <meta charset="UTF-8"><head> 안에 박아두는 게 안전. 운영 SAP 가 Unicode 가 아니면 EUC-KR 처리 필요.

URL 길이

이벤트로 받는 URL 은 1024~2048 자가 안전. 쿼리스트링이 긴 페이지(GET 파라미터 많음) 는 자릴 수 있으니 충분히 잡기.

CL_GUI_CUSTOM_CONTAINER 이름 — 대문자

SE51 의 Custom Control 이름과 코드의 container_name = 'CCONT'대문자 정확 일치. 소문자나 오타면 컨테이너가 안 잡혀서 HTML Viewer 가 빈 화면에 그려집니다.

detach_url_in_browser — 외부 브라우저 분리

컨트롤 안 페이지를 외부 브라우저로 띄우고 싶을 때 detach_url_in_browser 메소드 사용. 이때는 in_place 와 반대 동작이 됩니다.


전체 코드 — 복사용 통합본

화면(CALL SCREEN) 이 있는 모듈풀 구조라 SAP 스탠다드 INCLUDE 6분할(T / C / SCR / O / I / F). SE51 에서 Screen 200 + Custom Container CCONT + Flow Logic 에 status_0200 · set_html (PBO) · user_command_0200 (PAI).

*&---------------------------------------------------------------------*
*& Report ZRXX_ALV_HTML  (메인)
*&---------------------------------------------------------------------*
REPORT zrxx_alv_html.

INCLUDE zrxx_alv_html_t.     " TOP   - 전역 선언
INCLUDE zrxx_alv_html_c.     " CLASS - 이벤트 핸들러 클래스
INCLUDE zrxx_alv_html_scr.   " SCR   - 셀렉션 스크린 (사용 안 함)
INCLUDE zrxx_alv_html_o.     " PBO   - OUTPUT 모듈
INCLUDE zrxx_alv_html_i.     " PAI   - INPUT 모듈
INCLUDE zrxx_alv_html_f.     " FORM  - 서브루틴

START-OF-SELECTION.
  CALL SCREEN 200.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_T  (TOP)
*&---------------------------------------------------------------------*
DATA : html_control TYPE REF TO cl_gui_html_viewer,    " HTML Viewer
       my_container TYPE REF TO cl_gui_custom_container.

DATA : myevent_tab TYPE cntl_simple_events,
       evurl       TYPE c LENGTH 2048.                " 이벤트로 받은 URL

DATA : ok_code LIKE sy-ucomm.

DATA : evt_receiver TYPE REF TO cl_myevent_handler.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_C  (CLASS)
*&---------------------------------------------------------------------*
CLASS cl_myevent_handler DEFINITION.
  PUBLIC SECTION.
    METHODS on_navigate_complete
      FOR EVENT navigate_complete OF cl_gui_html_viewer
      IMPORTING url.
ENDCLASS.

CLASS cl_myevent_handler IMPLEMENTATION.
  METHOD on_navigate_complete.
    evurl = url.
  ENDMETHOD.
ENDCLASS.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_SCR  (SCR)
*&---------------------------------------------------------------------*
* (이 글에서는 셀렉션 스크린 사용 안 함)
* Screen 200 은 SE51 에서 정의 — Custom Container 이름 'CCONT'

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_O  (PBO)
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
  SET PF-STATUS 'S200'.
  SET TITLEBAR  'T200'.
ENDMODULE.

MODULE set_html OUTPUT.
  PERFORM create_html.
ENDMODULE.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_I  (PAI)
*&---------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
  CASE ok_code.
    WHEN 'BACK' OR 'EXIT' OR 'CANC'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_F  (FORM)
*&---------------------------------------------------------------------*
FORM create_html.
  CHECK html_control IS INITIAL.

* 1) 컨테이너 + HTML Viewer 생성
  CREATE OBJECT my_container
    EXPORTING container_name = 'CCONT'.

  CREATE OBJECT html_control
    EXPORTING parent = my_container.

* 2) 이벤트 등록 — navigate_complete
  DATA : event TYPE cntl_simple_event.

  event-eventid    = cl_gui_html_viewer=>m_id_navigate_complete.
  event-appl_event = 'X'.
  APPEND event TO myevent_tab.

  html_control->set_registered_events(
    EXPORTING events = myevent_tab ).

  CREATE OBJECT evt_receiver.
  SET HANDLER evt_receiver->on_navigate_complete FOR html_control.

* 3) URL 표시 (가장 간단한 패턴)
  html_control->show_url(
    EXPORTING
      url      = 'https://help.sap.com'
      in_place = abap_true ).

* (대안) 메모리 HTML 표시 패턴 — 아래 주석 풀어서 사용
*  DATA : lt_html TYPE STANDARD TABLE OF w3html,
*         lv_url  TYPE c LENGTH 200.
*
*  APPEND '<html><head><meta charset="UTF-8"></head>' TO lt_html.
*  APPEND '<body><h1>조회 결과</h1>'                  TO lt_html.
*  APPEND '<p>SFLIGHT 항공편 데이터</p>'              TO lt_html.
*  APPEND '</body></html>'                           TO lt_html.
*
*  html_control->load_data(
*    IMPORTING assigned_url = lv_url
*    CHANGING  data_table   = lt_html ).
*
*  html_control->show_url( url = lv_url ).
ENDFORM.


요약

단계 위치 핵심
1 컨테이너 + Viewer CL_GUI_CUSTOM_CONTAINER('CCONT') + CL_GUI_HTML_VIEWER
2 URL 표시 show_url( url = 'https://...' in_place = abap_true )
3 메모리 HTML load_data( CHANGING data_table )show_url( url = assigned_url )
4 MIME 객체 load_mime_object( object_id = 'ZHELP_PAGE.HTM' )show_url
5 이벤트 m_id_navigate_complete + appl_event='X' + set_registered_events + SET HANDLER

HTML Viewer 의 본질은 "SAP GUI 안의 임베디드 브라우저". URL 한 줄(show_url) 로 외부 페이지 띄우고, 메모리 HTML(load_data) 로 동적 컨텐츠, MIME(load_mime_object) 으로 정적 자산 — 세 갈래 패턴이 다입니다. 사용자 클릭 URL 추적은 navigate_complete 이벤트로. in_placeappl_event 두 옵션만 잘 챙기면 사내 포털 임베드부터 동적 HTML 리포트까지 깔끔하게 만들 수 있습니다.


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

CL_GUI_HTML_VIEWER · CL_GUI_CUSTOM_CONTAINER · 메소드(show_url·load_data·load_mime_object·set_registered_events·detach_url_in_browser) · 이벤트 ID m_id_navigate_complete · CNTL_SIMPLE_EVENT/CNTL_SIMPLE_EVENTS · W3HTML 타입은 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. HTML 렌더링 엔진은 SAP GUI 가 호스트 PC 의 브라우저 컨트롤(IE Webview / Edge Webview2) 을 호출하는 구조라 일부 최신 JS·CSS·SVG 기능 호환성 차이가 있을 수 있으니 실제 적용 시 운영 PC 환경에서 사전 테스트를 권장합니다. 외부 URL 호출 시 사내 보안 정책(프록시·방화벽) 확인 필요.