🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

[3기] 워밍업 클럽-백엔드-code 1주차 발자국

추상

추상에 대해서 정말 면밀하게 배울 수 있었던 시간이었습니다.

저의 일상생활이 수많은 추상화로 이루어져 있다는 것을 알게 되었고, 그것을 코드로 옮겨졌을 뿐이구나라는 것을 알았습니다.

왜 Java 를 보고 계속 객체지향이라고 하는지 처음으로 와닿게 느꼈습니다.

강의를 들으면서 왜이렇게 이름 짓는 것이 고민이 됐고 어려웠는지...

이름을 짓는 것이 정말 중요한 일이었기 때문이구나 라는 것을 알았습니다.

그러면서 기존 제 코드들을 다 변경해보고 싶다는 열망이 들었는데요.

아니나 다를까 DAY4 과제로 주신 과제를 하면서 실전에 적용하는 것은 정말 다르다는 것을 알았습니다.

미션 회고

원본코드

  • 사용자가 생성한 '주문'이 유효한지를 검증하는 메서드. 

  • Order는 주문 객체이고, 필요하다면 Order에 추가적인 메서드를 만들어도 된다. (Order 내부의 구현을 구체적으로 할 필요는 없다.) 

  • 필요하다면 메서드를 추출할 수 있다.

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

리팩토링 코드

public boolean validateOrder(Order order) {
    if (order.hasEmptyItems()) {
	Log.ofEmptyItem();
	return false;
    }
	
    if (order.isInValidateTotalPrice()) {
	Log.ofInValidateTotalPrice();
	return false;
    }
	
    if (order.hasNotCustomerInfo())) {
	Log.ofhasNotCustomerInfo();
        return false;
    }
	
    return true;
}


public class Log() {
    private void showInfoLog(String logMessage) {
	log.info(logMessage);
    }
	
    public void ofEmptyItem() {
       showInfoLog("주문 항목이 없습니다.");
    }

    public void ofEmptyCustomerInfo(){
  	showInfoLog("사용자 정보가 없습니다.");
    }

    public void ofInValidatePrice() {
	showInfoLog("올바르지 않은 총 가격입니다.");
    }	
}
  1. order.getItems().size()

    1. 객체에게 폭력적인 방식이다

    2. order 에게 Item 이 있는지 없는지 확인하는 함수(order.hasEmptyItems())를 구현하여 함수를 통해 확인하도록 하였다.

  2. order.getTotalPrice()

    1. get 이 정말 쓸만 한가?

    2. totalPrice 값 자체를 쓴다면 getTotalPrice 가 필요하겠지만 현재는 totalPrice 값 자체보다 값이 있는지 없는지를 판단하는 것 같아서 totalPrice 가 올바르게 형성(0이상)되어 있는지 확인했다.

    3. (!!)그런데 지금 생각해보니 위의 Items 이 있는지, Price가 있는지 모두 장바구니 자체가 현재 유효한 내용을 담고 있는지에 대해서 한 것 같다. 그렇다면 '장바구니'가 유효한지 검사하는 함수를 하나 추상화해서 Items 가 있는지! 없다면 totalPrice 는 유효한지! 하고 true, false 를 반환해주는 함수를 구현했어도 괜찮았을 것 같다.

      1. 하지만 현재도 validOrder 에 함께 다 들어가야 하는 요소인지. valid장바구니 를 빼고 validOrder 에서는 장바구니가 유효한지, customerInfo 는 유효한지를 검사하는게 추상화가 적절하게 되는 것인지 잘 모르겠다...

  3. !order.hasCustomerInfo()

    1. 부정연산자가 들어갔다!

    2. 한번 더 이해한 것에 부정으로 생각해주어야 하기때문에 뇌의 메모리를 두번쓴다.

      1. Not 부정 연산자를 사용하여 뇌의 메모리를 적게 쓰도록 했다.

  4. LOG class

    1. log.info 를 사용하여 log를 남기고 있는데 같은 코드가 계속해서 반복해서 사용하고 있어서 info.log 에 메시지를 매개변수로 받을 수있도록 구현하였다.

    2. 그리고 Log 에 대한 것을 Log class 에 응집하고, 만약 메시지가 바뀌어도 Log class 에서 확인하고 변환하면 좋을 것 같아서 메시지 별로 함수를 만들었다.

회고

기존에 개발을 진행할때도 if 문에 대해서 작성한다고 했을때 너무 추상화한 것이 좋지 않다고 하여 객체에게 폭력을 많이 휘둘렀다. 지금보니 시야가 너무 좁은 상태로 코드를 작성했던 것 같다.

객체에게 친절하면서 추상화가 적절하게 되어 미래의 후손에게도 도움이 되는 코드를 작성하는데 한 발자국 내딛은 것 같아서 앞으로의 강의 수강이 더욱더 기대된다.

지금 이 마음을 잃지 않고 강의를 꼭꼭 소화시켜서 기존의 코드를 리팩토링 해야지!

댓글을 작성해보세요.

채널톡 아이콘