인프런 워밍업 클럽 2기 발자국 1주차

Keep (유지할 점)

  • 편안한 학습 환경: 강의가 부담 없이 진행되어 사고를 확장할 수 있는 좋은 기회가 되었다.

  • 사고 중심의 접근: 각 섹션에서 개념을 깊이 있게 생각하고 적용할 수 있도록 돕는 내용이 많았다. 특히, 추상화Early return 기법을 통해 코드 가독성을 높이는 방법을 배운 점이 유익했다.

  • 다양한 관점 공유: 워밍업 클럽을 통해 다양한 사람들의 문제 해결 방식과 의견을 공유할 수 있는 점이 큰 장점이었다.

Problem (문제점)

  • 체화의 어려움: 배운 내용을 실제로 체화하는 것이 어렵고, 마치 자주 사용하지 않는 단축키처럼 필요할 때만 떠오르게 되는 문제가 있었다. 예를 들어, SOLID 원칙을 실천하기 위한 방법이 즉각적으로 떠오르지 않을 수 있었다.

  • 정보의 과부하: 각 섹션에서 다룬 내용이 많아, 모든 개념을 동시에 소화하기에 다소 벅찼다. 특히, 객체 지향 패러다임상속, 조합의 복잡성을 이해하는 데 어려움이 있었다.

Try (시도해볼 점)

  • 지속적인 연습: 배운 개념들을 간단한 프로젝트나 기능을 통해 의도적으로 연습하고 체화하는 시간을 가져야겠다. 예를 들어, 일급 컬렉션Enum을 활용한 작은 프로젝트를 진행해보겠다.

  • 개념 요약 정리: 각 섹션의 핵심 개념을 요약하여 개인 노트를 만들어, 자주 복습할 수 있도록 하겠다. 특히 객체의 책임과 역할에 대한 부분을 명확히 정리할 예정이다.

     

미션 2. 코드 리팩토링

기존 코드

기존의 validateOrder 메서드는 여러 조건을 중첩된 if 문으로 처리하여 가독성이 떨어지고, 확장성이 낮았습니다.

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;
}

리팩토링한 코드

리팩토링 후, 각 검증 로직을 별도의 클래스로 분리하여 Single Responsibility Principle을 적용했습니다. 이를 통해 가독성과 유지 보수성을 향상시켰습니다.

public class Order {
    public boolean hasItems() {
        return this.getItems().size() != 0;
    }
}
public interface OrderValidator {
    boolean validate(Order order);
}
public class ItemValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.hasItems()) {
            return true;
        }
        log.info("주문 항목이 없습니다.");
        return false;
    }
}
public class PriceValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.getTotalPrice() > 0) {
            return true;
        }
        log.info("올바르지 않은 총 가격입니다.");
        return false;
    }
}
public class CustomerInfoValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.hasCustomerInfo()) {
            return true;
        }
        log.info("사용자 정보가 없습니다.");
        return false;
    }
}
public class OrderValidation {
    private final List<OrderValidator> validators;

    public OrderValidation(List<OrderValidator> validators) {
        this.validators = validators;
    }

    public boolean validateOrder(Order order) {
        for (OrderValidator validator : validators) {
            if (!validator.validate(order)) {
                return false;
            }
        }
        return true;
    }
}

이 리팩토링을 통해 각 검증 로직이 명확하게 분리되어, 새로운 검증 규칙을 추가하기 쉽고, 코드의 가독성을 높일 수 있었습니다. 각 클래스가 단일 책임을 가지므로 유지 보수성도 향상되었습니다.

댓글을 작성해보세요.

채널톡 아이콘