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

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

Spring Native 프로젝트

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

상당히 긴 컴파일 시간과 대량의 메모리 소비 후, target 디렉토리에서 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