본문 바로가기

IT개념/프로그래밍상식

[DEVIEW2023] 런타임 데드 코드 분석 도구 Scavenger

728x90

*DEVIEW2023에서 열린 네이버 플랫폼 랩스의 김태연, 권오준 개발자님의 강연을 그대로 개인 학습을 위해 정리한 포스트입니다.

https://youtu.be/qE7HY7Y-5vs

 

*Scavenger는 DEVIEW2023에서 네이버가 공개한 오픈소스 프로젝트입니다.

 

 

1. Dead Code란?

 

https://devopedia.org/dead-code

실행되지 않는 코드를 뜻합니다. (Unreachable)

 

 

아래는 예시 소스입니다.

 

final int age = 25;

if (age>20){
    System.out.println("Okay");
} else {
    System.out.println("Nope");
}

 

위 조건문에서 변수 age는 else로 분기될 수 없으므로 영영 사용되지 않는 else는 Dead Code입니다.

간단한 예시를 들었지만 소스 상에서 사용되지않는 메소드나 클래스나 서비스의 이유로 버려진 API 등 다양한 로직들이 위와 같이 Dead Code가 될 수 있습니다.

 

 

 

1-1)  Dead Code가 발생하는 원인은?

- 협업 팀이 사용하지 않는 API를 통보해주지 않는다.

- 다른 사람이 작성한 소스를 수정할 때

(누가봐도 잘못됐거나 지워야할 걸 알아도.. 잘 돌아가는 소스 괜히 건드리고 싶지가 않다.)

- 새로운 소스 반영 후 기존 소스 삭제 안하는 경우

 

등 이유가 있지만,
제가 겪기에는 프로젝트가 커지면 커질수록 인원도 늘고 로직도 커져 소스들을 한번에 파악하기 어렵고 데드코드들을 정리하는데 체크하고 검증할 부가작업이 많아아지는 것이 큰 이유인 것 같습니다.. (귀찮음 + 소통부재)

 

 

1-2) Dead Code의 문제점

- 시스템 유지보수가 어려워 집니다. (이게 뭔 소스인지 파악하기가 어려워요)

- 성능 / 보안에 악영향을 줍니다.

- *컴파일, 테스트 속도 등을 지연시킵니다.

 

 

1-3) Dead Code 검출 방법

- IDE의 static analysis로 검출할 수 있습니다. ( IntelliJ에서는 사용되지 않고 있는 소스를 위와 같이 표기해줍니다.)

- 로깅, 디버깅으로 확인합니다.

 

사실 위와 같은 방법을 사용해도 커다란 프로젝트의 많은 소스들 전부 체크하기에 너무 귀찮고 어렵습니다..

 

그래서 Scavenger가 탄생했습니다.

 

 

 

2. 스캐빈저란?

- Scavenger는 런타임 Dead Code 분석 도구입니다.

(기존 IDE에서는 컴파일링(빌드) 시 Dead Code를 분석)

 

 

2-1) Scavenger 사용법 (데모)

Scanvenger는 Agent 방식으로 동작합니다.

(자바에서 에이전트(Java Agent)는 Java Virtual Machine(JVM)이 실행되는 동안 애플리케이션의 동작을 관찰하거나 수정하는데 사용되는 도구입니다. 에이전트는 프로그램 실행 전이나 실행 중에 코드를 조작할 수 있게 해 주며, 이를 통해 성능 최적화, 모니터링, 디버깅 등 다양한 작업을 수행할 수 있습니다. 자바 에이전트는 바이트코드를 조작하거나 특정 이벤트에 대한 콜백을 받아 처리할 수 있는 기능을 제공합니다.)

demo.jar (검사받을 소스 파일입니다)

scavenger-agent.jar (스캐빈저 jar파일 입니다)

scavenger.conf (스캐빈저가 실행할 때 사용되 설정 파일입니다)

 

D 옵션으로  Scavenger의 위치를 지정해주고 javaagent 옵션과 함께 demo.jar를 실행해줍니다.

java -Dscavenger.configuration=scavenger.conf -javaagent:scavenger-agent.jar -jar demo.jar

 

콘솔을 통해 agent가 스캔한 메소드 정보를 볼 수 있습니다.

파일이 실행되면서 수집한 내용도 데이터 서버로 전송하는 로그도 확인할 수 있습니다.

 

전송된 데이터는   Scavenger UI에서도 확인할 수 있습니다.

 

 

 

데이터 서버에서 수집정보를 확인하려면 사전에 워크스페이스를 작성하고 설정해두어야 합니다.

 

앞에서 함께 실행했던 설정파일은 UI를 통해 위와 같이 쉽게 조작하여 다운로드받을 수 있습니다.

 

 

 

몇 가지 기능들이 있지만 가장 중요한 스냅샷 기능은 특정 시점 이후로 Dump하는 것을 뜻하는데요

여기서 스냅샷을 하나 생성해서 보면 프로젝트 파일트리를 확인할 수 있고, 내부에 진입하게 되면 방금전 Agent가 수집한 메소드 정보들을 확인할 수 있습니다. (호출된 메소드: 초록색 / 호출되지 않은 메소드: 검은색)

 

* 여기서 고의로 invoke 메소드를 호출시킨 뒤 새로 snapshot을 생성하면 새로 호출된 invoke 메소드가 초록색으로 변하여 호출되었다는 것을 알 수 있습니다.

 

이와 같이 현재 서비스에서 호출되지 않고 있는 메소드를 손쉽게 모니터링 할 수 있습니다.

 

 

2.2 특징

네이버 페이 팀 회의 시간에 거대한 시스템을 리팩터링해야한다, 어떡할까, 이야기하다 나왔다고 합니다.

- 하이에나와 같은 청소 동물에서 따온 명칭

- Codekvast 오픈소스 기반 (Codekvast는 자바 애플리케이션의 코드 사용 현황을 분석해주는 도구입니다)

- 지식iN, 블로그, 네이버 페이, 뮤직.. 등 80개 서비스에서 이용 중 (검증된 서비스)

- 압축을 풀지 않아 클래스 로딩을 하지 않고 사용자 코드를 읽음

- H2, MySql, Cloud Native 환경의 분산 DB 시스템인 Vitess를 Database로 지원

- 어노테이션 기준 스코픗 설정, 생성자 제외 등 설정에 편의 기능들이 있다고 함

- 높지 않은 성능 오버헤드 (31만개 메소드 스캔에 8.7s, 메소드 한번 호출 시 30ns 소요

 

2023.03.17 현재는 JVM 기반 (Java, Kotlin)만 지원, Python은 베타입니다.

(Java Agent는 Maven Central에서 다운로드 가능)

https://central.sonatype.com/artifact/com.navercorp.scavenger/scavenger-agent-java/1.0.4

 

Maven Central: com.navercorp.scavenger:scavenger-agent-java:1.0.4

Maven Central: com.navercorp.scavenger:scavenger-agent-java:1.0.4

central.sonatype.com

* 버전 상관 없이 호환 될지는 확인이 필요할 것 같습니다.

 

 

스캐빈저를 통해 리팩터링한 라인 수

 

 

 

2-3 Scavenger 아키텍쳐

스캐빈저는 4가지 모듈이 있습니다.

Scavenger Agent: 호스트 어플리케이션으로 자바 프로세스와 함께 실행됩니다.

 - ASM: Byte 코드 분석 라이브러리

 - Byte Buddy: 바이트 조작 라이브러리, 사용자 메소드 호출되었는지 확인함

 - Host Application 호출 시 Invocation을 gRPC로 기록합니다.

 

Scavenger Collector 보고받은 데이터를 DB에 Write합니다.

Scavanger API DB Data를 Read합니다.

Scavnger FrontEnd 데이터 시각화

 

본 강연영상을 보시면 Scavenger를 바이트 코드 단위까지 접근하여 구현한 방법에 대해 자세하게 소개하고 있으니 관심있으신 분들은 봐보시길

https://github.com/naver/scavenger

 

 

리팩터링뿐만 아니라, 포팅 범위를 정할 때에도 사용할 수 있으며, 활용 방법에 따라 다른 용도로도 쓸 수 있을 듯 합니다.

 

'IT개념 > 프로그래밍상식' 카테고리의 다른 글

OOP, AOP 리팩터링  (0) 2023.06.29
WAS 최적화와 트러블슈팅  (0) 2023.04.13
인텔리제이 자주쓰는 단축키  (0) 2022.01.07
[TCP]데이터 보증과 재전송제어  (0) 2021.08.25
캐시에 대하여  (0) 2021.08.18