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. 리팩토링 시 피해야 할 실수
- 기존 테스트 코드 없이 시작: 예상치 못한 버그를 초래할 가능성 증가.
- 과도한 리팩토링: 불필요한 변경은 시스템 복잡도를 증가시킬 수 있음.
- 기능 추가와 리팩토링 혼합: 리팩토링과 기능 추가는 별도의 작업으로 분리.
- 한 번에 많은 변경: 작고 점진적인 변경이 리팩토링의 기본 원칙.
프로젝트를 진행하면서 리팩토링을 효율적으로 하기 위한 가이드라인을 찾아봤다. 다음 프로젝트에서 리팩토링을 진행할 때 위 가이드 라인을 접목하여 진행 예정
'Java > 공부' 카테고리의 다른 글
자바 컬렉션 프레임워크 종류와 사용 사례 (0) | 2025.01.23 |
---|---|
의존성 주입에 대한 관점 (0) | 2025.01.21 |