*DEVIEW2023에서 열린 네이버 플랫폼 랩스의 김태연, 권오준 개발자님의 강연을 그대로 개인 학습을 위해 정리한 포스트입니다.
*Scavenger는 DEVIEW2023에서 네이버가 공개한 오픈소스 프로젝트입니다.
1. 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
* 버전 상관 없이 호환 될지는 확인이 필요할 것 같습니다.
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 |