AOT로 컴파일된 바이너리 파일에서 Java 클래스 정보 추출하기

자바 환경에서 사전 컴파일(AOT)은 오랫동안 논쟁의 대상이었지만, GraalVM이 등장하기 전까지는 제대로 된 AOT 컴파일을 구현하거나 전체 생태계를 주도할 수 있는 도구가 없었습니다. GraalVM은 개발자들이 AOT 컴파일을 효과적으로 수행할 수 있도록 지원하는 네이티브 이미지 도구를 제공하지만, 자바 생태계의 복잡성과 다양성, 특히 다양한 프레임워크에서 널리 사용되는 리플렉션 및 프록시 기술 때문에 자바 애플리케이션에서 즉시 사용 가능한 AOT 컴파일을 구현하는 것은 여전히 매우 어려운 과제입니다.

스프링 네이티브 项目

Spring Framework 팀의 Spring Native 프로젝트 덕분에 Maven 또는 Gradle 플러그인을 통해 프로젝트를 한 번의 클릭으로 AOT 컴파일할 수 있게 되었습니다. 하지만 현재는 Spring Boot 프로젝트에만 적용 가능합니다.

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

다음은 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 클래스 정보를 추출합니다.

자바 코드 보호는 과거부터 매우 어려운 문제였으며, AOT(자동화 출력) 또한 자바 코드 보호의 해결책으로 여겨져 왔습니다. 그러나 안타깝게도 현재 많은 자바 프로그램은 프레임워크의 제약에서 벗어나지 못하고 있습니다. 프레임워크의 복잡성 때문에 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