본문 바로가기
Java/공부

효율적인 리팩토링을 위한 전략

by wooksss 2025. 1. 24.

1. 리팩토링의 목표를 명확히 정의

a) 주요 목표 설정

  • 가독성 향상: 코드를 더 쉽게 이해하고 유지보수할 수 있게 개선.
  • 성능 최적화: 처리 속도, 메모리 사용량, API 응답 시간을 개선.
  • 테스트 가능성 개선: 코드의 단위 테스트 작성 및 통합 테스트 용이성 증가.
  • 재사용성 향상: 중복 코드를 제거하고 공통 로직을 추출.
  • 기술 부채 상환: 초기 개발 시 급하게 구현한 부분이나 비효율적인 코드를 수정.

2. 리팩토링을 위한 사전 준비

a) 코드의 상태를 평가

  • 코드 리뷰:
    • 코드가 복잡하거나 반복되는 패턴을 식별.
    • 비효율적인 SQL 쿼리, 불필요한 메서드 호출, 중복된 로직 등 확인.
  • 정적 분석 도구 활용:
    • SonarQube, Checkstyle, PMD 등을 사용해 코드 품질을 분석.

b) 충분한 테스트 코드 작성

  • 테스트 코드 확보:
    • 리팩토링 중 기존 동작이 변경되지 않도록 단위 테스트, 통합 테스트, 엔드투엔드 테스트를 작성.
  • 테스트 커버리지 확인:
    • 최소한 주요 비즈니스 로직은 테스트 커버리지가 80% 이상인지 확인.

c) 시스템 상태 측정

  • 주요 메트릭:
    • API 응답 시간
    • DB 쿼리 속도
    • 메모리 및 CPU 사용량

3. 리팩토링 전략

a) 작은 단위로 리팩토링

  • 한 번에 많은 코드를 리팩토링하지 말고, 작고 독립적인 단위로 작업.
  • 예:
    • 메서드 이름 변경, 주석 추가.
    • 하나의 클래스나 서비스 개선 후 안정성을 검증.

b) 주요 영역부터 우선 개선

  • 핫스팟 코드:
    • 자주 수정되거나 오류가 발생하는 부분을 먼저 리팩토링.
  • 성능 병목 구간:
    • 느린 SQL 쿼리, 반복되는 데이터 로딩, 비효율적인 캐시 사용 등.

4. 리팩토링 기술

a) 코드 개선

  • 중복 코드 제거:
    • 반복되는 로직은 별도의 메서드 또는 유틸리티 클래스로 추출.
    • 중복 코드 식별: IDE 기능 또는 정적 분석 도구 사용.
  • 긴 메서드 분리:
    • 한 메서드가 여러 작업을 처리하지 않도록 분리.
 
  • Magic Number 제거:
    • 코드에 하드코딩된 숫자나 문자열 대신 상수로 정의.

b) 데이터베이스 개선

  • SQL 최적화:
    • 필요 없는 쿼리 호출 줄이기.
    • 쿼리의 EXPLAIN 결과 확인하여 인덱스 최적화.
  • N+1 문제 해결:
    • 데이터베이스 호출을 줄이기 위해 **지연 로딩(Lazy Loading)**을 사용하거나 join fetch 적용.

c) 아키텍처 개선

  • 레이어 분리:
    • 서비스, 리포지토리, 컨트롤러 간의 역할 분리를 명확히 함.
    • 비즈니스 로직은 서비스 계층에서, 데이터 처리는 리포지토리 계층에서 담당.
 
  • DTO와 Entity 분리:
    • 데이터를 외부로 노출할 때 엔티티 대신 DTO(Data Transfer Object) 사용.

5. 리팩토링 중 협업 및 관리

a) 버전 관리

  • Git 브랜치 전략:
    • 리팩토링 작업 전용 브랜치를 생성.
    • Pull Request(PR)로 작업 내용을 팀원과 공유하고 코드 리뷰를 진행.

b) 점진적 배포

  • Feature Toggle:
    • 새로운 리팩토링된 기능을 단계적으로 활성화하기 위해 Feature Toggle 사용.
  • Blue-Green Deployment:
    • 변경된 코드를 배포하기 전에 현재 버전과 새 버전을 동시에 실행하여 안정성 확인.

6. 리팩토링 후 검증

a) 테스트 실행

  • 모든 단위 테스트 및 통합 테스트가 성공하는지 확인.
  • 성능 테스트:
    • JMeter, Gatling과 같은 도구로 기존과 리팩토링 후 성능 비교.

b) 코드 리뷰

  • 팀원들과 함께 코드 리뷰를 진행하여 실수를 최소화하고 개선 사항을 찾음.

c) 모니터링 및 로깅

  • 리팩토링 후 애플리케이션의 성능이 저하되거나 오류가 발생하지 않는지 모니터링.
  • 중요한 메서드에 로깅을 추가하여 실행 상태를 확인.

7. 리팩토링 시 피해야 할 실수

  1. 기존 테스트 코드 없이 시작: 예상치 못한 버그를 초래할 가능성 증가.
  2. 과도한 리팩토링: 불필요한 변경은 시스템 복잡도를 증가시킬 수 있음.
  3. 기능 추가와 리팩토링 혼합: 리팩토링과 기능 추가는 별도의 작업으로 분리.
  4. 한 번에 많은 변경: 작고 점진적인 변경이 리팩토링의 기본 원칙.

프로젝트를 진행하면서 리팩토링을 효율적으로 하기 위한 가이드라인을 찾아봤다. 다음 프로젝트에서 리팩토링을 진행할 때 위 가이드 라인을 접목하여 진행 예정

'Java > 공부' 카테고리의 다른 글

자바 컬렉션 프레임워크 종류와 사용 사례  (0) 2025.01.23
의존성 주입에 대한 관점  (0) 2025.01.21