멘토님의 제안으로 Java BCI 에 대해서 이해해 보고자 하는데, 현재 Naver 의 경우 APM 솔루션으로 자사의 Pinpoint 를 사용하고 있다고 하는데 BCI 는 이를 구현하기 위해서 필요한 지식이라고 이해하였다.
현재 재직중인 회사에서 APM (Application Performance Management) 솔루션으로 Opennaru 사의 APM 제품을 도입하여 사용하고 있다.
(Opennaru 를 오픈나루라고 발음해야하는 줄 알았지만 공홈에 가보면 오픈마루라는 용어를 사용하는데 뭐지 싶다.)
사실 현재 회사의 APM 솔루션으로 부장님과 함께 (본인은 잘 몰라서 시키는대로만 했다.) 부하 테스트를 해본적이 있는데, 이를 구현하는 방식에 대해서 공부할 생각을하니 어렵기도하고 호기심도 생긴다.
1. Java BCI
JVM 에 올라가는 코드는 개발자가 작성한 .java 파일이 아닌 바이트 코드인 .class 이다.
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
- JDK Dynamic Proxy : 인터페이스를 반드시 구현해야 하며, Reflection (하단 게시물 참고) 을 사용하여 구현한 기술이여서 상대적으로 퍼포먼스가 떨어진다는 특징이 있다.
- CGLIB : 인터페이스가 아닌 클래스를 대상으로 동작이 가능하고 바이트코드를 조작해서(BCI) 프록시를 만들기에 JDK Dynamic Proxy에 비해 성능이 좋다.
- AspectJ : aspect 지향 프로그래밍의 구현으로 컴파일시에 바이트코드를 직접적으로 넣을 수 있는 CTW(Compile Time Weaving) 방식을 사용할 수 있고 직접적으로 클래스 파일에 수정을 가하는 방식이기 때문에 속도가 가장 빠르다
3. 결론
모니터링 툴에 관해서 Java BCI 를 이해해 보고자 했지만 공부하다보니 BCI 의 무궁무진한 활용성으로 이미 내가 개인 프로젝트때 사용했던 @Aspect 조차 BCI 를 이용해서 구현했다는 사실에 놀라웠다.
Spring Framework 는 사용자로 하여금 편리한 프레임워크임에는 확실하지만 Spring 에서 제공하는 annotation 을 사용할때 어떤 방식으로 동작하는지에 대해서 알고 사용해야겠다는 교훈을 얻었다..
'JAVA' 카테고리의 다른 글
Java Reflection API (0) | 2022.06.25 |
---|---|
JAVA 의 Garbage Collection (0) | 2022.04.14 |
Volatile 을 사용한 가시성 보장 (0) | 2022.03.15 |
쓰레드의 지역변수 ThreadLocal (0) | 2022.03.15 |
일급 컬렉션 (First Class Collection) 을 사용하자 (0) | 2022.03.01 |
String , StringBuilder, StringBuffer 속도차이 비교 (0) | 2022.02.09 |