[개발지식] clean code - Early Return Pattern

Hyo Kyun Lee·2025년 1월 15일
0

개발지식

목록 보기
72/84

1. 개요

거의 모든 전산처리는 다양한 검증이나 유효성 확인 등의 과정을 거쳐 이루어진다.

나는 1차적인 클린코드 구성의 과정으로, DTO내 공통적인 검증 로직을 단일 책임 원칙화하여 각 서비스마다 중복되는 공통 검증(pk중복, 사용자 재직여부 체크 등)의 재사용성을 높이고 로직 구성을 간결화하였다.

그리고 2차적인 클린코드 구성 과정으로 Early Return Pattern을 도입하였다.

이에 대해 고민한 과정을 기록하기 위해 글을 남긴다.

2. Validation Return Pattern vs Early Return Pattern

검증과정이 복잡해진다면 그만큼 분기처리를 위해 for, switch, if 등을 사용해야 할 것이다.

하지만 분기처리가 많아질수록 유지보수성이 매우 낮아지고, 가독성이 떨어지며 중첩된 검증 과정이 많아지기에 성능적으로도 부정적인 영향을 미칠 수 있다.

이처럼 검증과정이 필요한 로직을 validation Return Pattern이라 일컫는데, 검증과정이 비대해진다면 로직을 파악하기가 그만큼 어려워 질 것이다. 사실 이 부분에 대해선 자료가 그리 많지는 않았다.

이를 개선한 클린코드의 접근 방법이 Early Return Pattern이다.

굳이 하나의 검증 과정을 묶으려 하지말고 별개로 나누어서 진행하며, 이를 거칠때마다 바로 exception을 처리하던가 return false 등으로 서비스 로직을 중지하는 방안이다.

만약 검증과정을 하나로 묶어서 처리하고자 한다면

public String returnStuff(SomeObject argument1, SomeObject argument2) {
    if (argument1.isValid()) {
        if (argument2.isValid()) {
            SomeObject otherVal1 = doSomeStuff(argument1, argument2)

            if (otherVal1.isValid()) {
                SomeObject otherVal2 = doAnotherStuff(otherVal1)

                if (otherVal2.isValid()) {
                    return "Stuff";
                } else {
                    throw new Exception();
                }
            } else {
                throw new Exception();
            }
        } else {
            throw new Exception();
        }
    } else {
        throw new Exception();
    }
}

코드의 비선형적인 흐름이 되어버리고 catch하지 못한 분기 로직이 발생할 수 있다.

if
if
if
do something
endif
endif
endif
endif

하지만 이를 중첩하지 않고 각각의 검증 과정을 별개로 두어 선형적이고 의미파악이 쉬운 구조로 변경할 수 있다.

public String returnStuff(SomeObject argument1, SomeObject argument2){
      if (!argument1.isValid()) {
            throw new Exception();
      }

      if (!argument2.isValid()) {
            throw new Exception();
      }

      SomeObject otherVal1 = doSomeStuff(argument1, argument2);

      if (!otherVal1.isValid()) {
            throw new Exception();
      }

      SomeObject otherVal2 = doAnotherStuff(otherVal1);

      if (!otherVal2.isValid()) {
            throw new Exception();
      }

      return "Stuff";
}

이는 내가 구성한 DTO 일급객체화와 매우 부합하였다.

DTO안에 검증과정을 구성하는데, 거기서도 공통적인 검증과정을 선형적으로 구성하였기에 Early Return Pattern과 객체지향을 적절히 활용한 구성이라는 생각이 들었다.

클린코드는 알면 알수록 재밌는것 같다.

3. 참고자료

https://woonys.tistory.com/m/209

0개의 댓글