์ด ๊ธ์ ใClean ABAP – A Style Guide for Developersใ ์์ (written by Klaus Haeuptle, Florian Hoffmann, Rodrigo Jordão, Michel Martin, Anagha Ravinarayan, Kai Westerholz) ์ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์์ต๋๋ค. ํด๋น ๋ด์ฉ์ ์ข ๋ ์ฝ๊ณ ์ดํดํ ์ ์๋๋ก ์์ฝ/์ ๋ฆฌ ๋ฐ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ๋ถ์ฌ ์ฌ๊ตฌ์ฑํ ํฌ์คํ ์ ๋๋ค.
ABAP ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ฝ๋ ์์ ๋ฌธ์์ด์ ์ง์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ ๋ฉ์์ง๋ ํ ์คํธ ์ถ๋ ฅ ๋ฌธ๊ตฌ์ฒ๋ผ ๊ฐ๋ฐ์๊ฐ ์๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฒฝ์ฐ์ด๋ค. ABAP์์ ๋ฌธ์์ด(STRING)์ ํด๋ฆฐํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ์.
1. ๋ฌธ์์ด ๋ฆฌํฐ๋ด ์ฌ์ฉ - ' (์์๋ฐ์ดํ) vs ` (๋ฐฑํฑ)
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด๋ ์์ค ์ฝ๋ ๋ด์ ์ง์ ์ ๋ ฅํ ํ ์คํธ ๋ฌธ์๋ฅผ ๋งํ๋ค. ํ์ง๋ง ํ ์คํธ ๋ฌธ์๊ฐ ์ด๋ค ๊ธฐํธ๋ก ๊ฐ์ธ์ก๋๋์ ๋ฐ๋ผ ํ์ ๊ณผ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์๋ค.
๐ 'ํ ์คํธ' (์์๋ฐ์ดํ)
DATA text TYPE string.
text = 'Hello, Two ssun!'.
- ์์๋ฐ์ดํ ' '๋ CHAR(๋ฌธ์) ํ์ ๋ฆฌํฐ๋ด์ ์๋ฏธํจ
- STRING์ผ๋ก ์ ์ธํ ๋ณ์์ CHAR ๋ฌธ์๋ฅผ ์ ๋ ฅํ๋ ํํ
- CHAR ํ์ ์ ๊ณ ์ ๊ธธ์ด ๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ๋์ ๋ณ์๊ฐ STRING ํ์ ์ด๋ฉด ์๋ฌต์ ํ๋ณํ์ด ๋ฐ์
๐ `ํ ์คํธ` (๋ฐฑํฑ)
DATA text TYPE string.
text = `Hello, Two ssun!`.
- ๋ฐฑํฑ `์ STRING(๋ฌธ์์ด) ํ์ ๋ฆฌํฐ๋ด์ ์๋ฏธํจ
- STRING ํ์ ๋ณ์์ ๋ฃ์ ๋ ํ๋ณํ์ด ํ์ ์์ด ์์ ํ๊ฒ ๋ค์ด๊ฐ
2. โ ๏ธInline Declaration (์ธ๋ผ์ธ ์ ์ธ)์ ์ฃผ์์ฌํญ
DATA(log_message1) = 'Saved successfully'.
์ ์์๋ ์ธ๋ผ์ธ ์ ์ธ์ด์ด์ String(๋ฌธ์์ด) ํ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ค์ ๋ก ' (์์ ๋ฐ์ดํ)๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก, ํด๋น ๋ณ์๋ CHAR(๋ฌธ์) ํ์ ๋ฆฌํฐ๋ด ์ธ 18์๋ฆฌ ๊ณ ์ ์ผ๋ก ์ ์ธ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ท๋ถ๋ถ ๋ก์ง์์ ํด๋น ๋ณ์์ ๋ค๋ฅธ ๋ฉ์์ง๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฃ์์ ๋ ๋ฉ์์ง๊ฐ ๊ธธ์ด์ง๋ค๋ฉด 18์๋ฆฌ๋ก ์๋ ค์ ๋ณด์ผ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ธ๋ผ์ธ ์ ์ธ ์์ ๋ฐ๋์ ` (๋ฐฑํฑ)์ ์ฌ์ฉํด STRING ํ์ ์ผ๋ก ์ ํํ ์ง์ ํ๋๋ก ํ์.
DATA(log_message2) = `Saved successfully`.
3. ๊ณ ์ ํ ์คํธ๋ฉด ์์๋ฅผ ํ์ฉํ์.
๋ณํ์ง ์๋ ๋ฌธ์์ด์ด๋ผ๋ฉด, CONSTANTS ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์๋๋ฅผ ๋ช ํํ ํํํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฌ๋ฉด ์ฝ๋์ ์๋ฏธ๋ ๋ ๋ช ํํด์ง๊ณ ์ ์ง๋ณด์ ์ ์ค์๋ ์ค์ด๋ค๊ฒ ๋๋ค.
CONSTANTS success_message TYPE string VALUE `Saved successfully`.
4. String Interpolation(๋ฌธ์์ด ๋ณด๊ฐ) - ํ์ดํ ๊ตฌ๋ฌธ( | | ) ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฐฉ์.
์ค๋ฌด์์๋ ๋๋ถ๋ถ์ ๋ฌธ์์ด์ ๊ทธ ๋ฉ์์ง, ์ค๋ฅ ์๋ต, ํ
์คํธ ๊ฒฐ๊ณผ ๋ฑ๊ณผ ๊ฐ์ด "๊ณ ์ ๋ ๋ฌธ๊ตฌ + ๋ณ์ ๊ฐ" ์ฒ๋ผ๋์ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด์ฒ๋ผ ์ ์ ์ธ ๋ฌธ์์ด๊ณผ ๋ณ์ ๊ฐ์ ์กฐํฉํ๋ ค๋ฉด, ๋ฌธ์์ด ๋ณด๊ฐ(string interpolation)์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ํจ์ฌ ์ ๋ฆฌํ๋ค.
DATA(order_message) = `Sales Order ` && l_vbeln && ` Created.'
์์ ์์ ๋ ๊ณผ๊ฑฐ์ ์์ฃผ ์ฌ์ฉ๋์๋ ๋ฐฉ์์ผ๋ก ๋ณ์์ "&&" ๋ ๋ฌธ์์ด์ ์กฐํฉํ ๋ ์ ์ฉํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์๋ค.
- ๋ฌธ์์ด์ ์์๊ณผ ๋์ด ์ด๋์ธ์ง, ๋ณ์๋ ์ด๋์ ์๋์ง ์ง๊ด์ ์ผ๋ก ํ์ ํ๊ธฐ ์ด๋ ค์
- ๋ณ์ ๊ฐ์๊ฐ ๋์ด๋๋ฉด ์ฝ๋๊ฐ ์ฝ๊ธฐ ์ด๋ ต๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ํ๋ค์ด์ง
DATA(order_message) = |Sales Order { l_vbeln } Created.|.
์์ ์์ ๋ new syntax์ ์๊ธด ํ์ดํ ๊ตฌ๋ฌธ " | | " ์ฌ์ฉํ ๋ฌธ์์ด ๋ณด๊ฐ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ๋ฌธ์์ด ํ๋ฆ ์์ ๋ณ์ ์์น๊ฐ ๋ช ํํ๊ฒ ๋ณด์ฌ ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ๋ฐ์ด๋จ
- ` (๋ฐฑํฑ) ์์ด๋ ๋ฐ๋ก STRING ํ์ ์ผ๋ก ์ธ์ํจ
- ๋ณ์์ ๋ด์ง ์๊ณ ๋ฐ๋ก ์ฆ์์์ ๋ฌธ์์ด ์์ฑ์ด ๊ฐ๋ฅํจ (ex. MESSAGE | Sales Order { l_vbeln } Created. | TYPE 'S'. )
โ ๏ธ ๋ณด๊ฐ๋ฒ์ ์ค์ง ๋ณ์๋ ํํ์์ด ํฌํจ๋ ๋๋ง ์ฌ์ฉํ์.
โ Bad Case
welcome_message = |Hello, Two ssun!|.
โ Good Case
welcome_message = `Hello, Two ssun!`.
๋ณ์ ๋๋ ํํ์ ์ฌ์ฉ์ด ์๋ ์ผ๋ฐ์ ์ธ ๊ณ ์ ๋ฌธ๊ตฌ๋ฅผ ๊ตณ์ด ํ์ดํ ๊ตฌ๋ฌธ | | ๋ฅผ ์ด์ฉํ ํ์๋ ์๋ค. ํด๋น ๋ฌธ๋ฒ์ ๋ฌธ์์ด ๋ณด๊ฐ์ ์ํ ๊ฒ์ด๋ฏ๋ก ` `๋ฐฑํฑ์ผ๋ก๋ ์ถฉ๋ถํ ์ ์ธ ๊ฐ๋ฅํ๋ค.
โ๏ธ ํ๋์ฝ๋ฉ ๋์ ๋ฉ์์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ์.
์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ฌธ์์ด์ ์ฝ๋์ ์ง์ ํ๋์ฝ๋ฉํ์ง ๋ง๊ณ , ๋ฉ์์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์ด ๋ฐฉ์์ ๋ค๊ตญ์ด ์ง์
( ๋ฒ์ญ ์์คํ
์ฐ๊ณ ), ์ค์ ๊ด๋ฆฌ, ์ ์ง๋ณด์ ์ฉ์ด์ฑ(์ฌ์ฌ์ฉ), ๋ฑ์ ์ฅ์ ์ด ์๋ค. ๋ํ ๋ณ์ ์๋ฆฌ( & )๋ฅผ ์ง์ ํ ์ ์์ด ๋ฌธ์์ด ๋ณด๊ฐ ์์ด๋ ์ํฉ๋ณ ๋ฉ์์ง๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ค.