BTP

아직도 ABAP 혼자 짠다? — Joule 코파일럿으로 AI랑 같이 #shorts #SAP #Joule

SAP Joule 코파일럿이 ABAP 개발을 바꾸는 방식

SAP Joule은 SAP의 AI 어시스턴트로, ABAP Development Tools(ADT)에 통합되어 ABAP 코드를 생성, 설명, 리팩토링하는 기능을 제공합니다. 단순한 코드 완성을 넘어, 비즈니스 요구사항을 자연어로 설명하면 RAP 아티팩트, CDS View, 테스트 코드까지 생성합니다. 이 글은 Joule을 ABAP 개발 워크플로에 실제로 통합하는 방법을 다룹니다.

Joule ABAP 코파일럿 활성화 조건

-- 사전 조건 확인:
-- 1. SAP BTP ABAP Environment (ABAP Cloud) 또는
--    S/4HANA Cloud Public Edition
-- 2. SAP Build Code 또는 SAP Business Application Studio
-- 3. Joule for Developers 라이선스
-- 4. ADT 최신 버전 (Eclipse-based)

-- 활성화 방법:
-- BTP Cockpit → Subscriptions → SAP Build Code 구독
-- ADT에서 Joule 탭 활성화

자연어로 CDS View 생성 요청

-- Joule에게 요청하는 방식 (자연어):
-- "납품처별 월간 매출 합계와 이전 달 대비 증감율을 보여주는
--  CDS View를 만들어줘. 테이블은 zbtp_sales_doc, zbtp_customer 사용."

-- Joule이 생성하는 결과 (예시):
@AbapCatalog.sqlViewName: 'ZCI_MONTHLYSALES'
@Analytics.dataCategory: #CUBE
@EndUserText.label: '납품처별 월간 매출'
define view ZI_MonthlyCustomerSales
  as select from zbtp_sales_doc as Doc
    inner join zbtp_customer as Cust
      on Doc.customer_id = Cust.customer_id
{
  key Cust.customer_id,
      Cust.customer_name,
      YEAR(Doc.posting_date)  as posting_year,
      MONTH(Doc.posting_date) as posting_month,
      SUM(Doc.net_amount)     as monthly_revenue,
      CURRENCY(Doc.currency_code)
}
group by
  Cust.customer_id,
  Cust.customer_name,
  YEAR(Doc.posting_date),
  MONTH(Doc.posting_date),
  Doc.currency_code

Joule로 ABAP 클래스 리팩토링

-- 기존 코드를 Joule에게 설명 요청:
-- "이 ABAP 메서드를 더 읽기 쉽게 리팩토링해줘"

" 리팩토링 전 (Joule에 입력)
METHOD get_sales_data.
  DATA: lt_data TYPE STANDARD TABLE OF zbtp_sd,
        ls_data TYPE zbtp_sd.
  SELECT * FROM zbtp_sd WHERE bukrs = iv_bukrs INTO TABLE lt_data.
  LOOP AT lt_data INTO ls_data.
    IF ls_data-status = 'A' OR ls_data-status = 'B'.
      rv_total = rv_total + ls_data-amount.
    ENDIF.
  ENDLOOP.
ENDMETHOD.

" Joule가 제안하는 리팩토링 결과
METHOD get_sales_data.
  CONSTANTS:
    lc_status_active   TYPE char1 VALUE 'A',
    lc_status_pending  TYPE char1 VALUE 'B'.

  SELECT SUM( amount )
    FROM zbtp_sd
    WHERE company_code = @iv_bukrs
      AND status IN ( @lc_status_active, @lc_status_pending )
    INTO @rv_total.
ENDMETHOD.

RAP Behavior Definition 자동 생성

-- Joule 요청:
-- "SalesOrder 엔티티에 대한 RAP BDef를 만들어줘.
--  확정(confirm), 취소(cancel) 액션과 Draft 지원 포함."

-- Joule 생성 결과:
managed with additional save
  implementation in class zbp_r_sales_order unique;
with draft;

define behavior for ZR_SalesOrder alias SalesOrder
  persistent table zbtp_sales_order
  draft table zbtp_d_sales_order
  lock master total etag last_changed_at
  authorization master ( global )
  etag master last_changed_at
{
  create;
  update;
  delete;

  field ( readonly ) order_id;
  field ( mandatory ) customer_id, order_date, net_amount;

  action confirmOrder result [1] $self;
  action cancelOrder  parameter ZD_CancelParam result [1] $self;

  draft action Activate;
  draft action Discard;
  draft action Edit;
  draft action Resume;
  draft determine action Prepare;

  mapping for zbtp_sales_order corresponding;
}

ABAP Unit 테스트 자동 생성

-- Joule 요청:
-- "zcl_tax_calculator의 calculate_vat 메서드에 대한
--  ABAP Unit 테스트를 만들어줘. 0%, 10%, 20% 세율 케이스 포함."

-- Joule가 생성하는 테스트:
CLASS ltc_tax_calculator DEFINITION FOR TESTING
  RISK LEVEL HARMLESS DURATION SHORT.
  PRIVATE SECTION.
    DATA: mo_calc TYPE REF TO zcl_tax_calculator.
    METHODS: setup,
             test_zero_tax_rate    FOR TESTING,
             test_standard_tax     FOR TESTING,
             test_high_tax_rate    FOR TESTING.
ENDCLASS.

CLASS ltc_tax_calculator IMPLEMENTATION.
  METHOD setup.
    mo_calc = NEW zcl_tax_calculator( ).
  ENDMETHOD.

  METHOD test_zero_tax_rate.
    DATA(lv_vat) = mo_calc->calculate_vat(
      iv_amount   = '1000'
      iv_tax_rate = '0'
    ).
    cl_abap_unit_assert=>assert_equals(
      exp = '0'
      act = lv_vat
      msg = '세율 0%이면 VAT는 0이어야 함'
    ).
  ENDMETHOD.

  METHOD test_standard_tax.
    DATA(lv_vat) = mo_calc->calculate_vat(
      iv_amount   = '10000'
      iv_tax_rate = '10'
    ).
    cl_abap_unit_assert=>assert_equals(
      exp = '1000'
      act = lv_vat
      msg = '세율 10%이면 VAT는 1000이어야 함'
    ).
  ENDMETHOD.
ENDCLASS.

Joule 활용 팁

  • 요청은 구체적일수록 좋음: 테이블명, 필드명, 조건까지 명시
  • 생성된 코드는 반드시 검토 후 수정 — AI가 테이블 구조를 모를 수 있음
  • 복잡한 로직은 단계별로 분리해서 요청
  • 기존 코드 설명 요청으로 레거시 코드 이해에 활용
  • ATC 오류 메시지를 붙여넣고 수정 방법 요청 가능

공식 문서

SAP Joule for Developers 가이드는 SAP Joule Help Portal에서 확인하세요. ABAP 코파일럿 기능은 SAP Build Code 제품 페이지에서 상세히 다루어져 있습니다.

댓글 0

아직 댓글이 없습니다.