SAP ABAP 문법 정리 및 각 예제

SAP ABAP 문법 정리 및 각 예제

SAP ABAP 문법 정리: 초보자부터 숙련자도 참고 가능

SAP ABAP Programming

SAP 시스템은 전 세계 수많은 기업의 핵심 비즈니스 프로세스를 구동하는 강력한 솔루션입니다. 그리고 이 SAP 시스템의 심장부에는 바로 **ABAP(Advanced Business Application Programming)**이라는 독자적인 프로그래밍 언어가 있습니다. ABAP은 단순히 보고서를 생성하는 것을 넘어, 복잡한 비즈니스 로직 구현, 데이터베이스 상호작용, 사용자 인터페이스 개발 등 SAP 시스템의 거의 모든 영역을 제어할 수 있는 핵심 도구입니다.

이 글에서는 SAP ABAP 문법의 기본부터 심화까지 총정리하고, 각 주요 개념에 대한 실전 예제를 풍부하게 제공하여 ABAP 개발의 초석을 다질 수 있도록 돕고자 합니다. ABAP 개발에 입문하는 초보자부터 숙련된 개발자까지 모두에게 유용한 참고 자료가 될 것입니다.


1. ABAP, SAP의 핵심 언어 이해하기

ABAP 문법을 본격적으로 배우기 전에, ABAP이 무엇이며 왜 중요한지에 대한 이해는 필수적입니다.

1.1. ABAP의 역할과 중요성

SAP는 전사적 자원 관리(ERP)의 선두 주자이며, ABAP은 이러한 SAP 애플리케이션을 개발하고 확장하는 데 사용되는 4세대 언어(4GL)입니다. 처음에는 리포트 생성에 초점을 맞추었으나, 시간이 지나면서 객체 지향 프로그래밍(OOP) 기능을 포함하며 더욱 강력하고 유연한 언어로 발전했습니다.

  • SAP 시스템의 핵심: SAP ERP, S/4HANA 등 대부분의 SAP 애플리케이션은 ABAP으로 개발되어 있습니다.
  • 커스터마이징 및 확장: 기업의 고유한 비즈니스 요구사항을 반영하기 위한 커스터마이징(Customizing)이나 새로운 기능 개발(Enhancement)은 ABAP을 통해 이루어집니다.
  • 다양한 개발 영역: 보고서(Report), 사용자 인터페이스(Dynpro, Web Dynpro, Fiori), 데이터베이스 인터랙션, 모듈 간 연동(RFC), 객체 지향 개발 등 광범위한 영역에서 활용됩니다.

1.2. ABAP 문법 학습의 중요성

ABAP 문법을 정확히 이해하고 활용하는 것은 효율적이고 안정적인 SAP 개발을 위한 첫걸음입니다. 올바른 문법 사용은 코드의 가독성을 높이고, 잠재적인 오류를 줄이며, 시스템 성능을 최적화하는 데 기여합니다.


2. ABAP 기본 문법 요소

모든 프로그래밍 언어가 그렇듯, ABAP에도 데이터를 다루고 기본적인 연산을 수행하는 핵심 문법 요소들이 있습니다.

2.1. 주석 (Comments)

코드를 설명하거나 특정 부분을 비활성화할 때 사용합니다. ABAP에서는 두 가지 형태의 주석을 제공합니다.

  • 한 줄 주석: *로 시작하거나, "(쌍따옴표)로 시작합니다.
    * 이 줄은 전체가 주석입니다.
    WRITE: 'Hello World'. " 이 부분은 한 줄 주석입니다.
    
  • 블록 주석 (ABAP 7.40 이상): "#EC *로 시작하여 여러 줄을 주석 처리할 수 있습니다.
    "#EC Header
    "#EC This is a multi-line comment.
    "#EC It spans across several lines.
    

2.2. 변수 선언 및 데이터 타입 (DATA, TYPES)

ABAP에서 데이터를 저장하려면 변수를 선언해야 합니다. 변수는 DATA 키워드를 사용하며, TYPE 또는 LIKE 키워드를 통해 데이터 타입을 지정합니다.

  • 기본 데이터 타입:

    • C (Character): 문자열, 기본 길이 1.
    • N (Numeric Text): 숫자 문자열, 기본 길이 1.
    • I (Integer): 정수.
    • P (Packed Number): 팩형 숫자 (정밀한 소수점 처리에 유리).
    • F (Floating Point): 부동 소수점.
    • D (Date): 날짜 (YYYYMMDD).
    • T (Time): 시간 (HHMMSS).
    • X (Hexadecimal): 16진수.
    DATA: lv_char TYPE c LENGTH 10,  " 문자열 10자리
          lv_numc TYPE n LENGTH 5,   " 숫자 문자열 5자리
          lv_int  TYPE i,            " 정수
          lv_pack TYPE p DECIMALS 2, " 팩형 숫자, 소수점 2자리
          lv_date TYPE d,            " 날짜
          lv_time TYPE t.            " 시간
    
    lv_char = 'Hello ABAP'.
    lv_int = 100.
    lv_pack = '123.45'.
    lv_date = sy-datum. " 시스템 현재 날짜
    lv_time = sy-uzeit. " 시스템 현재 시간
    
    WRITE: / lv_char, / lv_int, / lv_pack, / lv_date, / lv_time.
    
  • 구조체 (Structure): 여러 필드를 묶어 하나의 논리적인 단위로 다룹니다. TYPES로 구조체 타입을 정의하고, DATA로 해당 타입의 변수를 선언합니다.

    TYPES: BEGIN OF ty_employee,
             emp_id   TYPE c LENGTH 8,
             emp_name TYPE c LENGTH 30,
             salary   TYPE p DECIMALS 2,
           END OF ty_employee.
    
    DATA: ls_employee TYPE ty_employee. " ty_employee 타입의 구조체 변수 선언
    
    ls_employee-emp_id   = 'EMP001'.
    ls_employee-emp_name = '김철수'.
    ls_employee-salary   = '50000.00'.
    
    WRITE: / ls_employee-emp_id, ls_employee-emp_name, ls_employee-salary.
    
  • 인터널 테이블 (Internal Table): 동일한 구조를 가진 여러 행의 데이터를 메모리에 저장하는 테이블입니다. 데이터베이스 테이블과 유사하게 사용되지만, 프로그램 내부에서만 유효합니다.

    TYPES: BEGIN OF ty_material,
             matnr TYPE matnr, " 자재 번호 (SAP 데이터 딕셔너리 타입)
             maktx TYPE maktx, " 자재 설명
             meins TYPE meins, " 단위
           END OF ty_material.
    
    DATA: lt_materials TYPE STANDARD TABLE OF ty_material WITH EMPTY KEY, " 인터널 테이블 선언
          ls_material  TYPE ty_material. " 인터널 테이블의 작업 영역 (Work Area)
    
    " 데이터 추가 예제
    ls_material-matnr = 'M001'.
    ls_material-maktx = '볼펜'.
    ls_material-meins = 'EA'.
    APPEND ls_material TO lt_materials.
    
    ls_material-matnr = 'M002'.
    ls_material-maktx = '노트'.
    ls_material-meins = 'EA'.
    APPEND ls_material TO lt_materials.
    
    " 인터널 테이블 출력 (LOOP AT 사용)
    LOOP AT lt_materials INTO ls_material.
      WRITE: / ls_material-matnr, ls_material-maktx, ls_material-meins.
    ENDLOOP.
    

2.3. 상수 선언 (CONSTANTS)

프로그램 실행 중 값이 변경되지 않는 고정된 값을 선언할 때 사용합니다.

CONSTANTS: gc_max_items TYPE i VALUE 100,
           gc_company_code TYPE c LENGTH 4 VALUE '1000'.

WRITE: / '최대 아이템 수:', gc_max_items,
       / '회사 코드:', gc_company_code.

2.4. 값 할당 및 연산

변수에 값을 할당하거나, 연산을 수행할 수 있습니다.

  • 값 할당: MOVE 또는 = 연산자를 사용합니다.
    DATA: lv_value1 TYPE i VALUE 10,
          lv_value2 TYPE i.
    
    lv_value2 = lv_value1. " lv_value1의 값을 lv_value2에 할당
    " MOVE lv_value1 TO lv_value2.  (동일한 의미)
    
    WRITE: / 'lv_value2:', lv_value2.
    
  • 수치 연산: +, -, *, / 등을 사용합니다.
    DATA: lv_a TYPE i VALUE 10,
          lv_b TYPE i VALUE 3,
          lv_result TYPE i.
    
    lv_result = lv_a + lv_b.  " 13
    lv_result = lv_a - lv_b.  " 7
    lv_result = lv_a * lv_b.  " 30
    lv_result = lv_a / lv_b.  " 3 (정수 나눗셈)
    WRITE: / '나눗셈 결과 (정수):', lv_result.
    
    DATA: lv_c TYPE p DECIMALS 2 VALUE '10.00',
          lv_d TYPE p DECIMALS 2 VALUE '3.00',
          lv_res_pack TYPE p DECIMALS 2.
    
    lv_res_pack = lv_c / lv_d. " 3.33 (정밀한 소수점 처리)
    WRITE: / '나눗셈 결과 (팩형):', lv_res_pack.
    
  • 문자열 조작: CONCATENATE, REPLACE, SHIFT, SPLIT 등 다양한 키워드를 사용합니다. & 연산자로 간단하게 문자열을 연결할 수도 있습니다.
    DATA: lv_str1 TYPE string VALUE 'ABAP',
          lv_str2 TYPE string VALUE 'Programming',
          lv_combined_str TYPE string.
    
    CONCATENATE lv_str1 ' ' lv_str2 INTO lv_combined_str.
    " lv_combined_str = lv_str1 && ' ' && lv_str2. (7.40 이상)
    WRITE: / lv_combined_str. " ABAP Programming
    
    REPLACE 'ABAP' WITH 'SAP ABAP' INTO lv_combined_str.
    WRITE: / lv_combined_str. " SAP ABAP Programming
    

3. ABAP 흐름 제어 문법 마스터하기

프로그램의 실행 흐름을 제어하는 문법은 모든 언어에서 중요합니다. ABAP에서도 조건문과 반복문이 핵심적인 역할을 합니다.

3.1. 조건문 (IF, CASE)

특정 조건에 따라 다른 코드를 실행할 때 사용합니다.

  • IF 문:

    DATA: lv_score TYPE i VALUE 85.
    
    IF lv_score >= 90.
      WRITE: / '학점: A'.
    ELSEIF lv_score >= 80.
      WRITE: / '학점: B'.
    ELSEIF lv_score >= 70.
      WRITE: / '학점: C'.
    ELSE.
      WRITE: / '학점: F'.
    ENDIF.
    
  • CASE 문: 여러 가지 가능한 값 중에서 하나를 선택하여 실행할 때 유용합니다.

    DATA: lv_day TYPE c LENGTH 3 VALUE 'MON'.
    
    CASE lv_day.
      WHEN 'MON'.
        WRITE: / '월요일'.
      WHEN 'TUE'.
        WRITE: / '화요일'.
      WHEN 'WED' OR 'THU'. " 여러 조건 동시 지정
        WRITE: / '수/목요일'.
      WHEN OTHERS. " 나머지 모든 경우
        WRITE: / '주말 또는 기타'.
    ENDCASE.
    

3.2. 반복문 (DO, WHILE, LOOP AT)

특정 코드를 여러 번 반복하여 실행할 때 사용합니다.

  • DO 문: 지정된 횟수만큼 반복합니다. sy-index는 현재 반복 횟수를 나타냅니다.

    DO 5 TIMES.
      WRITE: / '반복 횟수:', sy-index.
    ENDDO.
    
  • WHILE 문: 특정 조건이 참(TRUE)인 동안 반복합니다.

    DATA: lv_count TYPE i VALUE 1.
    
    WHILE lv_count <= 3.
      WRITE: / '현재 카운트:', lv_count.
      ADD 1 TO lv_count.
    ENDWHILE.
    
  • LOOP AT Internal Table: 인터널 테이블의 모든 행을 순회하며 처리할 때 사용합니다.

    " lt_materials와 ls_material은 위에서 선언된 것으로 가정
    DATA: lt_materials TYPE STANDARD TABLE OF ty_material WITH EMPTY KEY,
          ls_material  TYPE ty_material.
    
    ls_material-matnr = 'M001'. ls_material-maktx = '볼펜'. APPEND ls_material TO lt_materials.
    ls_material-matnr = 'M002'. ls_material-maktx = '노트'. APPEND ls_material TO lt_materials.
    ls_material-matnr = 'M003'. ls_material-maktx = '지우개'. APPEND ls_material TO lt_materials.
    
    WRITE: / '--- 모든 자재 목록 ---'.
    LOOP AT lt_materials INTO ls_material.
      WRITE: / ls_material-matnr, ls_material-maktx.
    ENDLOOP.
    
    " 특정 조건에 맞는 행만 처리
    WRITE: / '--- M002 자재 목록 ---'.
    LOOP AT lt_materials INTO ls_material WHERE matnr = 'M002'.
      WRITE: / ls_material-matnr, ls_material-maktx.
    ENDLOOP.
    
    " Assigning Field-Symbol (성능에 유리)
    FIELD-SYMBOLS: <fs_material> TYPE ty_material.
    WRITE: / '--- Field-Symbol을 이용한 자재 목록 ---'.
    LOOP AT lt_materials ASSIGNING <fs_material>.
      WRITE: / <fs_material>-matnr, <fs_material>-maktx.
    ENDLOOP.
    

4. 데이터베이스와 상호작용: Open SQL 문법

ABAP은 SAP 시스템의 데이터베이스(DB)와 직접 상호작용하기 위한 Open SQL이라는 특수한 SQL 방언을 제공합니다. 이를 통해 데이터를 조회, 삽입, 수정, 삭제할 수 있습니다.

4.1. SELECT 문 (데이터 조회)

데이터베이스 테이블에서 데이터를 읽어올 때 사용합니다.

DATA: BEGIN OF ls_mara, " MARA 테이블의 일부 필드를 위한 구조체
        matnr TYPE mara-matnr,
        maktx TYPE maktx, " MARA의 MATNR과 MAKT의 MAKTX
        meins TYPE mara-meins,
      END OF ls_mara.

DATA: lt_mara LIKE STANDARD TABLE OF ls_mara WITH EMPTY KEY. " 인터널 테이블

" 단일 행 조회
SELECT SINGLE matnr, meins
  FROM mara
  INTO ls_mara " 작업 영역으로 가져오기
  WHERE matnr = 'MAT_TEST_001'. " 특정 조건

IF sy-subrc = 0. " sy-subrc가 0이면 데이터가 성공적으로 조회됨
  WRITE: / '단일 자재:', ls_mara-matnr, ls_mara-meins.
ELSE.
  WRITE: / '해당 자재를 찾을 수 없습니다.'.
ENDIF.

" 여러 행 조회 (인터널 테이블로 가져오기)
SELECT matnr, meins
  FROM mara
  INTO TABLE lt_mara " 인터널 테이블로 가져오기
  UP TO 10 ROWS. " 최대 10개 행만 가져오기

IF sy-subrc = 0.
  WRITE: / '--- 여러 자재 목록 (MARA) ---'.
  LOOP AT lt_mara INTO ls_mara.
    WRITE: / ls_mara-matnr, ls_mara-meins.
  ENDLOOP.
ENDIF.

" JOIN 문 (두 테이블을 결합하여 조회)
DATA: BEGIN OF ls_material_info,
        matnr TYPE mara-matnr,
        maktx TYPE maktx, " 자재 설명
      END OF ls_material_info.
DATA: lt_material_info LIKE STANDARD TABLE OF ls_material_info WITH EMPTY KEY.

SELECT m~matnr, t~maktx
  FROM mara AS m
  INNER JOIN makt AS t ON m~matnr = t~matnr
  INTO TABLE lt_material_info
  UP TO 5 ROWS.

IF sy-subrc = 0.
  WRITE: / '--- JOIN을 이용한 자재 정보 ---'.
  LOOP AT lt_material_info INTO ls_material_info.
    WRITE: / ls_material_info-matnr, ls_material_info-maktx.
  ENDLOOP.
ENDIF.

4.2. INSERT/UPDATE/DELETE (데이터 조작)

데이터베이스 테이블의 데이터를 변경할 때 사용합니다.

  • INSERT: 새로운 데이터를 삽입합니다.
    DATA: BEGIN OF ls_ztest_table,
            id   TYPE i,
            text TYPE c LENGTH 50,
          END OF ls_ztest_table.
    
    " (가상의 Z 테이블 생성 필요: ZTEST_TABLE)
    ls_ztest_table-id = 1.
    ls_ztest_table-text = '첫 번째 레코드'.
    INSERT ztest_table FROM ls_ztest_table. " 단일 행 삽입
    
    ls_ztest_table-id = 2.
    ls_ztest_table-text = '두 번째 레코드'.
    INSERT ztest_table FROM ls_ztest_table.
    
    IF sy-subrc = 0.
      WRITE: / '데이터 삽입 성공!'.
      COMMIT WORK. " 변경사항 커밋
    ELSE.
      WRITE: / '데이터 삽입 실패!'.
      ROLLBACK WORK. " 변경사항 롤백
    ENDIF.
    
  • UPDATE: 기존 데이터를 수정합니다.
    ls_ztest_table-id = 1.
    ls_ztest_table-text = '첫 번째 레코드 수정됨'.
    UPDATE ztest_table FROM ls_ztest_table. " WHERE 조건 없이 작업 영역으로 수정 (KEY 필드가 일치하는 행)
    
    " 또는 WHERE 조건을 사용하여 직접 수정
    " UPDATE ztest_table SET text = '새로운 텍스트' WHERE id = 1.
    
    IF sy-subrc = 0.
      WRITE: / '데이터 수정 성공!'.
      COMMIT WORK.
    ENDIF.
    
  • DELETE: 데이터를 삭제합니다.
    DELETE FROM ztest_table WHERE id = 2. " 특정 조건에 맞는 행 삭제
    
    IF sy-subrc = 0.
      WRITE: / '데이터 삭제 성공!'.
      COMMIT WORK.
    ENDIF.
    

5. 프로그램 구조화 및 재사용: 모듈화

잘 구조화된 프로그램은 유지보수가 용이하고 재사용성이 높습니다. ABAP은 이를 위해 다양한 모듈화 기법을 제공합니다.

5.1. FORM 루틴 (SUBROUTINES)

프로그램 내에서 특정 작업을 수행하는 작은 코드 블록입니다. 주로 한 프로그램 안에서만 재사용됩니다.

PERFORM calculate_sum USING 10 20 CHANGING gv_total.
WRITE: / '총합:', gv_total.

FORM calculate_sum USING iv_val1 TYPE i iv_val2 TYPE i
                   CHANGING cv_result TYPE i.
  cv_result = iv_val1 + iv_val2.
ENDFORM.

5.2. FUNCTION MODULES (함수 모듈)

전역적으로 재사용 가능한 코드 블록입니다. SAP 시스템 전체에서 호출될 수 있으며, 명확한 인터페이스(Importing, Exporting, Changing, Tables, Exceptions)를 가집니다. 트랜잭션 코드 SE37에서 생성하고 관리합니다.

" (SE37에서 생성된 함수 모듈 'Z_CALCULATE_ADDITION' 호출 예시)
DATA: lv_number1 TYPE i VALUE 50,
      lv_number2 TYPE i VALUE 30,
      lv_sum     TYPE i.

CALL FUNCTION 'Z_CALCULATE_ADDITION' " 실제 함수 모듈 이름
  EXPORTING
    iv_number1 = lv_number1
    iv_number2 = lv_number2
  IMPORTING
    ev_sum     = lv_sum
  EXCEPTIONS
    others     = 1.

IF sy-subrc = 0.
  WRITE: / '함수 모듈 결과 (합계):', lv_sum.
ELSE.
  WRITE: / '함수 모듈 호출 실패!'.
ENDIF.

" (Z_CALCULATE_ADDITION 함수 모듈의 내부 로직은 대략 다음과 같을 수 있음)
FUNCTION Z_CALCULATE_ADDITION.
*" IMPORTING
*"   VALUE(IV_NUMBER1) TYPE I
*"   VALUE(IV_NUMBER2) TYPE I
*" EXPORTING
*"   VALUE(EV_SUM) TYPE I
  EV_SUM = IV_NUMBER1 + IV_NUMBER2.
ENDFUNCTION.

5.3. CLASS 및 METHODS (OO ABAP)

ABAP 4.6부터 도입된 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 기능입니다. 데이터를 캡슐화하고 재사용성을 극대화하여 복잡한 애플리케이션 개발에 적합합니다.

" 클래스 정의 (Class Definition)
CLASS lcl_calculator DEFINITION.
  PUBLIC SECTION.
    METHODS: add
      IMPORTING
        iv_num1 TYPE i
        iv_num2 TYPE i
      EXPORTING
        ev_result TYPE i.
ENDCLASS.

" 클래스 구현 (Class Implementation)
CLASS lcl_calculator IMPLEMENTATION.
  METHOD add.
    ev_result = iv_num1 + iv_num2.
  ENDMETHOD.
ENDCLASS.

" 객체 생성 및 메소드 호출
DATA: lo_calc    TYPE REF TO lcl_calculator,
      lv_result  TYPE i.

CREATE OBJECT lo_calc. " 계산기 객체 생성

CALL METHOD lo_calc->add
  EXPORTING
    iv_num1 = 100
    iv_num2 = 200
  IMPORTING
    ev_result = lv_result.

WRITE: / '객체 지향 결과 (합계):', lv_result.

6. Internal Table 활용법

ABAP에서 인터널 테이블은 프로그램 내에서 데이터를 효율적으로 처리하는 데 필수적인 요소입니다. 선언, 데이터 추가, 수정, 삭제, 조회 등 다양한 조작이 가능합니다.

6.1. Internal Table 선언 및 조작

위에서 TYPESDATA를 이용한 선언을 다루었으므로, 여기서는 주요 조작 키워드에 집중합니다.

  • APPEND: 인터널 테이블의 마지막에 행을 추가합니다.

    APPEND ls_material TO lt_materials.
    
  • INSERT: 특정 위치나 특정 조건에 따라 행을 삽입합니다.

    " 첫 번째 위치에 삽입
    INSERT ls_material INTO lt_materials INDEX 1.
    
    " 특정 키 값의 위치에 삽입 (Sorted Table, Hashed Table)
    " INSERT ls_material INTO TABLE lt_materials.
    
  • MODIFY: 기존 행의 내용을 변경합니다.

    " ls_material에 M001의 새로운 데이터가 있다고 가정
    ls_material-matnr = 'M001'.
    ls_material-maktx = '새로운 볼펜 설명'.
    MODIFY TABLE lt_materials FROM ls_material. " KEY 필드(matnr)를 기반으로 수정
    " MODIFY lt_materials FROM ls_material INDEX 1. " 특정 인덱스 행 수정
    
  • DELETE: 특정 행 또는 조건을 만족하는 행을 삭제합니다.

    DELETE TABLE lt_materials FROM ls_material. " KEY 필드(matnr)를 기반으로 삭제
    DELETE lt_materials INDEX 2. " 두 번째 행 삭제
    DELETE lt_materials WHERE matnr = 'M003'. " 조건에 맞는 모든 행 삭제
    
  • READ TABLE: 인터널 테이블에서 특정 행을 조회합니다.

    DATA: ls_found_material TYPE ty_material.
    READ TABLE lt_materials INTO ls_found_material WITH KEY matnr = 'M001'.
    
    IF sy-subrc = 0.
      WRITE: / '찾은 자재:', ls_found_material-maktx.
    ELSE.
      WRITE: / '자재를 찾을 수 없습니다.'.
    ENDIF.
    
    " 인덱스를 이용한 조회
    READ TABLE lt_materials INTO ls_found_material INDEX 1.
    

7. 실전 ABAP 개발 팁 및 모범 사례

효율적이고 유지보수하기 쉬운 ABAP 코드를 작성하기 위한 몇 가지 팁입니다.

7.1. 가독성 높은 코드 작성

  • 일관된 들여쓰기: 코드를 블록별로 들여쓰기하여 가독성을 높입니다.
  • 의미 있는 변수명: lv_count (local variable), gs_data (global structure), lt_items (local table) 등 접두어를 사용하여 변수의 스코프와 타입을 명확히 합니다.
  • 적절한 주석: 복잡한 로직이나 비즈니스 규칙을 주석으로 설명하여 이해를 돕습니다.
  • 빈 줄 활용: 논리적인 코드 블록 사이에 빈 줄을 넣어 구분합니다.

7.2. 성능 최적화 고려

  • Open SQL 최적화:
    • SELECT * 대신 필요한 필드만 선택합니다 (SELECT field1 field2 ...).
    • WHERE 절을 사용하여 조회 범위를 최소화합니다.
    • FOR ALL ENTRIES를 사용하여 대량의 데이터를 효율적으로 조인합니다.
    • SELECT ... INTO CORRESPONDING FIELDS OF TABLE은 성능 저하를 일으킬 수 있으므로, 가능하면 INTO TABLEMOVE-CORRESPONDING을 사용하거나, 구조체 필드 순서를 맞춥니다.
  • 인터널 테이블 사용: 데이터베이스 접근 횟수를 줄이기 위해 필요한 데이터를 한 번에 가져와 인터널 테이블에 저장한 후, 프로그램 내부에서 처리합니다.
  • 불필요한 루프 최소화: LOOP AT 대신 READ TABLE이나 COLLECT, SUM 등을 사용하여 반복 횟수를 줄입니다.
  • 데이터 딕셔너리 활용: 가능한 경우 데이터 딕셔너리에 정의된 타입을 사용하여 안정성과 일관성을 확보합니다.

7.3. 오류 처리 (Error Handling)

  • MESSAGE 문: 사용자에게 정보를 제공하거나 오류를 알릴 때 사용합니다. MESSAGE E... (오류), MESSAGE W... (경고), MESSAGE I... (정보), MESSAGE S... (성공), MESSAGE A... (비정상 종료) 등의 타입이 있습니다.
  • SY-SUBRC 확인: Open SQL 문이나 함수 모듈 호출 후 sy-subrc 시스템 변수를 확인하여 성공 여부를 판단합니다.
  • 예외 처리 (Exceptions, TRY-CATCH): 객체 지향 ABAP에서는 TRY...CATCH...ENDTRY 블록을 사용하여 예외 상황을 처리합니다.

7.4. ABAP 표준 따르기

  • SAP에서 제공하는 표준 개발 가이드라인을 따릅니다. 이는 코드의 일관성과 유지보수성을 높이는 데 중요합니다.
  1. 화면 개발 (UI/UX) 표준: SAP Fiori Design Guidelines

  2. 백엔드 로직 개발 (성능/보안): ABAP Programming Guidelines

  3. 클라우드 기반 개발: SAP Business Technology Platform (BTP) Development Guidelines

  • 새로운 ABAP 문법(예: ABAP 7.40+의 인라인 선언, 체이닝 등)을 적극 활용하여 코드를 간결하게 작성합니다.

8. 다른 사이트 참고 및 학습 자료

ABAP 개발은 지속적인 학습이 필요한 분야입니다. 아래와 같은 자료들을 참고하시면 더욱 깊이 있는 지식을 얻을 수 있습니다.

  • SAP Help Portal (help.sap.com): SAP의 공식 문서 저장소입니다. 가장 정확하고 최신 정보를 얻을 수 있습니다. ABAP Keyword Documentation 섹션을 적극 활용하세요.
  • SAP Community (community.sap.com): 전 세계 SAP 개발자들이 질문하고 답변하며 지식을 공유하는 커뮤니티입니다. 블로그 글, Q&A, 포럼 등 다양한 자료가 있습니다.
  • ABAP Academy (abapacademy.com) / Udemy / Coursera: 온라인 강좌 플랫폼에서 체계적인 ABAP 강의를 수강할 수 있습니다.

9. 결론 및 다음 단계

이 글을 통해 SAP ABAP 문법의 핵심 요소를 총정리하고 각 개념별 예제를 살펴보았습니다. 변수 선언, 조건문, 반복문, Open SQL, 모듈화, 그리고 객체 지향 ABAP까지, ABAP 개발의 전반적인 그림을 그리는 데 도움이 되었기를 바랍니다.

ABAP은 끊임없이 발전하고 있으며, 특히 SAP S/4HANA 시대에는 새로운 ABAP(ABAP for Cloud, ABAP RESTful Application Programming Model)이 강조되고 있습니다. 이 기본 문법을 탄탄히 다진 후, 최신 ABAP 트렌드와 기술에도 관심을 가지고 학습을 지속하는 것이 중요합니다.

이제 여러분의 ABAP 개발 여정을 시작할 때입니다! 이 글에서 다룬 내용들을 바탕으로 직접 코드를 작성하고 실행하며 ABAP의 매력에 빠져보세요. 궁금한 점이 있다면 언제든지 관련 커뮤니티나 학습 자료를 찾아보시기 바랍니다. 여러분의 성공적인 ABAP 개발을 응원합니다!


10. 최종 요약표: SAP ABAP 핵심 문법 정리

카테고리 핵심 키워드 설명 예제 (간략)
기본 요소 DATA 변수 선언 DATA lv_name TYPE c LENGTH 20.
TYPES 사용자 정의 타입 (구조체, 테이블) 정의 TYPES: BEGIN OF ty_s, f1 TYPE i, END OF ty_s.
CONSTANTS 상수 선언 CONSTANTS gc_pi TYPE p DECIMALS 2 VALUE '3.14'.
주석 (*, ") 코드 설명 또는 비활성화 * 주석 또는 WRITE 'A'. " 주석
= / MOVE 값 할당 lv_var2 = lv_var1.
흐름 제어 IF 조건에 따른 실행 (단일/복수 조건) IF lv_val > 10. ENDIF.
CASE 여러 선택지 중 하나 실행 CASE lv_status. WHEN 'A'. ENDCASE.
DO 지정된 횟수만큼 반복 DO 5 TIMES. ENDDO.
WHILE 조건이 참인 동안 반복 WHILE lv_count < 10. ENDWHILE.
LOOP AT 인터널 테이블 순회 LOOP AT lt_data INTO ls_data. ENDLOOP.
DB 상호작용 SELECT 데이터베이스에서 데이터 조회 SELECT * FROM mara INTO TABLE lt_mara.
INSERT 새 데이터 삽입 INSERT ztable FROM ls_data.
UPDATE 기존 데이터 수정 UPDATE ztable FROM ls_data.
DELETE 데이터 삭제 DELETE FROM ztable WHERE id = 1.
COMMIT WORK DB 변경사항 영구 저장 COMMIT WORK.
ROLLBACK WORK DB 변경사항 취소 ROLLBACK WORK.
모듈화 FORM 프로그램 내에서 재사용 가능한 서브루틴 PERFORM process_data.
FUNCTION 전역적으로 재사용 가능한 함수 모듈 CALL FUNCTION 'Z_MY_FUNC'.
CLASS / METHOD 객체 지향 프로그래밍 요소 (클래스 및 메소드) CLASS lcl_obj DEFINITION. METHOD run. ENDMETHOD.
데이터 구조 STRUCTURE 서로 다른 타입의 필드를 묶음 TYPES: BEGIN OF ty_s, ... END OF ty_s.
INTERNAL TABLE 동일한 구조의 데이터 행 집합 (메모리) DATA lt_data TYPE TABLE OF ty_s.
ITAB 조작 APPEND ITAB 마지막에 행 추가 APPEND ls_data TO lt_data.
INSERT ITAB 특정 위치에 행 삽입 INSERT ls_data INTO lt_data INDEX 1.
MODIFY ITAB 행 내용 수정 MODIFY TABLE lt_data FROM ls_data.
DELETE ITAB 행 삭제 DELETE lt_data WHERE field = 'X'.
READ TABLE ITAB 특정 행 조회 READ TABLE lt_data INTO ls_data WITH KEY field = 'A'.
시스템 변수 SY-SUBRC 이전 명령의 성공 여부 (0: 성공, 비0: 실패) IF sy-subrc = 0. ENDIF.
SY-DATUM 현재 시스템 날짜 lv_today = sy-datum.
SY-UZEIT 현재 시스템 시간 lv_now = sy-uzeit.

Image 3
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Image 4
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.