바로투입이력카드
SAP 게시판

정보·팁

Clean ABAP ⑧ 메서드 본문: 작게, 한 가지만, 빨리 실패하기

에이든ABAP 개발자운영자모듈 MMSD기타조회 2

3줄 요약

  • 메서드는 한 가지 일만, 20문장 미만으로, 가능하면 3~5문장으로 써요.

  • 정상 흐름과 오류 처리를 한 메서드에 섞지 않고, 입력 검증은 맨 앞에서 빨리 실패시켜요.

  • CHECK 는 메서드 맨 앞 이외에는 쓰지 않고, 쓴다면 RETURN 과의 차이를 알고 써요.

어떤 상황에서 쓰나요

한 화면에 다 안 들어오는 300줄짜리 FORM 이나 메서드를 열어 본 적이 있다면 이 장이 말하는 이상향이 비현실적으로 보일 수 있어요. 그래도 어떤 방향으로 쪼개야 하는지는 이 장이 알려 줘요. 이번 회는 메서드 본문 설계를 다뤄요.

핵심 내용

한 가지 일만 한다. 가이드는 메서드가 한 가지만 하는지 판단하는 목록을 줘요. 입력 파라미터가 적고, 불리언 파라미터가 없고, 출력이 하나고, 작고, 한 단계만 아래 추상화로 내려가고, 한 종류의 예외만 던지고, 의미 있는 메서드를 더 뽑을 수 없고, 문장을 의미 있게 구역으로 나눌 수 없으면 한 가지 일을 하는 거예요.

정상 흐름과 오류 처리를 같이 하지 않는다. 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

아직 댓글이 없어요.

정보·팁 목록전체 목록