인턴 하면서 노트북 필요하다고 그래서 친구한테 맥북을 빌려왔다......
처음 써보는 맥북이라 더 헤매는 중인듯
와서 프로젝트 파악을 하면서 테스트를 돌려보고 있었늗네
./gradlew test로 실행하니까 다른 테스트 40개는 성공하는데 AiMediaTest의 두 개 테스트만 실패
java.lang.UnsatisfiedLinkError
java.lang.NoClassDefFoundError
OpenCV를 사용하는 테스트에서만 오류가 발생한다는걸 알았다.
이 프로젝트는 AI 로 영상을 제작해서 화면에 띄우는 프로젝트인데
OpenCV 랑 FFmpeg를 사용
os 에 맞는 native library (.dll, .so, .dylib)을 함께 사용하는 프로젝트
-> 현재 실행중인 운영체제 (난 arm64) 랑 CPU 아키텍처에 맞는 네이티브 라이브러리가 반드시 로드되어야 함
맥이 어떤 CPU 아키텍처인지 확인하는 쉬운 방법
uname -m
해봤더니 arm64 가 떴고, 참고로 Apple Silicon(M1, M2, M3)은 모두 arm64를 사용한다고 한다
일단 마저 gradle properties 를 확인해보니까 platfrom 이 linux-x86_64전용

나를 위한 네이티브 바이너리는 없었다......
즉 프로젝트는 linux-x86_64 용 OpenCV이고 내가 실행시키는 환경은 macOS arm64 라서 JVM 이 라이브러리 로딩에 실패해서 UnsatisfiedLinkError 가 뜬다
위에 잇는 NoClassDefFoundError 발생 이유
OpenCV 관련 클래스가 로딩되는 과정에서 내부적으로 네이티브 라이브러리를 먼저 불러오는데
네이티브 라이브러리 로드 실패
↓
클래스 초기화 실패
↓
NoClassDefFoundError
순서로 돌아가서 초기화 실패 때문에 오류가 뜬 것...
해결
공용 설정 파일(back/gradle.properties)은 Docker와 CI 서버에서도 사용하기 때문에 수정하면 안 되고
내 로컬에서만 Gradle 전역 설정을 넣어줬다
# .gradle/gradle.properties 파일
javacppPlatform=macosx-arm64
그리고 쓸데없이 돌아가는 Gradle demon 은 죽임
./gradlew --stop
Gradle 데몬이 백그라운드에 계속 떠 있으면서 이전 javacppPlatform 값을 캐싱하고 있어서 옛날에 저장되어있던 linux-x86-64 값을 계속 가지고 있게 되기 때문....
얘때문에 고쳐졌는데도 고쳐졌는지 몰랏다
그다음 테스트 할 때는 cursor 말고 별도 터미널에서 실행시킴으로써 해결할 수 잇엇다