미션 DAY4 (워밍업 클럽 3기)

Kang Junhyeok·2025년 3월 7일

워밍업클럽3기

목록 보기
1/1

📌 Day 4: 코드 리팩토링 & SOLID 원칙 정리

이번 미션에서는 더 읽기 좋은 코드를 만들기 위해 기존 코드를 리팩토링하고, SOLID 원칙을 자기만의 언어로 정리하는 작업을 수행했다.


미션 수행 목표

🔹 1. 코드 리팩토링

  • [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 리팩토링
  • 코드의 가독성을 높이고, 유지보수를 쉽게 만들기

🔹 2. SOLID 원칙 정리

  • SOLID 원칙을 이해하고, 이를 나만의 언어로 정리

📌 1️⃣ 코드 리팩토링 과정

🕒 [Step 1] 기존 코드 분석

다음은 주어진 validateOrder 메서드의 기존 코드이다.

📌 기존 코드

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

🔍 분석 결과

  • getter를 직접 호출하는 부분이 많음 → 캡슐화를 해치고 있음
  • 부정 연산자(!, !=) 사용이 많음 → 코드의 직관성이 떨어짐
  • 중첩된 조건문이 많음 → 가독성이 낮음

🕒 [Step 2] 리팩토링 방향 설정

리팩토링 시 고려할 사항:
✔️ getter 사용을 최소화하기 위해 Order 내부에 메서드를 추가
✔️ 부정 연산자(!)를 제거하여 가독성을 높임
✔️ 불필요한 else 문을 제거하여 코드 흐름을 단순화


🕒 [Step 3] Order 클래스 개선

Order 클래스 내부에 필요한 메서드를 추가하여 객체 스스로 판단할 수 있도록 수정

📌 수정된 Order 클래스

import java.util.List;

public class Order {

  private final List<Integer> items;
  private final int totalPrice;
  private final int customer;

  public Order(List<Integer> items, int totalPrice, int customer) {
    this.items = items;
    this.totalPrice = totalPrice;
    this.customer = customer;
  }

  public boolean isEmpty() {
    return items.isEmpty();
  }

  public boolean hasCustomerInfo() {
    return customer != 0;
  }

  public boolean moreThanZeroTotalPrice() {
    return totalPrice > 0;
  }
}

🕒 [Step 4] 리팩토링된 validateOrder 메서드

리팩토링된 validateOrder더 직관적이고 읽기 쉬운 코드가 되었다.

📌 수정된 validateOrder 메서드

public class MissionDay4 {

  public boolean validateOrder(Order order) {
    if (order.isEmpty()) {
      log.info("주문 항목이 없습니다.");
      return false;
    }

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

    log.info("올바르지 않은 총 가격입니다.");
    return false;
  }
}


🔍 리팩토링 결과 정리

항목리팩토링 전리팩토링 후
getter 사용직접 호출 (order.getTotalPrice())Order 내부에서 메서드 제공 (order.moreThanZeroTotalPrice())
부정 연산자!order.hasCustomerInfo() 사용order.hasCustomerInfo()로 긍정 표현
조건문 구조중첩된 if-else 다수 포함단순한 if 구조로 개선
가독성흐름 파악이 어려움더 직관적인 코드

📌 2️⃣ SOLID 원칙 정리

SOLID 원칙은 객체 지향 프로그래밍에서 유지보수성과 확장성을 높이기 위한 설계 원칙이다.
아래는 내가 이해한 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: 읽기 좋은 코드를 작성하는 사고법
👩‍🏫 강사: 박우빈

0개의 댓글