AOT로 컴파일된 이진 파일에서 Java 클래스 정보 추출

Java 세계에서 AOT(Ahead-of-Time) 컴파일은 오랫동안 논쟁의 주제였지만 GraalVM이 등장하기 전까지 전체 생태계를 구동하는 것은 물론이고 좋은 AOT 컴파일을 달성할 수 있는 도구도 없었습니다. AOT 컴파일에서 개발자를 효과적으로 지원하기 위해 네이티브 이미지 도구를 제공하는 GraalVM에도 불구하고 Java 애플리케이션에 대한 즉시 사용 가능한 AOT 컴파일을 달성하는 것은 특히 리플렉션 및 프록시 기술을 사용하는 Java 생태계의 복잡성과 다양성으로 인해 여전히 매우 어렵습니다. 다양한 공통 프레임워크에서 널리 사용됩니다.

스프링 네이티브 프로젝트

Spring Framework 팀의 Spring Native 프로젝트 덕분에 Maven 또는 Gradle 플러그인을 통해 프로젝트의 원클릭 AOT 컴파일을 달성할 수 있습니다. 그러나 현재는 Spring Boot 프로젝트에만 적용 가능합니다.

Spring Native를 사용하여 AOT-컴파일된 Java 프로그램을 생성하십시오.

다음은 AOT 컴파일 Java 애플리케이션 생성을 위한 공식 Spring Native 예제입니다(테스트 환경: Ubuntu 20.04, Docker 20.10.6).

git clone https://github.com/spring-projects-experimental/spring-native.git
cd spring-native/sample/petclinic-jpa
./build.sh

비교적 긴 컴파일 시간과 많은 양의 메모리 소비 후에 대상 디렉터리에 AOT 컴파일된 Java 프로그램을 얻을 수 있습니다. 이는 종속성 없이 독립적으로 실행될 수 있는 독립 실행형 바이너리 파일입니다.

img

petclinic-jpa는 AOT로 컴파일된 프로그램으로 직접 실행할 수 있습니다.

AOT 컴파일된 이진 파일에서 Java 클래스 정보 추출

Java 코드 보호는 과거에도 항상 매우 어려운 문제였으며 AOT도 Java 코드 보호를 위한 솔루션으로 간주됩니다. 불행하게도 현재 많은 Java 프로그램은 프레임워크에서 분리할 수 없습니다. 프레임워크의 복잡성으로 인해 AOT로 컴파일된 프로그램이라도 최종 생성된 바이너리 파일에 클래스 정보를 포함해야 합니다. 클래스 파일은 실제로 바이너리 파일의 리소스 영역에 깔끔하게 정리되어 있습니다.

다음 도구는 AOT 컴파일된 이진 파일에서 클래스 정보를 스캔하고 추출할 수 있습니다.

다음 도구는 AOT 컴파일된 이진 파일에서 클래스 정보를 스캔하고 추출할 수 있습니다.

https://github.com/3-keys/binary-classfile-reader

git clone https://github.com/3-keys/binary-classfile-reader
cd binary-classfile-reader
./gradlew run --args='<path-of-the-binary-file> <output-folder>'

이전 단계에서 얻은 petclinic-jpa를 예로 들어 클래스 정보를 추출하고 소스코드와 비교해보자. 모델 정보, 컨트롤러 정보, 서비스 정보를 모두 얻을 수 있는 것을 볼 수 있습니다.

img