레거시 코드를 리팩토링 하는 경우 코드를 읽기 쉽고 유지보수하기 쉽게 하는 것도 중요하지만 기존 기능을 유지하고 에러가 나지 않게 하는 것도 중요합니다. 리팩토링 시 주의해야할 점 몇 가지에 대해서 정리해봅니다.
1. 미사용 메소드 삭제할 때 call hierarchy만 확인하면 낭패를 당할 수 있다.
java에는 리플렉션이 있기 때문이다. 어디에선가 리플렉션으로 호출하고 있을 수도 있다. 그렇게 사용하는 경우는 많지 않겠지만 call hierarchy 상에 없다고 해서 100% 쓰이는 곳이 없다고 단언할 수는 없는 것이다.
리플렉션을 사용했다면 메소드 호출을 위해 메소드명을 스트링으로 코드 어딘가에서 사용하고 있을텐데
그런 경우라면 찾기 쉽지만 만약 그 데이터를 데이터베이스에서 관리하고 있다면 여간 곤욕스러운 것이 아니다. 아니면 스트링을 만들 때 concat을 해서 생성하고 있는 경우라면? 이러저러한 가능성을 모두 생각해보면 사실 100% 확실한 답을 내리려면 많은 시간이 필요하다.
하지만 일반적으로 사용되는 패턴과 상식이라는 것이 있고 결국엔 어느 정도 확인할 수 있는 부분까지 확인하는 것이 좋은 선택일 것 같다. 만약 프로그램 소스에 익숙하지 않다면 해당 프로그램 작성 시 사용되는 관계와 패턴을 파악하고 잘 알고 있는 사람에게 정보를 듣는 편이 더 실용적이라고 할 수 있을 것이다.
100% 단언할 수 없다는 것을 기억해뒀다가 리플렉션의 낌새가 보인다면 더 확인해봐야할 것이다.
2. enum 수정 시 사용처 확인할 때 valueOf는 따로 체크해야 한다.
사용되지 않는 enum 객체를 지우려고할 때 enum 객체로 사용처를 찾아서는 찾아지지 않을 수 있다.
Enum.valueOf 메소드나 Enum.values 메소드로 enum을 사용하고 있을 수도 있기 때문이다.
valueOf에 전달하는 enum 객체 name 인자값이 어디서 오는지 정확히 파악하기 힘들다면 안전하게 제거하기 위해서는 꽤 시간을 들여야할 것이다.
enum 클래스를 기준으로 사용하고 있는 부분을 찾아서 valueOf나 values를 사용하는 부분을 시작점으로 찾아나가야 할 것이다.
다음은 이로 인해 발생할 수 있는 문제 상황에 대한 예시이다.
오늘도 열심히 개발 중인 김개발씨 오늘은 기존에 존재하는 코드의 리팩토링을 하려고 마음 먹었습니다.
코드를 열심히 보다보니 어떤 enum 클래스가 눈에 걸립니다.
이 enum 클래스에는 많은 항목들이 존재하고 있는데 사용되지 않는 것이 많을 것이라고 판단한 김개발씨는 사용되지 않는 항목들을 찾아 지우기로 마음 먹습니다.
IDE의 search기능과 find usage 기능으로 항목 하나하나 사용되는 부분을 찾기 시작한 김개발씨.
역시 사용되지 않는 것이 꽤 있습니다. 속으로 "누가 이런 쓰지도 않는 값을 넣어놓은 거야"라고 불평하며 사용되지 않는 항목들을 모두 삭제하고 뿌듯함을 느낍니다.
그리고 삭제하지 않는 것을 지운것 뿐이니 특별한 테스트는 필요없을 거라 판단하고 코드를 커밋했습니다.
시간이 흘러 김개발씨가 삭제한 내용이 릴리즈 되었고 시스템에는 김개발씨가 수정한 부분과 관련하여 오류가 나기 시작합니다.
당황한 김개발씨, 이럴리 없다고 생각하며 오류를 확인하기 시작합니다.
김개발씨가 enum 항목을 삭제한 부분에서 오류가 나고 있습니다. valueOf 메소드에서 일치하는 enum을 찾지 못하고 있었습니다.
김개발씨는 무릎을 치며 생각합니다. "valueOf로 찾아쓰는 enum인 경우는 search나 find usage로 찾아지지 않을 수 있구나"
다시 삭제한 enum 항목들을 복구 시켜 배포하면서 앞으로 enum 삭제할 때는 주의해야겠다고 생각합니다.
'개발 > 리팩토링' 카테고리의 다른 글
클린 코드 독서 노트 (0) | 2017.08.30 |
---|---|
클린 코드 - 2장 의미 있는 이름 요약 (0) | 2017.05.18 |
네이밍 관련 글 정리 (0) | 2017.05.08 |
읽기 좋은 코드가 좋은 코드다 - 노트 (0) | 2017.03.18 |