800===Dev Docs and License/Clean Code

파이썬 코드 리팩토링의 핵심 가이드 🎯

블로글러 2025. 1. 7. 21:23

안녕하세요! 오늘은 파이썬 코드 리팩토링의 핵심 원칙과 실전 테크닉에 대해 자세히 알아보겠습니다.

리팩토링이란? 🤔

리팩토링은 기존 코드의 동작은 유지하면서 내부 구조를 개선하는 과정입니다.
마치 집 안의 가구를 재배치하면서 더 효율적인 공간을 만드는 것과 같죠!

리팩토링의 주요 원칙 🌟

1. 코드 가독성 (Readability)

# 개선 전
def c(d):
    r = 0
    for i in d:
        r += i
    return r

# 개선 후
def calculate_sum(numbers):
    """숫자 리스트의 합계를 계산합니다."""
    total = 0
    for number in numbers:
        total += number
    return total

2. 함수 모듈화 (Function Modularity)

# 개선 전
def process_user_data(user_id):
    user = db.get_user(user_id)
    if user:
        name = user.name
        email = user.email
        age = calculate_age(user.birthdate)
        points = calculate_points(user.purchases)
        return {'name': name, 'email': email, 'age': age, 'points': points}
    return None

# 개선 후
def get_user_profile(user_id):
    """사용자 프로필 정보를 조회합니다."""
    user = get_user_from_database(user_id)
    return create_user_profile(user) if user else None

def create_user_profile(user):
    """사용자 프로필 객체를 생성합니다."""
    return {
        'name': user.name,
        'email': user.email,
        'age': calculate_age(user.birthdate),
        'points': calculate_points(user.purchases)
    }

3. 코드 중복 제거 (DRY Principle)

# 개선 전
def validate_user_input(name, email):
    if not name or len(name) < 2:
        raise ValueError("이름은 최소 2자 이상이어야 합니다")
    if not email or '@' not in email:
        raise ValueError("올바른 이메일 형식이 아닙니다")

def validate_product_input(title, description):
    if not title or len(title) < 2:
        raise ValueError("제목은 최소 2자 이상이어야 합니다")
    if not description or len(description) < 10:
        raise ValueError("설명은 최소 10자 이상이어야 합니다")

# 개선 후
def validate_min_length(value, field_name, min_length):
    """필드 값의 최소 길이를 검증합니다."""
    if not value or len(value) < min_length:
        raise ValueError(f"{field_name}은(는) 최소 {min_length}자 이상이어야 합니다")

def validate_user_input(name, email):
    validate_min_length(name, "이름", 2)
    if not email or '@' not in email:
        raise ValueError("올바른 이메일 형식이 아닙니다")

def validate_product_input(title, description):
    validate_min_length(title, "제목", 2)
    validate_min_length(description, "설명", 10)

4. 예외 처리 개선 (Exception Handling)

# 개선 전
def get_user_data():
    try:
        data = api.get_user()
        return data
    except:
        return None

# 개선 후
def get_user_data():
    """사용자 데이터를 API로부터 안전하게 조회합니다."""
    try:
        return api.get_user()
    except ConnectionError as e:
        logger.error(f"API 연결 실패: {e}")
        raise
    except ValueError as e:
        logger.warning(f"잘못된 사용자 데이터: {e}")
        return None
    except Exception as e:
        logger.critical(f"예상치 못한 오류: {e}")
        raise

리팩토링 체크리스트 ✅

  1. 변수명과 함수명

    • 명확하고 설명적인 이름 사용
    • 한글 주석 추가로 의도 명확히 표현
  2. 함수 크기

    • 한 함수는 한 가지 작업만 수행
    • 필요시 작은 함수들로 분리
  3. 모듈화

    • 관련 기능끼리 모듈로 그룹화
    • 재사용 가능한 단위로 분리
  4. 테스트 용이성

    • 단위 테스트 작성 가능한 구조
    • 의존성 주입을 통한 테스트 용이성 확보

실전 적용 예시 💡

설정 관리 리팩토링

# 개선 전
DB_HOST = "localhost"
DB_PORT = 5432
DB_NAME = "myapp"

# 개선 후
from dataclasses import dataclass

@dataclass
class DatabaseConfig:
    """데이터베이스 설정을 관리하는 클래스입니다."""
    host: str = "localhost"
    port: int = 5432
    name: str = "myapp"

    def get_connection_string(self) -> str:
        """데이터베이스 연결 문자열을 생성합니다."""
        return f"postgresql://{self.host}:{self.port}/{self.name}"

마치며 🎁

리팩토링은 한 번에 완벽하게 할 수 있는 작업이 아닙니다.
지속적인 개선과 관심이 필요한 과정이에요.
이 가이드를 참고하여 조금씩 코드를 개선해 나가시길 바랍니다!


References:

  1. Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin
  2. Refactoring: Improving the Design of Existing Code - Martin Fowler
  3. Python Clean Code Documentation - PEP 8
  4. The Pragmatic Programmer - Andrew Hunt & David Thomas
728x90