-
[Fiori] #14 데이터 요청과 처리 로직SAP/UI 2026. 2. 12. 08:58
데이터 요청 시 처리 흐름
- UI5에서 ODataModel의 CRUD 함수를 통해 요청을 보낸다.
- 각 함수에 따라 HTTP Method(GET, POST, PUT, DELETE)를 사용해 OData Service로 요청된다.
- 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_ENTITY2. 전체 조회
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_ENTITYOData 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