λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

ABAP Implimentation (πŸ› οΈμ‹€λ¬΄)/Clean ABAP

ABAP Clean Code : λ³€μˆ˜μ™€ λ¦¬ν„°λŸ΄ - λ³€μˆ˜(Variables)

이 글은 γ€ŽClean ABAP – A Style Guide for Developers』 μ„œμ  (written by Klaus Haeuptle, Florian Hoffmann, Rodrigo Jordão, Michel Martin, Anagha Ravinarayan, Kai Westerholz) 을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ„ μ’€ 더 쉽고 이해할 수 μžˆλ„λ‘ μš”μ•½/정리 및 개인적인 μ˜κ²¬μ„ λΆ™μ—¬ μž¬κ΅¬μ„±ν•œ  ν¬μŠ€νŒ… μž…λ‹ˆλ‹€. 

 

 

λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” λ³€μˆ˜λŠ” 쀑간 κ²°κ³Όλ₯Ό μ €μž₯ν•˜κ³  μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•œ 핡심 μš”μ†Œμ΄λ‹€. 이 κΈ€μ—μ„œλŠ” ABAPμ—μ„œ λ³€μˆ˜ 선언을 μ–΄λ–»κ²Œ κΉ”λ”ν•˜κ²Œ ν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.


βœ… λ³€μˆ˜ 선언은 μ½”λ“œ 상단이 μ•„λ‹Œ μ‚¬μš©ν•˜λŠ” μœ„μΉ˜μ— μ„ μ–Έν•˜μž.

ABAPμ—μ„œλŠ” μ „ν†΅μ μœΌλ‘œ μ½”λ“œμ˜ 맨 μœ„μ— ν•„μš”ν•œ λ³€μˆ˜λ₯Ό 미리 μ„ μ–Έν–ˆμ—ˆλ‹€. 이 방법은 λͺ¨λ“  λ³€μˆ˜λ₯Ό ν•œλˆˆμ— λ³Ό 수 μžˆλ‹€λŠ” μž₯점과 μ½”λ“œκ°€ μ •λˆλœ λŠλ‚Œμ€ μžˆμ§€λ§Œ, μ½”λ“œκ°€ κΈΈμ–΄μ§€λ©΄ 이 λ³€μˆ˜κ°€ μ–΄λ””μ„œ μ–΄λ–»κ²Œ μ“°μ΄λŠ”μ§€ κΈ°μ–΅ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€λŠ” 단점이 μžˆλ‹€. μž₯κΈ°κ°„ μœ μ§€λ³΄μˆ˜λœ ν”„λ‘œκ·Έλž¨μ„ 보게되면  μ‚¬μš©ν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ“€μ΄ κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆλŠ” κ²½μš°λ„ μ’…μ’… 보게 λœλ‹€. 


βœ… 인라인 선언을 ν™œμš©ν•˜μž.

ABAP 7.40λΆ€ν„°λŠ” 인라인 λ³€μˆ˜ 선언이 λ„μž…λ˜μ—ˆλ‹€. 인라인 선언은 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ·Έ μžλ¦¬μ—μ„œ λ°”λ‘œ μ„ μ–Έν•˜λŠ” 방식이닀.

인라인 선언을 ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μž₯점이 μžˆλ‹€.

  • μ½”λ“œ 가독성 증가: μ½”λ“œμ˜ 흐름을 읽기 μ‰½κ²Œ λ§Œλ“ λ‹€.
  • λ³΅μž‘μ„± κ°μ†Œ: λ³€μˆ˜ νƒ€μž…μ„ 일일이 μ•Œμ§€ μ•Šμ•„λ„ λœλ‹€.
  • λΆˆν•„μš”ν•œ μ„ μ–Έ 제거: μ“°μ§€ μ•ŠλŠ” λ³€μˆ˜λ₯Ό 미리 μ„ μ–Έν•  ν•„μš”κ°€ μ—†λ‹€.
DATA lv_total TYPE i.
lv_total = 100.   "전톡 방식

DATA(lv_total) = 100.  "인라인 μ„ μ–Έ 방식

 

두 방식 λͺ¨λ‘ 같은 κ²°κ³Όλ₯Ό λ‚΄μ§€λ§Œ, 인라인 방식은 읽기 쉽고 μœ μ§€λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•˜λ‹€.


βœ… IF λ¬Έ 같은 λΆ„κΈ° 둜직 쀑간에 인라인을 μ„ μ–Έν•˜μ§€ 말자.

쑰건문 μ•ˆμ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ 가독성이 λ–¨μ–΄μ§€κ³ , 디버깅 μ‹œ ν˜Όλž€μ„ 쀄 수 μžˆλ‹€.

❌ Bad Case
IF condition = abap_true.
   DATA(result) = 'YES'.
ELSE.
   result = 'NO'. "
ENDIF.

βœ… Good Case
DATA(result) TYPE string.
IF condition = abap_true.
   result = 'YES'.
ELSE.
   result = 'NO'.
ENDIF.

βœ… 선언문을 무쑰건 λ¬Άμ§€( " : " Chaining ) 말자.

❌ Bad Case
DATA: lv_user_name TYPE string,
           lv_user_age TYPE i,
           lv_sales_order TYPE vbeln,
           lv_sum_total TYPE i.

βœ… Good Case
DATA: lv_user_name TYPE string,
           lv_user_age TYPE i.           
DATA lv_sales_order TYPE vbeln.
DATA lv_sum_total TYPE i.

 

보톡 선언문을 λ¬ΆλŠ” Chaining 방식은 μ •μ˜λœ λ³€μˆ˜λ“€μ΄ λ…Όλ¦¬μ μœΌλ‘œ 관련이 μžˆμ„μ‹œ μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ, 무쑰건 선언을 λ¬Άμ—ˆμ„ 경우 λ³€μˆ˜λ“€μ΄ κ΄€λ ¨λ˜μ–΄ μžˆλ‹€κ³  잘λͺ» 이해 ν•  수 있기 λ•Œλ¬Έμ—, μ›¬λ§Œν•˜λ©΄ κ°œλ³„μ μœΌλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹€.


βœ… LOOP μ•ˆμ—μ„œμ˜ λ³€μˆ˜ μ„ μ–Έ ASSIGNING FIELD-SYMBOL을 μ‚¬μš©ν•˜μž.

λ‹€μŒμ€ 전톡적인 ABAP 루프 방식이닀. LOOP INTOλŠ” ν…Œμ΄λΈ”μ—μ„œ ν•œ 쀄씩 μ½μ–΄μ˜€κ³ , 읽은 값을 λ³΅μ‚¬ν•΄μ„œ λ³€μˆ˜μ— λ‹΄κ²Œλœλ‹€. 사싀 ν•„μš” μ—†λŠ” 데이터 볡사가 μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯ μΈ‘λ©΄μ—μ„œ λΉ„νš¨μœ¨μ μ΄λ‹€. λ˜ν•œ 인터널 ν…Œμ΄λΈ”μ˜ 데이터 μˆ˜κ°€ 많고 컬럼 μˆ˜λ„ λ§Žμ„ 경우 LOOP의 μ„±λŠ₯μ €ν•˜κ°€ 생길 μˆ˜λ„ μžˆλ‹€. 

DATA lt_mara TYPE TABLE OF mara.
DATA ls_mara TYPE mara.
DATA lv_matnr TYPE mara-matnr.

LOOP AT lt_mara INTO ls_mara.
   "IF 쑰건절 
      lv_matnr = ls_mara-matnr.
ENDLOOP. 

 

μ΄λ²ˆμ—” ν΄λ¦°μ½”λ“œ 방식인 ASSIGNING FIELD-SYMBOL(<fs>)을 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ, 볡사 λŒ€μ‹  ν…Œμ΄λΈ”μ˜ ν•œ 쀄을 직접 μ°Έμ‘°ν•œλ‹€.

LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
   "IF 쑰건절 
      lv_matnr = <fs_mara>-matnr.
ENDLOOP. 
  • μ„±λŠ₯ ν–₯상: 볡사 없이 직접 μ°Έμ‘°ν•˜λ―€λ‘œ λΉ λ₯΄λ‹€. 
  • 데이터 λ³€κ²½ 용이: λ³„λ„μ˜ MODIFYꡬ문 없이 λ³€κ²½ 값이 λ°”λ‘œ λ°˜μ˜λœλ‹€.
  • 가독성 κ°œμ„ : λ³€μˆ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— μ‚¬μš©ν•˜μ—¬ 흐름이 μžμ—°μŠ€λŸ½λ‹€.
  • μœ μ§€λ³΄μˆ˜ 용이: ν•„μš”ν•œ κ³³μ—μ„œλ§Œ λ³€μˆ˜ μ„ μ–Έ, λΆˆν•„μš”ν•œ μ „μ—­ μ„ μ–Έ κ°μ†Œν•œλ‹€.