[SALV] 5탄: 이벤트 핸들링 (Double Click & Hotspot)

2026. 4. 7.
SAP ABAP SALV 시리즈 5탄. 리스트 조회 화면에서 더블 클릭(Double Click)과 핫스팟(Hotspot) 이벤트를 감지하여 특정 로직을 수행하는 이벤트 핸들링 가이드를 공유합니다. 로컬 클래스를 활용한 Observer 패턴 구현법을 정리했습니다..
CONTENTS: SALV 5탄 - 이벤트 핸들링

      1. 실무 적용 코드 예시 (Interactive SALV).

      
      " 1. 글로벌 데이터 선언 (클래스 내부에서도 참조할 수 있도록 상단에 선언)
      DATA: gt_flight TYPE TABLE OF sflight.
      " 2. 데이터 준비 (Standard 연습용 SFLIGHT 테이블 활용)
      SELECT * FROM sflight INTO TABLE gt_flight UP TO 50 ROWS.
      
      " --- [핵심] 3. 이벤트 수신을 위한 로컬 클래스 정의 ---
      " SALV는 이벤트를 처리하기 위해 별도의 핸들러 클래스가 필요합니다.
      CLASS lcl_event_handler DEFINITION.
        PUBLIC SECTION.
          METHODS:
            " 행을 더블 클릭했을 때 발생하는 이벤트
            on_double_click FOR EVENT double_click OF cl_salv_events_table
              IMPORTING row column,
            " 핫스팟(밑줄) 설정된 셀을 클릭했을 때 발생하는 이벤트
            on_link_click   FOR EVENT link_click   OF cl_salv_events_table
              IMPORTING row column.
      ENDCLASS.
      
      CLASS lcl_event_handler IMPLEMENTATION.
        METHOD on_double_click.
          " 선택된 행의 데이터를 읽어와서 메시지를 출력합니다.
          READ TABLE gt_flight INTO DATA(ls_row) INDEX row.
          IF sy-subrc = 0.
            MESSAGE |[Double Click] 항공사: { ls_row-carrid }, 항공편: { ls_row-connid }| TYPE 'I'.
          ENDIF.
        ENDMETHOD.
      
        METHOD on_link_click.
          " 클릭된 컬럼명을 인식하여 분기 처리가 가능합니다.
          MESSAGE |핫스팟 필드 '{ column }'이 클릭되었습니다.| TYPE 'S'.
        ENDMETHOD.
      ENDCLASS.
      
      START-OF-SELECTION.
      
      TRY.
          " 3. SALV 객체 생성
          cl_salv_table=>factory(
            IMPORTING r_salv_table = DATA(lo_alv)
            CHANGING  t_table      = gt_flight
          ).
      
          " 4. 특정 컬럼을 핫스팟(Hotspot) 필드로 지정
          " CARRID 컬럼을 클릭 가능한 링크 형태로 변경합니다.
          DATA(lo_columns) = lo_alv->get_columns( ).
          TRY.
              DATA(lo_col_carr) = CAST cl_salv_column_table( lo_columns->get_column( 'CARRID' ) ).
              lo_col_carr->set_cell_type( if_salv_c_cell_type=>hotspot ).
            CATCH cx_salv_not_found.
          ENDTRY.
      
          " --- [중요] 5. 이벤트 핸들러 인스턴스 생성 및 연결 ---
          DATA(lo_events)  = lo_alv->get_event( ).
          DATA(lo_handler) = NEW lcl_event_handler( ).
      
          SET HANDLER lo_handler->on_double_click FOR lo_events.
          SET HANDLER lo_handler->on_link_click   FOR lo_events.
      
          " 6. 화면 출력
          lo_alv->display( ).
      
        CATCH cx_salv_msg INTO DATA(lx_msg).
          MESSAGE lx_msg->get_text( ) TYPE 'E'.
      ENDTRY.
      

      2. 왜 이벤트 핸들링이 중요한가? (Business Insight)

      현업에서 ALV 리스트는 단순한 결과 보고서에 그치지 않습니다. 리스트를 보던 사용자가 특정 주문 번호를 눌렀을 때 해당 주문의 상세 화면으로 이동(Drill-down)하거나, 고객 코드 위를 클릭했을 때 고객 마스터 정보를 팝업으로 띄워주는 기능은 업무 효율성을 결정짓는 핵심 요소입니다. SALV의 이벤트 핸들링은 이러한 '대화형 인터페이스'를 구축하는 가장 표준적이고 깔끔한 방법입니다.

      3. 기술 상세 설명: Observer 패턴의 활용

      SALV에서 이벤트를 구현하는 방식은 디자인 패턴 중 하나인 옵저버 패턴(Observer Pattern)을 기반으로 합니다. 이는 객체의 상태 변화가 발생했을 때(사용자가 클릭했을 때), 이를 구독하고 있는 다른 객체에게 알림을 보내 로직을 수행하게 만드는 방식입니다.

      • 방송국(Subject): CL_SALV_EVENTS_TABLE 클래스입니다. 사용자의 클릭 이벤트를 방송합니다.
      • 수신기(Observer): 우리가 작성한 로컬 클래스인 lcl_event_handler입니다. 방송되는 신호를 수신하여 준비된 메서드를 실행합니다.
      • 연결(Connection): SET HANDLER 구문이 안테나 역할을 하여 방송국과 수신기를 이어줍니다.

      4. 실무 트러블슈팅 및 팁 (Troubleshooting)

      개발 과정에서 가장 자주 발생하는 실수와 해결 방안을 정리했습니다.

      현상 해결 방법 및 원인
      클릭해도 아무 반응이 없음 해당 컬럼에 set_cell_typehotspot으로 설정되었는지 확인하세요. 텍스트에 밑줄이 가야만 이벤트가 발생합니다.
      메서드 실행 시 덤프 발생 메서드 정의 시 파라미터 rowcolumn의 이름을 표준 정의와 동일하게 작성했는지 확인하십시오.

      5. 마치며

      이번 5탄에서는 단순 조회를 넘어 시스템과 사용자가 소통하는 인터랙티브 ALV의 기초를 다졌습니다. 이 개념을 응용하면 트랜잭션 이동, 팝업 메시지 송출, 동적 데이터 변경 등 무궁무진한 기능을 구현할 수 있습니다. 다음 6탄에서는 리스트에 화려한 색상을 입혀 시각적 직관성을 높이는 'Color 최적화' 방법을 알아보겠습니다.