[워밍업 클럽 백엔드 스터디2기] 1주차 발자국✏️

[워밍업 클럽 백엔드 스터디2기] 1주차 발자국✏️

강의 수강

강의 내용 요약

  • 추상과 구체

    • 추상 : 구체적인 정보들에서 중요한 특정 측면만을 뽑아낸다
      => 추상적 사고를 기반으로 이름 짓기

       

  • 잘 쓰여진 코드

    • 한 메서드의 주제는 반드시 하나로, 메서드 단위로 구체적인 내용을 추상화

    • Early Return

    • 사고의 depth 줄이기

  • 객체지향

    • 추상의 관점으로 바라보는 객체 지향

    • SOLID

    • 상속과 조합, 다형성, VO 등을 활용한 객체 지향 적용

       

학습 내용 회고

  • 코드를 다 따라치고 이해하고 정리하면서 강의를 들으려고 노력해서, 시간이 오래 걸렸지만 그만큼 학습에 집중한 것 같아서 좋았던 것 같다. 하지만 아직 진행중..

  • 진도를 중간에 놓쳐서 지연된 점이 좀 아쉽다는 생각이 든다.


미션

미션 내용

  1. 생각나는 추상과 구체의 예시 : 영화를 보는 과정을 구체 레벨에서 표현하기

    • 현재 상영 영화를 확인한다

    • 영화 시간표를 확인한다

    • 영화 예매와 결제를 한다

    • 영화시간에 맞춰 영화관을 간다

    • 영화관 좌석을 확인하여 앉는다

    • 영화를 본다

       

       

      단순히 '영화를 본다'를 구체 레벨로 과정을 통해 설명하는 부분에서 추상과 구체의 개념 정리를 할 수 있었다.

       

  1. 코드 리팩토링
    (원문)

    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 class Validate {
    
        public boolean validateOrder(Order order) {
            if (hasEmptyItems(order)) {
                log.info("주문 항목이 없습니다.");
                return false;
            }
            else { 
                return isTotalPriceOverZero(order) && hasCustomersInfo(order);
            }
        }
    
        public boolean hasEmptyItems(Order order) {
            return order.isEmptyItems();
        }
        
        public boolean isTotalPriceOverZero(Order order){
            if(order.isOverZeroPrice()) {
                return true;
            }
            else {
                log.info("올바르지 않은 총 가격입니다.");
                return false;
            }
        }
    
        public boolean hasCustomersInfo(Order order) {
            if (order.hasCustomerInfo()){
                return true;
            } else {
                log.info("사용자 정보가 없습니다.");
                return false;
            }
        }
        
    }

    처음 리팩터링 과제 진행할때 어려움이 있었는데, 강의 내용을 기반으로 최대한 메서드 단위로 부정어, 사고의 depth, Early Return을 고려해서 해결하고자 노력했다.

  2. SOLID

    • SRP : 단일 책임 원칙(Single responsibility principle)

      • 한 클래스는 하나의 책임만 가져야 한다.

         

    • OCP : 개방-폐쇄 원칙 (Open/closed principle)

      • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다

         

    • LSP : 리스코프 치환 원칙 (Liskov substitution principle)

      • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다

         

    • ISP : 인터페이스 분리 원칙 (Interface segregation principle)

      • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

         

    • DIP : 의존관계 역전 원칙 (Dependency inversion principle)

      • 의존 관계를 맺을 때, 변하기 쉬운 구체적인 것보다는 변하기 어려운 추상적인 것에 의존해야 한다.

     

    SOLID의 대한 개념은 항상 헷갈렸는데, 직접 본인만의 언어로 정리하려고 노력해서 이해하는데 도움이 된 것 같다.

미션 회고

  • 급하게 과제 목적으로 진행해서 놓친 부분이 많을 수도 있다는 생각에 아쉽다.

  • 그래도 강의 수강하고 진행해야하는 과제이기 때문에, 강의 내용을 정리하면서 더 잘 이해할 수 있는 과정을 같아서 좋았다.

댓글을 작성해보세요.

채널톡 아이콘