워밍업 클럽 4기 - 백엔드 Day 4

  1. 읽기 좋은 코드로 리팩토링

AS - IS

public boolean validateOrder(Order order) {
    if (order.getItems().size() == 0) {
        log.info("주문 항목이 없습니다.");
        return false;
    } else {
        if (order.getTotalPrice() > 0) {
            if (!order.hasCustomerInfo()) {
                log.info("사용자 정보가 없습니다.");
                return false;
            } else {
                return true;
            }
        } else if (!(order.getTotalPrice() > 0)) {
            log.info("올바르지 않은 총 가격입니다.");
            return false;
        }
    }
    return true;
}

 

TO - BE

public void checkOrder(Order order) {
    if (order.isEmptyItems())
        throw new NoItemException("주문 항목이 없습니다.");

    if (order.isInvalidTotalPrice())
        throw new IllegalPriceException("올바르지 않은 총 가격입니다.");

    if (order.isEmptyCustomerInfo())
        throw new EmptyCustomerInfoException("사용자 정보가 없습니다.");
}

 

  1. Early Return

     

     

    else 없이 조건에 맞지 않으면 곧바로 throw → 코드 흐름이 일직선으로 이어져 가독성 향상

  2. Reduce Thinking Depth

     

     

    중첩된 if–else-if 구조를 모두 제거하고 검증 조건을 위에서 아래로 나열

     

    각 검증 블록이 독립적으로 동작하므로 머릿속으로 추적해야 할 깊이가 줄어듦

  3. Add New Line to Separate

     

     

    항목 검증, 가격 검증, 사용자 정보 검증 사이에 빈 줄을 넣어 관심사(검증 종류) 구분이 명확해짐

  4. Refactor Negative Phrase

     

     

    if (!(order.getTotalPrice() > 0)) → if (order.isInvalidTotalPrice()) 같은 긍정적 메서드명 사용

     

    조건 자체의 의미가 더 선명해짐

     

  5. Handle Exceptions More Carefully

     

     

    order == null 검사를 제일 앞에 추가해 예상치 못한 NullPointerException 방지

     

    외부에서 checkOrder(null) 호출 대비

  6. Tell, Don’t Ask

     

     

    order.getItems().size() == 0 대신 order.isEmptyItems()

     

    order.getTotalPrice() > 0 대신 order.hasValidTotalPrice()

     

    도메인 메서드로 추상화해 “명령(tell)” 식 호출로 바꿈

 

2. SOLID에 대하여 자기만의 언어로 정리해 봅시다.

 

  • 단일책임원칙

하나씩만 : 클래스는 한 가지 일만 맡아 수정 이유를 딱 하나로 제한한다.

 

  • 개방폐쇄원칙

더하기만 가능 : 코드 수정 없이 확장(새 기능 추가)만으로 변화에 대응할 수 있게 설계한다.

 

  • 리스코프치환원칙

누가 해도 가능 : 부모 대신 자식 객체를 넣어도 동일한 결과가 나와야 다형성이 안전하다.

 

  • 인터페이스분리원칙

꼭 필요한 것만 : 클라이언트가 쓰지 않는 메서드를 강요받지 않도록 작은 인터페이스로 나눈다.

 

  • 의존역전원칙

220v 이기만 하면 어떤 플러그든 가능 : 상위 로직은 구체 구현이 아닌 추상(인터페이스)에만 의존해, 구현 교체가 쉽다.

 

https://inf.run/AvGzg

댓글을 작성해보세요.

채널톡 아이콘