일기 slecs

Controller 세 개 삭제로 기술 부채 해소하고 유지보수성 향상

목차

오래된 Controller 세 개를 지운 날이었다. 기능 변경 없음, 사용자가 체감하는 차이 없음. 그럼에도 이 작업이 의미 있는 이유는 분명하다.

코드 리뷰를 하다 보면 "이건 나중에 꼭 정리해야지"라는 생각이 드는 지점들이 있다. 처음엔 하나둘이지만 쌓이면 무시하기 어려운 수준이 된다. 어느 순간부터 새 기능을 추가할 때 "이 파일 건드려도 되는 건지" 확인하는 시간이 생기기 시작하고, 팀원 누군가는 잘못 이해한 채로 비슷한 로직을 또 짜기도 한다. 이번에 정리한 Controller 세 개가 딱 그런 케이스였다.

역할이 불명확하게 쪼개져 있었고, 공통으로 쓰이는 데이터 처리 로직이 파일마다 중복돼 있었고, 네이밍이 제각각이라 어떤 Controller가 어떤 요청을 담당하는지 직관적으로 파악이 안 됐다.

어떤 구조 문제였나

크게 세 군데로 나눠서 봤다.

비즈니스 로직 레이어: Controller 안에 비즈니스 판단이 들어가 있었다. 이건 고전적인 fat controller 패턴이다. Controller는 요청을 받아서 적절한 서비스로 위임하는 역할만 해야 하는데, 조건 분기와 데이터 가공이 섞여 있으니 테스트 짜기도 번거롭고 재사용도 안 됐다.

데이터 처리 레이어: 세 Controller가 거의 동일한 데이터 전처리를 각자 구현하고 있었다. 처음엔 "이건 이 Controller만 쓰니까 여기 있어도 되겠지"라고 생각해서 그렇게 됐을 거다. 근데 비슷한 맥락의 기능이 늘어나면서 복붙이 반복됐다.

뷰 레이어 네이밍: get_data, fetch_info, retrieve_result 같은 식으로 의미가 겹치는 이름들이 공존했다. 이름이 일관성 없으면 탐색 비용이 올라간다. IDE에서 심볼 검색할 때도, 코드 리뷰할 때도.

정리 방향은 아래처럼 잡았다.

// 제거: dead code + 명백히 사용 안 되는 Controller 통째로
// 이동: 비즈니스 로직 → Service 레이어, 공통 처리 → 유틸리티
// 이름 변경: 동사+명사 패턴 통일, 의도가 드러나게
// 분리: 하나의 Controller가 너무 많은 역할을 맡은 경우 책임 분배

수정 파일은 총 6개. 숫자만 보면 작은 변경 같지만, 각 파일 안에서 이동한 로직 덩어리가 꽤 있었다.

리팩토링할 때 지키는 원칙

한 번에 많이 건드리지 않는다. 이게 제일 중요하다.

범위가 커지면 검증이 어렵다. "6개 파일 바꿨는데 뭔가 이상한 것 같음" 상황에서 원인 찾는 건 고역이다. 이번엔 논리적으로 묶이는 것들만 같은 커밋에 담고, 기능 확인 후 다음 단계로 넘어갔다.

기준으로 삼는 체크리스트는 대략 이렇다.

  • 삭제하는 코드가 실제로 불리는 곳이 없는지 전수 확인
  • 이동하는 로직의 입출력이 동일한지 단위 테스트로 확인
  • 리네이밍 후 참조 누락 없는지 빌드/린트로 확인
  • 변경 전후 동작 비교 (기능 테스트 or 스모크 테스트)

이 순서를 지키면 "분명히 로직은 맞는데 왜 안 되지" 상황을 거의 막을 수 있다.

변경 유형 건수
중복 로직 제거 다수
이름 변경 다수
Controller 삭제 3개
수정 파일 합계 6개

변경 후 기존 기능 동작 확인했고, 코드 탐색 시간이 눈에 띄게 줄었다. 같은 기능 수정 요청이 들어왔을 때 이전엔 "어떤 파일이지?" 찾는 시간이 있었는데, 이제는 바로 찾아서 고칠 수 있다.

기술 부채를 미루면 생기는 일

"기술 부채는 이자가 붙는다"는 말이 있는데, 직접 겪어보면 비유가 아니라 사실이다.

불명확한 코드가 쌓이면 온보딩 비용이 올라간다. 새로 합류한 팀원이 코드 파악하는 데 시간이 더 걸리고, 잘못 이해한 채로 구현하면 또 다른 부채가 생긴다. 기존 팀원들도 "이쪽 건드리면 어디 터질지 모른다"는 불안감이 생기면 변경을 꺼리게 되고, 그게 또 부채를 키운다.

리팩토링을 자주 하면서 확신하는 것 하나는, 코드는 처음부터 완벽할 수 없다는 거다. 요구사항이 바뀌고, 시스템에 대한 이해도가 달라지고, 팀 규모도 변한다. 그 과정에서 코드가 달라지는 건 당연하다. "완성된 코드"같은 개념은 없다. 주기적으로 다듬는 게 자연스러운 개발 흐름이고, 그게 쌓여서 유지보수하기 쉬운 시스템이 된다.

효과 체감
코드 탐색 시간 줄었음
수정 포인트 명확성 향상됨
사이드 이펙트 걱정 낮아짐
신규 기능 추가 속도 체감상 빨라짐

이번 작업은 외부에서 보면 아무것도 바뀐 게 없는 배포다. 근데 내부 구조가 바뀐 건 이후 작업 전부에 영향을 준다. 그래서 이런 작업이 "나중에 하면 되지"로 계속 밀리는 게 아쉽다. 지금 하는 게 제일 싸다.

댓글 0

첫 댓글 달아줘.