워밍업 클럽 3기 BE 클린코드 2주차 발자국

워밍업 클럽 3기 BE 클린코드 2주차 발자국

2주차를 마무리하며...

2주 차에는 예제 코드의 리팩토링을 직접 해보는 과제와 중간 점검이 있었습니다.
강의를 보며 따라 할 때는 괜찮았지만, 막상 코드에서 리팩토링을 하려니 무엇부터 시작해야 할지 막막하더군요.
리팩토링은 강의만 본다고 해결되는 영역이 아니라는 것을 느꼈고, 체화되기까지 시간이 필요하겠다고 생각한 한 주였습니다.


강의내용 정리

  • 좋은 주석이란?

    • 주석이 많다는 것은 코드에 적절한 추상화를 적용하지 못해, 주석으로 코드를 설명하려는 것은 아닌지 의심해봐야 합니다.

    • 좋은 주석이란 코드로 전달할 수 없는 정보를 담는 것입니다.

      예를 들어, 의사 결정의 히스토리 같은 내용을 기록하는 것이 좋은 주석입니다.

    • 또한, 주석도 코드와 마찬가지로 버전 관리가 필요합니다. 관련된 의사 결정이 변경되었다면, 주석도 잊지 말고 함께 수정해야 합니다.

     

  • 변수와 메서드 나열

    • 변수는 사용하는 위치와 최대한 가까이 두어 뇌 메모리 부담을 줄이는 것이 좋습니다.

    • 메서드와 변수의 접근자 종류에 따라 위치를 정리할 수 있습니다.

    • 메서드는 접근자 종류뿐만 아니라, 중요도와 로직의 종류를 기준으로 배치하면 더 정리된 코드를 만들 수 있습니다.

     

  • 패키지 나누기

    • 패키지는 단순한 디렉터리가 아니라, 문맥적인 정보를 제공하는 역할을 합니다.

    • 적절하게 패키지를 나누면 코드의 가독성과 유지보수성이 향상됩니다.

       

       

  • IDE 활용하기

    • 정렬 단축키를 활용하여 코드 스타일을 통일합니다.

    • Linting & 스타일 도구를 사용하여 코드 품질을 높일 수 있습니다.

      • SonarLint

      • EditorConfig리팩토링 직접 해보기

리팩토링

  • 리팩토링에는 합리적인 이유가 필요하다

    • 리팩토링을 할 때는 단순히 코드 줄 수를 줄이는 것이 목표가 아니라, 객체의 역할과 책임을 올바르게 분배하고, 적절한 추상화를 적용하는지가 중요합니다. 이를 위해 리팩토링 과정에서 내가 합리적으로 수정하고 있는지 계속 의심하며 진행했습니다. (제가 정말 합리적으로 했는지는 모르겠습니다만...)

     

  • 리팩토링 순서 정하기

    • 처음 코드를 봤을 때, 어디서부터 손을 대야 할지 막막함을 느꼈습니다. 그래서 나름의 리팩토링 순서를 정하고 진행해보았습니다.

      1. 내가 읽기 좋은 코드로 변경하기

      2. 공백 추가하기 (가독성 개선)

      3. 함수 분리하여 추상화하기

      4. 테스트하기 쉬운 구조로 변경하기

      5. 역할과 책임을 고려하여 인터페이스와 객체로 분리하기

         

      6. 가독성 개선하기

      7. 패키지 분리하기

         

         

     

  • 리팩토링에는 정답이 없다

    리팩토링은 정해진 답이 없다는 점이 가장 어렵게 느껴지는 부분인 것 같습니다.

     

     

    중간점검

  • Day 4 미션 피드백

    • 아래는 제가 미션으로 제출한 코드입니다.

    • 이번 점검에 피드백으로 얻은 새로운 인사이트를 나열해봅니다.

      • 반환 타입이 boolean인 경우, 예외를 발생시키기 전에 해당 메서드의 사용 현황을 먼저 파악한 후, 상황에 맞게 리팩토링해야 한다.

      • 예외를 던지는 것은 비용이 많이 들 수 있으므로, 필요할 때만 신중하게 사용해야 한다.

         


    private static boolean VALID = true;

    public boolean validateOrder(Order order) {

        if (order.isItemEmpty()) {
            throw new AppException("주문 항목이 없습니다.");
        }

        if (order.isTotalPriceLessThenZero()){
            throw new AppException("올바르지 않은 총 가격입니다.");
        }

        if (order.hasNotCustomerInfo()) {
            throw new AppException("사용자 정보가 없습니다.");
        }

        return VALID;
    }
  • Day 7 미션 피드백

    • 물론 리뷰를 할 때, 말을 조심스럽게 해야할 테지만, 코드 리뷰의 목적은 다 같이 좋은 코드를 만들어 보자는 좋은 의미입니다.

      • 코드 리뷰를 할 때는 인격적인 모독을 하지 않는다.

      • 코드 리뷰를 받을 때는 코드와 나를 동일시 하지 않는다.

    • 배운 점 정리

       

      • 정적 메서드 팩토리를 만들 때는 생성자를 private으로 감춘다.

      • null 대신 Empty 객체를 만들어서 처리한다.

      • 단수/복수를 신경 써서 변수명과 메서드명을 짓는다.

      • 리팩토링에는 정답이 없다. 하지만, 효율적인 구조와 다양한 의견이 있다.


 

댓글을 작성해보세요.


채널톡 아이콘