inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

dohi
1

수정내역

과제

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

 1. 예외처리 버전 ( 다소 엄격 )

public boolean validateOrder(Order order) {
    
    if (order == null) {
       log.info("Order 객체가 null입니다.");
       return false;
    }

    try{
        validateOrderItemsExist(order);
        validateTotalPrice(order);
        validateCustomerInfoPresent(order);
        
        return true;
    }catch(IllegalArgumentException e) {
        log.info(e.getMessage());
        return false;
    }
    
}
public void validateOrderItemsExist(Order order) {
    if (order.getItems().size() == 0) { //order.getItems().isEmpty()도 고려
        throw new IllegalArgumentException("주문 항목이 없습니다.");
    }
}

public void validateTotalPrice(Order order){
    if((order.getTotalPrice() <= 0)){ 
         throw new IllegalArgumentException("올바르지 않은 총 가격입니다.");
    }
}


public void validateCustomerInfoPresent(Order order) { 
    if (!order.hasCustomerInfo()) {
        throw new IllegalArgumentException("주문에 사용자 정보가 필요합니다.");
    }
}

 2. 예외처리 미적용

public boolean validateOrder(Order order) {
    if (isOrderNull(order)) return false;
    if (isOrderItemsEmpty(order)) return false;
    if (isTotalPriceInvalid(order)) return false;
    if (isCustomerInfoMissing(order)) return false;

    return true;
}
public boolean isOrderNull(Order order) {
    if (order == null) {
       log.info("Order 객체가 null입니다.");
       return true;
    }
    return false;
}
public boolean isOrderItemsEmpty(Order order) {
    if (order.getItems().size() == 0) { //order.getItems().isEmpty()도 고려
        log.info("주문 항목이 없습니다.");
        return true;
    }
    return false;
}

public boolean isTotalPriceInvalid(Order order) {
    if((order.getTotalPrice() <= 0)){ 
        log.info("올바르지 않은 총 가격입니다.");
        return true;
    }
    return false;
}

public boolean isCustomerInfoMissing(Order order) {
    if (!order.hasCustomerInfo()) {
        log.info("사용자 정보가 없습니다.");
        return true;
    }
    return false;
}

  

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

 

1.  SRP - Single Responsibility Principle(단일 책임 원칙)

한 클래스는 딱 하나의 역할만 하자.

 

2.  OCP- Open/Closed Principle(개방/폐쇄 원칙)

기존 코드를 고치지 않고, 기능을 확장할 수 있어야 한다.

 

3.  LSP - Liskov Substitution Principle(리스코프 치환 원칙)

부모 타입을 사용하는 곳에 자식 타입을 써도 제대로 작동해야 한다.

 

4. ISP - Interface Segregation Principle(인터페이스 분리 원칙)

쓸데없는 인터페이스는 나눠서 큰 종합세트를 주지말고 작은 인터페이스 여러개가 좋다

5. DIP - Dependency Inversion Principle(의존 역전 원칙)

고수준 모듈은 저수준 모듈에 의존하지 말고, 추상(인터페이스)에 의존하자.

 


강의

Readable Code: 읽기 좋은 코드를 작성하는 사고법

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

답변 0