본문 바로가기

JAVA

Java BCI (Byte Code Instrument)

멘토님의 제안으로 Java BCI 에 대해서 이해해 보고자 하는데, 현재 Naver 의 경우 APM 솔루션으로 자사의 Pinpoint 를 사용하고 있다고 하는데 BCI 는 이를 구현하기 위해서 필요한 지식이라고 이해하였다.

현재 재직중인 회사에서 APM (Application Performance Management) 솔루션으로 Opennaru 사의 APM 제품을 도입하여 사용하고 있다.

(Opennaru 를 오픈나루라고 발음해야하는 줄 알았지만 공홈에 가보면 오픈마루라는 용어를 사용하는데 뭐지 싶다.)

사실 현재 회사의 APM 솔루션으로 부장님과 함께 (본인은 잘 몰라서 시키는대로만 했다.) 부하 테스트를 해본적이 있는데, 이를 구현하는 방식에 대해서 공부할 생각을하니 어렵기도하고 호기심도 생긴다.

 

1. Java BCI


 

JVM 에 올라가는 코드는 개발자가 작성한 .java 파일이 아닌 바이트 코드인 .class 이다.

JVM의 구조와 자바의 메모리 구조

 

JVM의 구조와 자바의 메모리 구조

자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정은 어떻게 될까? 우리가 자바 애플리케이션을 실행할 때 JAVA와 OS 사이에서 동작하는 JVM(Java Virtual Machine)이라는 소프트웨어로 구현한 머

dev-cool.tistory.com

 

BCI (Byte Code Instrumentation) 란 Java 에서 가장 원초적이고 강력한 프로그래밍 기법이다.

BCI 는 Java 의 Byte Code에 대해 직접적으로 수정을 가해서, 소스 파일의 수정없이 원하는 기능을 부여하는 기법이다.

이러한 특징 때문에 모니터링(APM) 툴들이 대부분 BCI 기능을 이용하고 있으며, BCI 를 통해 애플리케이션의 수정 없이 성능 측정에 필요한 요소들을 삽입할 수 있다.

Bytecode 를 직접 수정할 수 있기 때문에  활용도는 무궁무진 하다고 할 수 있다.

AOP 를 구현하는 핵심 기술이 바로 BCI 이다.

AOP 컴포넌트들이 컴파일시간이나 런타임 시간에 Aspect 와 Business Logic 을 Weaving 할수 있는 이유가 바로 BCI 를 사용해서 Java 바이트 코드를 직접 수정할 수 있는 기술을 사용하기 때문이다.

 

2. AOP 의 원리


 

AOP 를 구현하기 위해 다음과 같은 방식을 사용한다고 한다.

  • JDK Dynamic Proxy
  • CGLIB
  • AspectJ

 

  1. JDK Dynamic Proxy : 인터페이스를 반드시 구현해야 하며, Reflection (하단 게시물 참고) 을 사용하여 구현한 기술이여서 상대적으로 퍼포먼스가 떨어진다는 특징이 있다.

  2. CGLIB : 인터페이스가 아닌 클래스를 대상으로 동작이 가능하고 바이트코드를 조작해서(BCI) 프록시를 만들기에 JDK Dynamic Proxy에 비해 성능이 좋다.

  3. AspectJ : aspect 지향 프로그래밍의 구현으로 컴파일시에 바이트코드를 직접적으로 넣을 수 있는 CTW(Compile Time Weaving) 방식을 사용할 수 있고 직접적으로 클래스 파일에 수정을 가하는 방식이기 때문에 속도가 가장 빠르다

 

Java Reflection API

 

Java Reflection API

초보 개발자로써 1차전직도 하지못한 지금 멘토링을 진행하는중 멘토님의 권유로 Reflection에 대해서 공부해보고자 한다. (2달만에 블로그 포스팅하는 내 자신에대해 반성하고 시작해야겠다.) 이

dev-cool.tistory.com

 

3. 결론


모니터링 툴에 관해서 Java BCI 를 이해해 보고자 했지만 공부하다보니 BCI 의 무궁무진한 활용성으로 이미 내가 개인 프로젝트때 사용했던 @Aspect 조차 BCI 를 이용해서 구현했다는 사실에 놀라웠다.

Spring Framework 는 사용자로 하여금 편리한 프레임워크임에는 확실하지만 Spring 에서 제공하는 annotation 을 사용할때 어떤 방식으로 동작하는지에 대해서 알고 사용해야겠다는 교훈을 얻었다..