워밍업 클럽 4기 - 백엔드 Day 4
읽기 좋은 코드로 리팩토링
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("사용자 정보가 없습니다.");
}
Early Return
else 없이 조건에 맞지 않으면 곧바로 throw → 코드 흐름이 일직선으로 이어져 가독성 향상
Reduce Thinking Depth
중첩된 if–else-if 구조를 모두 제거하고 검증 조건을 위에서 아래로 나열
각 검증 블록이 독립적으로 동작하므로 머릿속으로 추적해야 할 깊이가 줄어듦
Add New Line to Separate
항목 검증, 가격 검증, 사용자 정보 검증 사이에 빈 줄을 넣어 관심사(검증 종류) 구분이 명확해짐
Refactor Negative Phrase
if (!(order.getTotalPrice() > 0)) → if (order.isInvalidTotalPrice()) 같은 긍정적 메서드명 사용
조건 자체의 의미가 더 선명해짐
Handle Exceptions More Carefully
order == null 검사를 제일 앞에 추가해 예상치 못한 NullPointerException 방지
외부에서 checkOrder(null) 호출 대비
Tell, Don’t Ask
order.getItems().size() == 0 대신 order.isEmptyItems()
order.getTotalPrice() > 0 대신 order.hasValidTotalPrice()
도메인 메서드로 추상화해 “명령(tell)” 식 호출로 바꿈
2. SOLID에 대하여 자기만의 언어로 정리해 봅시다.
단일책임원칙
하나씩만 : 클래스는 한 가지 일만 맡아 수정 이유를 딱 하나로 제한한다.
개방폐쇄원칙
더하기만 가능 : 코드 수정 없이 확장(새 기능 추가)만으로 변화에 대응할 수 있게 설계한다.
리스코프치환원칙
누가 해도 가능 : 부모 대신 자식 객체를 넣어도 동일한 결과가 나와야 다형성이 안전하다.
인터페이스분리원칙
꼭 필요한 것만 : 클라이언트가 쓰지 않는 메서드를 강요받지 않도록 작은 인터페이스로 나눈다.
의존역전원칙
220v 이기만 하면 어떤 플러그든 가능 : 상위 로직은 구체 구현이 아닌 추상(인터페이스)에만 의존해, 구현 교체가 쉽다.
댓글을 작성해보세요.