본문 바로가기
츄Log/끄적끄적

Scavenger 적용

by 츄츄🦭 2024. 6. 30.
728x90

 

데드코드를 검출하고 삭제하는 것은 시스템 유지보수 비용 관점에서 매우 중요합니다.

요즘 IDE는 매우 훌륭해서, 정적으로 사용하지 않는 코드는 다 검출해주는데요.

중요한 것은 public API입니다.

 

해당 엔드포인트를 더이상 제공하지 않기로 했다고 하더라도, public하게 열린 엔드포인트는 마음대로 지울 수 없습니다. 

누군가는 해당 API를 사용하고 있고 이를 통해 비즈니스를 전개하고 있을 수도 있기 때문입니다. 

 

하지만 이게 사용되고 있는지 확인하려면 여간 귀찮은 것이 아닙니다.

그나마 저는 전체 서버를 대상으로 access log의 path를 파싱해서 얼마나 호출됐는지 확인하는 스크립트를 만들어놨는데요. 

한두개 정도의 API는 이런 스크립트를 통해 확인한다고 하지만, 세개, 네개가 넘어가는 순간.. 너무 귀찮아집니다.

그렇게 귀찮은 마음에 그냥 두게 되고, 이렇게 쌓인 데드코드들은 컴파일 또는 테스트 속도를 지연시켜 프로젝트의 민첩성을 떨어트리고 새로운 사람이 왔을 때 시스템을 이해하기 어렵게 만들어서 유지보수 비용을 늘립니다. 뿐만 아니라 더이상 관리되지 않는 public API는 성능과 보안에도 악영향을 줄 수 있습니다. 

 

사실 위처럼 문제를 알고있긴 하지만, 할 일이 너무 많고 당장 문제가 되지 않으므로 걍 뒀습니다.. ㅎㅎ 

 

그러던 와중에 제가 올해 초에 "차세대시스템" 이라고 A 세대를 B로 전면 이관하는 개발을 진행하였습니다.

그리고 비즈니스 자체도 A 세대는 더이상 지원하지 않게 되었는데요.

덕분에 데드코드, 데드 엔드포인트가 굉장히 많이 생겼고 이를 한땀한땀 검토하는 것은 불가능하다고 판단했습니다. 

또한 전면 이관했기에 해당 A+B 비즈니스는 enpoint가 기존보다 2~3배 많아졌습니다. 

이런 상황에서 이슈가 생겼을 때 사용하지 않는 enpoint와 사용하는 enpoint가 구분이 되지 않아 빠른 이슈트래킹에 난항을 겪었습니다. 

 

그래서 데드코드 검출 도구인 스캐빈저를 적용하였습니다. 

 

--- 적용 과정

먼저 dev 서버에 스캐빈저 에이전트를 띄우고, collecting을 했습니다. 

collect 서버와 통신이 잘 되었고, tcpdump로 확인했을 때 패킷이 collect 서버로 흐르는 것을 확인했습니다.

근데, 저의 에이전트가 식별되지 않았습니다.

분명 패킷은 흐르고 있고, 설정파일도 문제가 없어보이는데 의아했습니다.

덕분에 조금 삽질을 했는데요, 실마리는 저의 어플리케이션 로그에 있었습니다.

제가 테스트한다고 전체 패키지를 대상으로 수집을 했기에, collect API가 한 번에 받을 수 있는 사이즈를 넘었고 max size를 넘었다는 오류가 친절하게 로그로 남고 있었습니다.

스캐빈저 에이전트가, 바이트 위빙을 통하여 코드를 추적하는 매커니즘인 것을 생각하면 오류메세지가 제 애플리케이션에 남는 것은 당연했습니다. (심지어 설정에 DebugMode도 있었습니다)  

근데 왜.. 로그를 볼 생각을 안했을까요-_-;;? 

collect 서버로 패킷이 흐르는 걸 확인했을 뿐인데, 패킷이 흐른것은 200OK(성공이다)다 라고 머릿속에서 이상한 흐름을 만들어낸 것 같습니다.

패킷은 흐르더라도 collect 애플리케이션에서 받지 않을 수 있는데 말이죠. 

 

--- 앞으로는?

이제 스캐빈저를 어떻게 활용할 것인지. 생각해보려고 합니다.

큰 틀은 데드코드를 검출하고 이를 삭제하는 건데요, 단순히 전체 적용 후 데드코드는 검출한다 라고 접근하진 않을 예정입니다. 

이유는 다음과 같습니다.

 

- 스캐빈저는 전체 애플리케이션에 영향을 줍니다. 물론 많은 유즈케이스가 있어서 걱정은 하지 않지만, 전면 장애보다는 검토하고 조심스럽게 접근하는게 맞다고 생각합니다. 

- 검출된 데드코드는 누가 또 사용하기 전에 빠른 시일 내로 처리해야 합니다. 저는 데드코드 검출이 메인 업무가 아니기에, 사용할 수 있는 리소스의 한계가 있습니다. 그러므로 한번에 전체 애플리케이션들에 대해 데드코드를 검출하기보다, 효율적으로 영역을 정의하여 검출하고 처리할 것입니다. 

 

오픈소스 : https://github.com/naver/scavenger

 

 

728x90