Clean ABAP ⑧ 메서드 본문: 작게, 한 가지만, 빨리 실패하기
3줄 요약
메서드는 한 가지 역할에 집중하도록 작게 나눠요. 3~5문장은 Clean ABAP이 제시하는 이상적인 목표예요.
입력은 실제 작업 전에 검사하고, 잘못된 입력이라면 비용이 큰 처리를 시작하기 전에 종료해요.
CHECK는 위치에 따라 동작이 달라요. 메서드를 종료하는 RETURN, 반복을 건너뛰는 CONTINUE와 구분해서 사용하세요.
어떤 상황에서 쓰나요
메서드가 길면 어디에서 입력을 검사하고 어떤 작업을 수행하는지 파악하기 어려워요. 이번 글에서는 한 메서드의 역할을 좁히고, 입력 검증을 앞에 두고, 복잡한 처리를 하위 메서드로 나누는 방법을 알아봐요.
잘못된 입력은 실제 작업을 시작하기 전에 걸러야 불필요한 처리를 줄일 수 있습니다. 아래 그림처럼 입력 검증을 앞에 두고, 정상 입력에 대해서만 작은 작업을 이어 갑니다.
핵심 내용
한 가지 일만 한다. 가이드는 메서드가 한 가지만 하는지 판단하는 목록을 줘요. 입력 파라미터가 적고, 불리언 파라미터가 없고, 출력이 하나고, 작고, 한 단계 낮은 수준의 작업을 호출하고, 한 종류의 예외를 중심으로 알리고, 의미 있는 메서드를 더 뽑을 수 없고, 문장을 의미 있게 구역으로 나눌 수 없으면 한 가지 일을 하는 거예요.
정상 흐름과 오류 처리를 같이 하지 않는다. append_xs 예시는 입력이 0보다 크면 반복하고, 0이면 예외, 음수면 다른 예외를 던지는 한 메서드를 보여 줘요. 이를 validate( input )을 먼저 부르는 형태나, 검증을 드러내고 실제 일은 append_xs_without_check에 맡기는 형태로 나눠요.
추상화 수준을 한 단계씩 내려간다. 한 메서드 안의 문장은 모두 같은 추상화 수준에 있어야 해요.
METHOD create_and_publish.
post = create_post( user_input ).
post->publish( ).
ENDMETHOD.to_upper( sy-uname ) 같은 낮은 수준과 publish 같은 높은 수준이 섞이면 안 돼요. 가이드가 알려 주는 판별법은 작성자가 코드를 보지 않고 이 메서드가 무엇을 하는지 짧게 설명하게 하는 거예요. 그가 번호를 붙여 말하는 항목들이 호출해야 할 하위 메서드(또는 실행할 문장)예요.
작게 쓴다. 20문장 미만, 이상적으로는 3~5문장이에요. DATA 선언만 스무 개가 넘는다면 이미 여러 일을 하고 있다는 신호예요. 크더라도 CASE로 값을 고르기만 하는 메서드처럼 한 가지 일에 집중한다면 괜찮고, 그런 경우에도 VALUE #( table[ ... ] OPTIONAL ) 같은 더 알맞은 패턴이 숨어 있는지 확인해 보라고 해요. 너무 잘게 쪼개면 호출 횟수가 늘어 성능에 영향이 있을 수 있다는 점(2회의 "성능" 항목)도 같이 말해요.
잘못된 입력은 작업 전에 걸러요. 검증은 가능한 한 일찍 해요. 생성 비용이 큰 객체를 만든 다음에야 입력에 문제가 있었음을 확인하면 자원도 낭비하고 이해하기도 어려워요.
METHOD do_something.
IF input IS INITIAL.
RAISE EXCEPTION NEW cx_sy_illegal_argument( ).
ENDIF.
DATA(massive_object) = build_expensive_object_from( input ).
result = massive_object->do_some_fancy_calculation( ).
ENDMETHOD.CHECK와 RETURN. 입력이 기대에 안 맞을 때 메서드를 빠져나가는 방법으로는 CHECK keys IS NOT INITIAL.이 더 짧지만, 조건이 틀렸을 때 무슨 일이 일어나는지 이름에서 드러나지 않아요. 풀어 쓴 IF ... RETURN. ENDIF.가 더 이해하기 쉽다고 봐요. 단일 반환 스타일(IF keys IS NOT INITIAL. ... ENDIF.)은 쓸데없는 중첩을 만든다고 안티패턴으로 봐요. 어느 쪽이든 "아무것도 안 돌려주는 것이 정말 맞는 동작인지"는 따져 보라고 해요. 빈 반환은 null 반환과 비슷해서 피해야 하고, 메서드는 채워진 반환값이나 예외 중 하나를 줘야 한다는 거예요.
다른 위치의 CHECK는 피한다. CHECK는 위치에 따라 동작이 달라요. 예를 들어 LOOP 안에서는 메서드나 루프를 끝내는 게 아니라 현재 반복만 건너뛰어요. 이럴 때는 IF와 CONTINUE를 사용하도록 권해요.
주의할 점
CHECK를 두고는 ABAP 프로그래밍 지침(메서드 맨 앞에서는CHECK를 권장)과 가이드의 선호가 다르고, 커뮤니티에서도 의견이 갈린다고 원문이 밝혀요. 팀 표준이 있으면 그것을 따르세요.3~5문장 기준은 이상적인 목표예요. 레거시 코드에는 한 번에 적용하기보다 수정하는 메서드부터 하나씩 쪼개는 쪽이 현실적이라고 저는 봐요(이 문장은 원문이 아니라 제 의견이에요).
원문은 2019년 첫 공개, 2025년 3월 마지막 수정본이에요. 이 글은 읽고 정리한 것이고, 예제를 직접 실행해 보지는 않았어요.
원문 주소: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#method-body
출처와 이용 안내
원문: Clean ABAP - Methods: Method Body, Control flow · 작성자 SAP SE and contributors SAP/styleguides · 작성일 2019-05-01 · 기준 릴리스 무관 · 확인일 2026-10-25
이 글은 위 원문을 읽고 한국어로 요약·재구성한 글이며 번역본이 아니에요. 원문의 저작권은 작성자와 SAP에 있어요.
원문은 CC BY 3.0 라이선스(https://creativecommons.org/licenses/by/3.0/)로 공개된 자료예요. 이 글은 내용을 한국어로 줄이고 순서를 바꾼 변경본이며, 원저작자가 이 글을 보증하지 않아요.
설정과 화면은 릴리스마다 달라요. 적용하기 전에 원문과 SAP Help Portal, 관련 SAP Note에서 최신 내용을 확인해 주세요.
SAP와 SAP 제품명은 SAP SE의 상표예요. 바로투입은 SAP와 관련이 없어요.
댓글 0
아직 댓글이 없어요.
로그인하고 댓글 쓰기