java, 난 니가 무슨일을 하는지 알고싶다!

java로 coding한 후 *.class파일이 되는 순간, 역컴파일로 java 소스파일을 볼 수 있겠지만, 워낙 알아서 잘하는 놈이라, 내부에서 뭐가 어떻게 돌아가고 있는지는 알수가 없습니다.

개발 상황에야.. 내 코드가 있으니 debugging도 해 보고 할 수 있지만.. 사실, 우리가 필요한 시점은 남이 만들어 놓은 코드가 어떻게 돌아가고 있는지 알고싶거나, 많은 변수가 있는 운영되고 있는 시점에 어떻게 돌고 있는지 알고 싶죠!

BCI (Byte Code Instrumentation)는 run time 동안(실제로는 loading time)  *.class에 bytecode를 추가할 수 있는 기술입니다. JDK™ 5.0부터 지원되고 있구요.
java코드를 모니터링하거나 성능 정보를 수집하는데 사용할 수 있으며 모니터링에 흔히 사용되는 CA Willy, dynaTrace, Jennifer 등이 이 기술을 사용하고 있습니다.
(허허.. 그래서 이놈들 적용할 때 재기동이 필요했군요...)

BCI를 사용하는 것이 그렇게 멀리있거나 어려운놈은 아닙니다. 일단, java니까요...
게다가 BCI를 지원하는 오픈소스 라이브러리들도 있지요!

•ASM : Object Web에서 제공 http://asm.objectweb.org/
•BCEL : Apache 프로젝트에서 제공 http://jakarta.apache.org/bcel/
•SERP : Sourceforge 프로젝트에서 제공 http://serp.sourceforge.net/
•Javassist : JBoss 프로젝트에서 제공 http://www.csg.is.titech.ac.jp/~chiba/javassist

이번엔 내가 실행시키고 있는 *.class들이 무슨일을 하고있는지 알고싶을 때, 남의 소스 변경 안하고 내맘대로 파헤쳐보고 싶을 때 사용하는 BCI에 대해 소개했습니다.
(한참 흥미가 생기기 시작하는데 끝이죠? 또 올게요...)