ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Fiori] #14 데이터 요청과 처리 로직
    SAP/UI 2026. 2. 12. 08:58

     

     

     

     

     

     

     

     

     

     

     

     

     

    데이터 요청 시 처리 흐름

    1. UI5에서 ODataModel의 CRUD 함수를 통해 요청을 보낸다.
    2. 각 함수에 따라 HTTP Method(GET, POST, PUT, DELETE)를 사용해 OData Service로 요청된다.
    3. OData Service에서는 요청에 대응되는 DPC 메서드가 호출되며, 재정의된 로직이 있을 경우 DPC_EXT의 구현 로직이 수행된다.

    데이터 조회

    UI5

    1. 단 건 조회

    let sPath = `/EntitySet(key1='${}',key2='${}')`;
    
    this._oModel.read(sPath, {
        urlParameters: {},
        filters: [],
        sorter: [],
        success: function (oReturn) {},
        error: function (oError) {)
    })

     

    2. 전체 조회

    let sPath = `/EntitySet`;
    
    this._oModel.read(sPath, {
        urlParameters: {},
        filters: [],
        sorter: [],
        success: function (oReturn) {},
        error: function (oError) {}
    })

    HTTP Method

    1. 단 건 조회

    GET /EntitySet(key1='',key2='')
    → *_GET_ENTITY

     

    2. 전체 조회

    GET /EntitySet
    → *_GET_ENTITYSET

    OData Service DPC_EXT 메서드

    1. 단 건 조회 (*_GET_ENTITY)

    METHOD employeeset_get_entity.
        DATA: ls_data TYPE ztempinfo_b20.
    
        "/EntitySet(key1='값1',key2='값2') "
        LOOP AT it_key_tab INTO DATA(ls_key).
          CASE ls_key-name. " 키 프로퍼티의 이름 (Entity 기준) "
            WHEN 'Empno'.
              ls_data-empno = ls_key-value.
            WHEN 'Projid'.
              ls_data-projid = ls_key-value.
            WHEN OTHERS.
          ENDCASE.
        ENDLOOP.
    
        SELECT SINGLE *
          FROM ztempinfo_b20
          INTO @DATA(ls_result)
          WHERE empno = @ls_data-empno
            AND projid = @ls_data-projid.
    
        IF sy-subrc = 0.
          MOVE-CORRESPONDING ls_result TO er_entity.
        ENDIF.
    ENDMETHOD.

     

    파라미터 설명

    • it_key_tab
      : EntitySet 요청 시 전달된 Key Property 정보를 담은 내부 테이블
    • er_entity
      : 단건 조회 결과를 반환하는 구조체

     

    2. 전체 조회 (*_GET_ENTITYSET)

    METHOD employeeset_get_entityset.
    *    IF iv_filter_string IS INITIAL.
    *      SELECT *
    *        FROM ztempinfo_b20
    *        INTO CORRESPONDING FIELDS OF TABLE et_entityset.
    *    ELSE.
    *      SELECT *
    *        FROM ztempinfo_b20
    *        INTO CORRESPONDING FIELDS OF TABLE et_entityset
    *        WHERE (iv_filter_string).
    *    ENDIF.
    
        DATA: lr_memo TYPE /iwbep/t_cod_select_options.
        DATA: lr_role TYPE /iwbep/t_cod_select_options.
        DATA: lr_projid TYPE /iwbep/t_cod_select_options.
    
        IF it_filter_select_options IS INITIAL.
          SELECT *
            FROM ztempinfo_b20
            INTO CORRESPONDING FIELDS OF TABLE et_entityset.
        ELSE.
    
          " 만약 필터 정보가 들어왔다면, 필터 적용 "
          LOOP AT it_filter_select_options INTO DATA(ls_filter).
            CASE ls_filter-property.
              WHEN 'Memo'.
                APPEND LINES OF ls_filter-select_options TO lr_memo.
              WHEN 'Role'.
                APPEND LINES OF ls_filter-select_options TO lr_role.
              WHEN 'Projid'.
                APPEND LINES OF ls_filter-select_options TO lr_projid.
              WHEN OTHERS.
            ENDCASE.
          ENDLOOP.
    
          SELECT *
            FROM ztempinfo_b20
            INTO CORRESPONDING FIELDS OF TABLE et_entityset
            WHERE memo IN lr_memo
              AND role IN lr_role
              AND projid IN lr_projid.
        ENDIF.
    
    ENDMETHOD.

    파라미터 설명

    • iv_filter_string
      : $filter 조건을 문자열 형태로 전달한 값 (자동 생성)
    • it_filter_select_options
      : $filter 조건을 ABAP SELECT-OPTIONS 형태로 변환한 구조
    • /iwbep/t_cod_select_options
      : OData 필터 조건을 표현하기 위한 Gateway 표준 타입
    • et_entityset
      : 전체 조회 결과를 반환하는 내부 테이블

    ※ iv_filter_string은 Gateway에서 자동 생성한 WHERE 조건 문자열이며,
    복잡한 필터 처리나 SQL Injection 방지를 위해 it_filter_select_options 방식이 더 권장된다.


    데이터 추가

    UI5

    this._oModel.create("/EntitySet", oJsonData, {
        success() {},
        error() {}
    });
    • oJsonData : HTTP Body에 담길 수정 데이터

     

    HTTP Method

    POST /EntitySet 
             + BODY
    → *_CREATE_ENTITY

     

    • HTTP Body에 생성할 데이터(JSON)가 포함됨
    • Key 값은 서버(DB)에서 생성하거나, Body로 전달받을 수 있음

     

     

    OData Service DPC_EXT 메서드

    METHOD employeeset_create_entity.
    * POST 요청을 통해 실제 DB Table에 데이터를 추가하는 과정
    * Body에 담긴 생성 데이터를 io_data_provider를 통해 가져옴
    * DB Table에 Insert 후, 처리 결과를 ER_ENTITY로 전달
    
        " Entity 구조와 DB Table 구조에 맞는 변수 각각 선언 "
        DATA: ls_entity TYPE zcl_zgwemp_b20_mpc=>ts_employee,
              ls_data   TYPE ztempinfo_b20.
    
        " es_data에 Reauest Body(JSON)정보가 들어옴. "
        io_data_provider->read_entry_data(
          IMPORTING es_data = ls_entity
        ).
        CHECK sy-subrc = 0.
        MOVE-CORRESPONDING ls_entity TO ls_data.
    
        * 실제 DB에 추가하기전, 데이터 작업 가능
        ls_data-memo = '이건 생성이야'.
    
        INSERT ztempinfo_b20 FROM ls_data.
        IF sy-subrc = 0.
          " ER_ENTITY에 결과를 반환 "
          MOVE-CORRESPONDING ls_entity TO er_entity.
        ENDIF.
    
    ENDMETHOD.

     파라미터 설명

     

    • io_data_provider
      : HTTP Body에 담긴 Request 데이터를 읽기 위한 객체
      : read_entry_data() 호출 시 JSON → ABAP Entity Structure 로 자동 매핑
    • zcl_zgwemp_b20_mpc=>ts_employee
      : MPC에서 정의된 Entity Type 구조
      : OData 요청/응답 기준 구조체
    • er_entity
      : Create 요청의 Response Body
      : 생성된 데이터(또는 Key 값)를 프론트(UI5)에 반환

    데이터 수정

    UI5

    let sPath = `/EntitySet(key1='${}',key2='${}')`;
    
    this._oModel.update(sPath, oJsonData, {
        success() {},
        error() {}
    });
    • oJsonData : HTTP Body에 담길 수정 데이터

     

    HTTP Method

    PUT /EntitySet(key1='', key2='') 
             + BODY
    → *_UPDATE_ENTITY

     

    • PUT : 전체 필드 수정
    • PATCH: 변경된 필드만 수정 (실무 권장)

     

    OData Service DPC_EXT 메서드

    METHOD employeeset_update_entity.
    *    PUT 요청을 통해서 실제 테이블에 데이터를 변경하는 과정
    *    BODY에 담긴 변경 대상 데이터를 io_data_provider로 얻어옴
    *    DB Update 진행
        DATA: ls_entity TYPE zcl_zgwemp_b20_mpc=>ts_employee,
              ls_data   TYPE ztempinfo_b20.
    
        io_data_provider->read_entry_data(
          IMPORTING es_data =  ls_entity
        ).
        SELECT SINGLE *
          FROM ztempinfo_b20
          INTO ls_data
          WHERE empno = ls_entity-empno
          AND projid = ls_entity-projid.
        IF sy-subrc = 0.
        *      만약, 별도의 DATA 세팅이 필요한 경우 여기서 작성
        *      ls_data-memo = '이건 변경이야.'
          ls_data-memo = ls_entity-memo.
          ls_data-assigndate = ls_entity-assigndate.
          ls_data-role = ls_entity-role.
    
          UPDATE ztempinfo_b20 FROM ls_data.
        ENDIF.
    ENDMETHOD.

    데이터 삭제

    UI5

    let sPath = `/EntitySet(key1='${}',key2='${}')`;
    
    this._oModel.remove(sPath, {
        success() {},
        error() {}
    });

     

    HTTP Method

    DELETE /EntitySet(key1='', key2='') 
                + BODY
    → *_DELETE_ENTITY

     

    OData Service DPC_EXT 메서드

    METHOD employeeset_delete_entity.
    *    DELETE 요청을 통해서 실제 테이블 데이터를 삭제할 수 있다.
    *    IT_KEY_TAB 파라미터에 들어온 값을 가지고 해당되는 데이터를 DB Table에서 삭제
    
    *    1. DB 테이블과 동일한 구조의 변수 선언
    	DATA: ls_data TYPE ztempinfo_b20.
    
    *    2. IT_KEY_TAB 파라미터에 들어온 값으로 변수에 키값 세팅
        LOOP AT it_key_tab INTO DATA(ls_key).
          CASE ls_key-name. " 키 프로퍼티의 이름 (Entity 기준) "
            WHEN 'Empno'.
              ls_data-empno = ls_key-value.
            WHEN 'Projid'.
              ls_data-projid = ls_key-value.
            WHEN OTHERS.
          ENDCASE.
        ENDLOOP.
    
        SELECT SINGLE *
          FROM ztempinfo_b20
          INTO @DATA(ls_result)
          WHERE empno = @ls_data-empno
            AND projid = @ls_data-projid.
    
    *    3. 변수에 해당되는 레코드를 DB Table에 삭제
    *       DELETE <db tab> FROM <structure>
    	DELETE ztempinfo_b20 FROM ls_result.
    
    *    실제 테스트. Body 없이 HTTP Method, URL만 구성
    *    => /EntitySet(key1='값', key2='값')
    ENDMETHOD.

    $expand 요청

     

    'SAP > UI' 카테고리의 다른 글

    [Fiori] #15 프로그램 배포  (0) 2026.02.12
    [Fiori] #13 UI5와 SAP GUI의 데이터 통신  (0) 2026.02.08
    [Fiori] #12 객체 접근 범위  (0) 2026.02.08
    [Fiori] #11 Table 컨트롤 + 데이터 바인딩  (0) 2026.02.04
    [Fiori] #10 Chart  (0) 2026.02.04
Designed by Tistory.