회사 입사 후 처음으로 외부 파견을 나가게 되었습니다. 프로젝트는 마지막을 향해가고 있었고, QA에서 발견된 다수의 버그 처리와 쿼리 튜닝이 주요 업무였습니다. 사전에 프로젝트 코드를 전달받았는데, 최근 프로젝트임에도 코드 상태가 좋지 않았습니다.
QA 단계에서 발견되는 반복적인 버그들의 원인이 코드 간의 높은 결합도와 가독성 저하에 있다고 판단되었습니다. 단순히 현재의 버그를 수정하는 것에 그치지 않고, 서비스 오픈 후 운영 단계에서 발생할 유지보수 비용을 근복적으로 절감하기 위해 리팩토링을 결심했습니다.
보안상 결과물과 커버리지 내역을 공유드리지 못하는 점 양해 부탁드리겠습니다.
⭐️ 리팩토링 목표 설정
👉🏻 도메인 지식을 먼저 익히기
도메인 지식 없이 객체지향 프로그래밍을 하는 것은 불가능하다고 생각했기 때문에 업무 시간을 통해 도메인 지식을 먼저 습득했습니다.
👉🏻 문서화 선행하기
요구사항 정의서와 개발 명세서가 문서화되어 있지 않아 작업 진행 전 필요한 사항을 문서화했습니다.
👉🏻 컴파일 에러 발생시키지 않기
기존 API와 내부 로직은 정상적으로 작동하고 있었기 때문에 기존 코드를 삭제하고 새로 만드는 것이 아니라 버전을 분리해 리팩토링과 테스트를 완료한 후 API를 변경된 버전으로 교체하는 방향으로 진행했습니다.
👉🏻 동료와 엣지 케이스 검토하기
혼자 작업할 경우 놓칠 수 있는 케이스가 있기 때문에 동료들과 함께 검토하는 시간을 별도로 마련했습니다.
🔎 실제 성과를 확인해보자
업무 시간 외에 진행하고 있는 작업으로 현재 서버 코드의 약 50% 정도 진행된 상태이며, 최초 작업 시 주요 비즈니스 로직과 의존성이 낮은 도메인부터 점진적으로 리팩토링을 진행했습니다. 리팩토링된 내용 중 부족한 부분이 있겠지만, 작업을 진행하면서 많이 배웠고 결과물을 보면 정말 뿌듯했습니다. 그리고 고생했다며 감사하다는 동료들의 칭찬을 들을 때면 작업의 가치를 느낄 수 있었습니다.(칭찬은 고래도 춤추게 한다고 하죠🤭)
📈 테스트 커버리지 향상
테스트 코드가 전혀 없던(0%) 프로젝트에 주요 비즈니스 로직을 중심으로 단위 테스트를 작성했습니다. 리팩토링을 완료한 코드에 대해서는 핵심 로직의 테스트 커버리지를 약 40%까지 끌어올렸으며, 현재도 지속적으로 개선 중입니다.
테스트 코드 작성의 가장 큰 성과는 잠재적 버그를 사전에 발견한 것입니다. Null 처리 누락, 경계값 검증 부재, 예외 상황 미처리 등 프로덕션에서 발생할 수 있었던 문제들을 테스트 단계에서 발견하고 개선했습니다.
🛠️ 코드 품질 개선
OOP 원칙을 적용해 책임이 명확하게 분리된 구조로 개선했습니다. 하나의 클래스가 여러 역할을 담당하던 구조를 단일 책임 원칙에 맞게 분리하면서 코드의 가독성과 유지보수성이 크게 향상되었습니다.
대부분의 코드는 Service 클래스에서 절차지향 방식으로 작성되어 있었고, 비즈니스 로직과 데이터 조회, 검증, 변환 등 모든 책임이 한 곳에 몰려 있었습니다. 이를 도메인 객체가 자신의 책임을 갖도록 개선하고, 검증 로직은 도메인으로, 데이터 변환은 별도 클래스로 분리했습니다.
💭 마치며
처음 이 작업을 시작할 때는 "넥스트스텝에서 배운 걸 한번 적용해보자"는 단순한 생각이었습니다. 하지만 막상 시작하고 보니 생각보다 훨씬 어려웠고, 많은 시행착오를 겪었습니다.
하지만 동료들과 함께 검토하며 하나씩 해결해나갔고, 결과물을 볼 때마다 뿌듯했습니다. 완벽하지는 않지만, 분명 이전보다 나아졌고 앞으로도 계속 개선해나갈 수 있다는 자신감을 얻었습니다.
주어진 일만 하는 것이 아니라 능동적으로 문제를 찾고 해결하는 개발자가 되고 싶다는 생각으로 시작한 이 작업이, 제게는 정말 값진 경험이었습니다.
⭐️마무리까지 화이팅 !⭐️
'프로그래밍 > Java' 카테고리의 다른 글
| [Spring] Redis 장애 극복하기(feat. 서킷브레이커) (2) | 2025.11.28 |
|---|---|
| [Spring] 처리율 제한 장치 구축하기 (2) | 2025.11.26 |
| [Spring] Mysql Replication 트러블슈팅 (3) | 2025.09.21 |
| [Java, 자바] final 필드, final 메소드, final 클래스의 차이 (2) | 2025.08.26 |
| [Spring] Spring에서 이벤트 발행과 구독 (1) | 2025.05.22 |