본문 바로가기
Rust/각종 테스트

Java vs java to call rust

by lms0806 2025. 12. 9.
728x90
반응형

안녕하세요.

오늘은 rust로 만든 라이브러리를 java에서 호출하여 사용하는 방법에 대해 알아보고자 합니다.

해당 내용을 하고자하게 된 이유는 rust에 대해 유튜브 영상을 찾아보던 와중 Rust 크로스 플랫폼 프로그래밍이라는 영상을 보게 되었습니다.

해당 영상에서는 rust로 만든 로직을 ts, kotlin, swift에서 모두 호출해서 동일한 로직을 수행하게 한다 라고 이야기하고 있습니다.

그러던 와중, java공화국인 한국에서 Spring boot를 주로 사용할텐데, 이를 속도와 메모리를 생각해서 rust의 웹백엔드인 axum으로 변경하는 방식보다는 rust로 구현된 로직을 java에서 호출해서 사용하면 되지 않을까? 라는 생각을 하게 되어 테스트해보게 되었습니다.

구현

1.가장 먼저 rust 프로젝트를 생성합니다.

cargo new rustToJava --lib

여기서 --lib은 라이브러리 프로젝트를 만들겠다는 뜻으로 필수로 기입해주셔야 합니다.

2.cargo.toml 설정

[lib]
crate-type = ["cdylib"]

cargo.toml에 다음과 같은 설정을 추가해줍니다.

3.rust 코드 작성

#[no_mangle]
pub extern "C" fn fib(n : i64) -> i64 {
    if n < 2 {
        return n;
    }
    fib(n - 1) + fib(n - 2)
}

저는 시간이 어느 정도 소요되는 로직 중 하나인 재귀 피보나치 수열 코드를 작성하였습니다.

4.java 프로젝트 생성
java 프로젝트는 maven을 사용하는 프로젝트로 생성합니다. (해당 테스트를 진행할때는 jdk25를 활용하였습니다.)

5.pom.xml 설정

<dependencies>
  <dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.17.0</version>
  </dependency>
</dependencies>

6.자바 코드 작성

package org.example;

public class Main {
    static void main() {
        long start = System.nanoTime();
        for (int i = 1; i < 10; i++) {
            fib(i);
        }
        for (int i = 1; i < 10; i++) {
            RustLib.INSTANCE.fib(i);
        }
        System.out.println("total: " + ((System.nanoTime() - start) / 1_000_000.0) + " ms");
    }

    private static long fib(long n) {
        if (n < 2) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }
}

테스트를 수행할때는 서로의 코드만 남겨둔채 진행하였습니다.

모든 테스트는 3회의 평균으로 계산합니다.

  • fibo 10
  • java : 0.0152ms rust : 169.3873ms
  • fibo 20
  • java : 0.2882ms rust : 153.4372ms
  • fibo 30
  • java : 5.1110ms rust : 157.3341ms
  • fibo 40
  • java : 579.4128ms rust : 538.4048ms
  • fibo 50
  • java : 61848.7471 rust : 44376.3969

작은 로직의 경우 java에서 처리하는 로직이 더 빠르나, 시간이 오래 걸리는 로직의 경우 rust로 작성하고 java에서 불러오는 방식이 더 빠른 것을 볼 수 있습니다.

해당 내용에 대한 코드는 다음 github에서 보실 수 있습니다.
https://github.com/lms0806/Rust-To-Springboot

728x90
반응형

'Rust > 각종 테스트' 카테고리의 다른 글

Rust에서의 반복문 vs stream  (0) 2025.07.27
Rust axum VS Java Spring boot 속도 테스트  (2) 2025.04.04

댓글