2.7 KiB
2.7 KiB
유틸리티 함수 설계 원칙
작성일: 2025-12-16
목적: 코드 재사용성 향상, 중복 제거, 유지보수성 개선
핵심 원칙
1. 중복 코드 제거 우선
- 동일한 로직이 2개 이상의 위치에 반복되면 유틸리티 함수로 추출
- 중복 코드는 버그 발생 가능성과 유지보수 비용 증가
- 유틸리티 함수로 통일하여 한 곳만 수정하면 전체 반영
2. 범용성과 재사용성
- 특정 도메인에 종속되지 않는 범용 함수로 설계
- 다양한 상황에서 사용 가능하도록 매개변수화
- 타입 안전성 지원 (타입 힌트, 타입 체크)
3. 명확한 책임 분리
- 하나의 함수는 하나의 명확한 작업만 수행
- 함수명이 기능을 명확히 표현
- 복잡한 로직은 여러 함수로 분리
유틸리티 함수 위치
디렉토리 구조
app/
└── utils/ # 공통 유틸리티 함수
├── __init__.py
└── {domain}_extractor.py # 예: json_extractor.py
네이밍 규칙
- 파일명:
{기능}_extractor.py,{기능}_helper.py등 - 함수명:
extract_{대상}(),parse_{대상}(),format_{대상}()등 - 명확하고 구체적인 이름 사용
설계 패턴
예시: JSON 추출 유틸리티
문제: LLM 응답에서 JSON을 추출하는 로직이 9개 위치에서 중복
해결: 범용 JSON 추출 함수 도입
# app/utils/json_extractor.py
def extract_json_from_text(text: str, expected_type: type = dict) -> Optional[Union[Dict, List]]:
"""다양한 형식의 LLM 응답에서 JSON 추출"""
# 코드 블록, 설명 텍스트 등 다양한 형식 자동 처리
효과:
- 9개 위치의 중복 코드 제거 (90줄 절약)
- 한 곳만 수정하여 전체 반영 가능
- 다양한 LLM 응답 형식 자동 처리
재사용성 체크리스트
유틸리티 함수 생성 전 확인:
- 동일한 로직이 2개 이상의 위치에 있는가?
- 범용적으로 사용 가능한가? (도메인 종속성 없는가?)
- 함수명이 기능을 명확히 표현하는가?
- 타입 안전성을 지원하는가?
- 에러 처리가 적절한가?
금지 사항
- ❌ 특정 도메인에 종속된 로직을 유틸리티로 만들지 않음
- ❌ 너무 복잡한 로직 (책임 분리 필요)
- ❌ 한 곳에서만 사용되는 로직 (과도한 추상화 방지)
- ❌ 비즈니스 로직을 유틸리티에 포함 (서비스 레이어에 있어야 함)
참고:
- JSON 추출 유틸리티 사례:
rb8001/app/utils/json_extractor.py - 관련 troubleshooting:
DOCS/journey/troubleshooting/251216_coldmail_processing_improvements.md