GraalVM - R๊ณผ Java ์ฌ์ด
์๋
ํ์ธ์. ์ ๋ง ์ค๋๋ง์ ๊ธ์ ์์ฑํฉ๋๋ค. ์ค๋์ ์ค๋๋ง์ ์์ฑํ๋ค๋ ์๋ฏธ๋ฅผ ๋ด์ ์กฐ๊ธ ํน๋ณํ ๊ฐ๋ฐ๊ธ์ ์ ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ํ ๊ฐ์ง ์ธ์ด๊ฐ ์๋ ์ฌ๋ฌ๊ฐ์ง ์ธ์ด๋ฅผ ์ฌ์ฉํ ๋๊ฐ ๋ง์ด ์์ต๋๋ค. ํนํ ์ ์ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋๋ผ๊ณค ํ์๋๋ฐ์.
GraalVM์ด ๋ฌด์์ด๊ณ ์ด๊ฒ์ด ํผ์ฉ ์ธ์ด์ ๊ฐ๋ฐ๊ณผ ์ด๋ ํ ์ฐ๊ด์ด ์๋์ง์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
R๊ณผ Java ์ฌ์ด
R ์ธ์ด๋ ๋ณดํต ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ ์ธ์ด ์ค ํ๋์ ๋๋ค. ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ง ๋ชปํ๋ ๊ฒ์ ์๋๋๋ค. R์์๋ Shiny๋ผ๋ ๊ณต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ์ฌ ์ด๋ฅผ ์ด์ฉํด์๋ R์ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ ์ง๋ง ์ด๋ฌํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ฉ๋ ์๋น์ค์ ์ ํฉํ๋๋ก ๊ฐ๋ฐํ๊ณ ์ถ๋ค๋ฉด Shiny๋ก๋ ์๋ง ์ญ๋ถ์กฑ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌํ ์ฑ๋ฅ์ด ๊ฒ์ฆ๋์ง๋ ์์๊ณ , ๋จ์ํ ๋ด๋ถ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ก ์ฌ์ฉํ๋ค๋ฉด ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๋น์ค์ฉ์ผ๋ก๋ ์ ํฉํ์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค ๋ณด๋ฉด ๋ด๊ฐ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๋ฅผ Java์ Spring boot ๋ฑ๊ณผ ์ฐ๋ํ๊ฑฐ๋ ๋ฐ๋๋ก Java์์ ๊ตฌํํ ๋ฉ์๋๋ ํจ์๋ฅผ R์์ ํธ์ถํ๊ณ ์ถ์ ๋๊ฐ ์์์ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ R์ ํจํค์ง ์ค ํ๋๊ฐ ๋ฐ๋ก rJava ์ ๋๋ค.
What is GraalVM ?
๊ทธ๋ ๋ค๋ฉด GraalVM์ ๋ฌด์์ผ๊น์? GraalVM์ JVM ์ค ํ๋๋ก ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ฒ์ญํ ์ ์๋ Polygot ๊ธฐ๋ฅ์ด ์ง์๋์ด R์์ Java ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ๊ฐ๋ฅํ ์ค๋ฒํค๋ ์์ด ์ฌ์ฉํ ์ ์์ด R์์ FastR ํจํค์ง ์ค์น๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ PolygotVM ์ ๋๋ค.
์ค์ ๋ก GraalVM์ R๊ณผ Java ๋ฟ๋ง ์๋๋ผ Scala, Kotlin, Clojure, LLVM(C, C++, Rust), Python, Ruby ๋ฑ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๊ณ ์๊ณ , ์ฐจํ ์ํคํ ์ฒ์์๋ LLVM ์ธ์ด๋ฅผ ์ ์ธํ ๋ค๋ฅธ ์ธ์ด๋ค๋ Truffle Framework ์์์ ๋๋ฆด ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
Performance
๊ทธ๋ ๋ค๋ฉด ์๊ฐ ์ด์์ผ๋ก ์ข๊ฒ ๋ฝ๊ณ ์๋ค๋ GraalVM์ Performance๋ ์ด๋ ์ ๋ ์ผ๊น?
๋จผ์ ์๊ฐํด๋๋ฆด ์ ์ด ์๋ค๋ฉด, GraalVM์ JVM ๊ธฐ๋ฐ์ Native Compile์ ์ฌ์ฉํ์ฌ JVM ์ธ์ด๋ฅผ VM ์์์ ๋์์ํค์ง ์๊ณ ์ค์ ์ฅ๋น ์์์ ๋์ํ ์ ์๋๋ก ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ Native ์คํ ํ์ผ๋ก ๋ฏธ๋ฆฌ ์ปดํ์ผ ํ ์ ์์ด ์์ฑ๋ ํ๋ก๊ทธ๋จ์ JVM์์ ๋์ํ๋ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๋นํด ์์ ์๊ฐ์ด ๋นจ๋ผ์ง๊ณ , ์คํ ์ค์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ทธ๋งํผ ์ ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํนํ Oracle์์ ๋ฐํํ GraalVM์ ์ฑ๋ฅ ์ฐจํธ๋ R ์ธ์ด์์ ๊ฐ์ฅ ์ต๊ณ ์ ์ฑ๋ฅ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ํ์ง๋ง R ์์ฒด๊ฐ ๊ต์ฅํ ํผํฌ๋จผ์ค๊ฐ ์์ข์ ์ธ์ด์ธ ๊ฒ์ ๊ฐ์ํ ๋, R ์์ฒด์ ์ฑ๋ฅ์ ๋์ด ์ฌ๋ ค์๊น์ง ์ข์ ์ฑ๋ฅ์ ๋ฐ๋์๋ ์๋ ๊ฒ์ ๋๋ค.
Polygot
GraalVM์ JVM ์ค์์๋ Polygot์ ์ง์ํ๋ VM์ด์ด์, ์ฌ๋ฌ ๋ฐํ์ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๊ฒ๋ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ VM์ ์ฅ์ ์ ์ฑํํ์ฌ R์์๋ JVM์ด ๊ฐ์ง๊ณ ์๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์์ ๋ก์ด ์ฌ์ฉํด JDBC๋ฅผ ์ง์ํ๋ ๋๋ถ๋ถ์ RDBMS๋ ์ฐ๊ฒฐํ์ฌ ์ ์ฐํ๊ฒ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค๋ ์ ์ด ๋งค์ฐ ํฐ ์ฅ์ ์ผ๋ก ๊ผฝํ๊ณ ์์ฃ .
(๋ฌผ๋ก JDBC๊ฐ ์๋๋๋ผ๋ ODBC๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง ์ค์น๋ ์ค์ ์ด ๊น๋ค๋ก์์ ์ฌ์ฉํ๊ธฐ ๋ถํธํ๋ค๋ ๋จ์ ์ด ์์ฃ .)
๋ํ R์์๋ GraalVM์ ์ฌ์ฉํจ์ผ๋ก์จ Python์์ ์ ๊ณตํ๋ ์ธ๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ TensorFlow๋ Keras๋ฅผ R์์ ์ง์ ํธ์ถํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๋ถ์์๋ค์ด R๋ง์ ์ฌ์ฉํด์๋ ์ฝ๊ฒ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ฐ๋ฐํ ์๋ ์์ฃ .
๋ค๋ง ์์ฌ์ด ์ ์ด ์๋ค๋ฉด, Linux, Mac OS X์์๋ง ์ง์ํ๊ณ , Windows์ ๋ํ ์ง์ ๋ด์ฉ์ ์ ํ ์๋ค๋ ๊ฒ์ด๊ตฐ์...
R and Java
๊ทธ๋ผ ์ด์ ๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ๋ณผ๊น์? R ์ฝ๋์ Java ์ฝ๋๋ฅผ ๋ ๊ฐ์ง ๋์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด์ ๋ ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ์ฌ ํ ๋ฒ ์คํํด๋ณด๋๋ก ํ์ฃ .
์ฐ๋ฆฌ๋ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด rJava ํจํค์ง๋ฅผ ์ค์นํ๊ณ , Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์ํด OpenJDK๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
$ sudo apt install default-jdk
JDK ์ค์น๊ฐ ๋๋ฌ๋ค๋ฉด ์ด์ rJava ํจํค์ง๊น์ง ์ค์นํ์ฌ R๊ณผ Java ํ๊ฒฝ ๊ตฌ์ถ์ ๋ง๋ฌด๋ฆฌ ์ง์ด๋ด ์๋ค.
install.packages('rJava')
How to use
์ ์ด์ ๊ทธ๋ผ Java Class๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ด๋ฅผ R์์ ํธ์ถํด๋ด ์๋ค.
๋จผ์ Java class๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ JVM์์ ์คํ ๊ฐ๋ฅํ JAR ํ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค. ๊ทธ๋ฌ๋ฉด R์์ ๊ฐ์ ๊ฒฝ๋ก๋ก ๋์ด ์๋ jar ํ์ผ์ ์ฝ์ด์ ํด๋น ํด๋์ค๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋ฉ๋๋ค. Java ํด๋์ค๋ฅผ ํธ์ถํ๋ ค๋ฉด ์์ ๊ฐ์ด rJava ํจํค์ง์์ ์ ๊ณตํ๋ .jnew์ .jcall invoke method๋ฅผ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
GraalVM + Spring
๊ทธ๋ ๋ค๋ฉด ์ด๋ ๊ฒ ์ฑ๋ฅ ์ข์ GraalVM์ ์์ Java ์ฝ๋์ฉ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์๊น? ๋ฌผ๋ก ๊ฐ๋ฅํ๋ค. ํ์ง๋ง Spring ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๋ค. GraalVM์ Spring์์ ํ์ํ Reflection ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
What is Reflection ?
Reflection์ ๋ํด ์ ๋ชจ๋ฅด๋ ๋ถ๋ค์ด ๊ณ์ค ์๋ ์๊ธฐ ๋๋ฌธ์, ์ค๋ช ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค. Reflection์ด๋, ๊ฐ์ฒด๋ฅผ ํตํด ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ถ์ํด ๋ด๋ ํ๋ก๊ทธ๋จ ๊ธฐ๋ฒ์ ๋งํฉ๋๋ค. ์ฝ๊ฒ ๋งํ์๋ฉด Runtime ์์ ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ํ์ ์ ๊ฒฐ์ ํ๊ฑฐ๋ ์์๋ผ ์ ์๋ ๋ฅ๋ ฅ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋๋ ์ฝ๋์ ๋๋ค. ์ ๊ทธ๋ด๊น์? ์๋ง ์ผ๋ฐ์ ์ผ๋ก Java ์ฝ๋ฉ์ ํด๋ณด์ ๋ถ๋ค๋ ๋ฌธ๋ฒ์ด ํ๋ ธ๋ค๊ณ ๋งํ ์๋ ์๊ฒ ์ง๋ง ์ค์ ๋ก ์ด ์ฝ๋๋ ๋ฌธ๋ฒ์ด ํ๋ฆฌ์ง ์์์ต๋๋ค.
Object ํด๋์ค๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋ถ๋ชจ ํด๋์ค์ ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์์ ํด๋์ค์ธ Book ํด๋์ค๋ฅผ ์ธ์คํด์ค๋ก ๋ด์ ์๋ ์์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋ณ์์ ๋ฉ์๋๋ค์ Book ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ Object ํ์ ์ธ ์ํ์์ ์ด๋ค์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ด์ ์๊ธฐ๋ ์ค๋ฅ์ด์ฃ .
๊ทธ๋ฐ๋ฐ ์ค์ ๋ก Java ํ๋ก๊ทธ๋๋ฐ์ ํ์ ๋ ํํ ์ผ์ธ๊ฐ? ๊ทธ๋ ์ง ์๋ค. ๋ณดํต์ Java ํ๋ก๊ทธ๋๋ฐ์ ํ๊ฒ ๋๋ค๋ฉด ์ด๋ฌํ ์ผ์ด์ค๋ ๊ต์ฅํ ๋ณด๊ธฐ ๋๋ฌผ๋ค. ํ๋ฌผ๋ฉฐ JavaFX๋ Swing์ ๊ฐ์ง๊ณ GUI ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ๋ง์ด๋ค.
์ด๋ฌํ ์ผ์ด์ค๋ Spring Framework์์ ๋ณผ ์ ์์ต๋๋ค. Spring์์๋ BeanFactory, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์ํ ApplicationContext ๋ ๊ฐ์ง ์ ํ์ Spring Container๋ฅผ ์ ๊ณตํ๋๋ฐ, BeanFactory๋ ์คํ๋ง ์ค์ ํ์ผ(applicationContext.xml)์ ๋ฑ๋ก๋ bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ ์ด๋์ ๋๋ค. ์ฌ๊ธฐ์์ Reflection์ด ์ด์ฉ๋๋ ์๊ฐ์ Container๊ฐ ๊ตฌ๋๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ํด์๋ง ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ Reflection์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ณดํต ์ด๋ฌํ ํํ๋ก ๊ฐ์ฒด์ ๊ฐ์ฒด ์ฌ์ด๋ฅผ ๋๋๋ค๋ค๋ณด๋ฉด ํ๋์ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค. ๊ทธ๋ด๋ ค๋ฉด JVM์์๋ ๊ฐ์ฒด ์์ฑ๊ณผ ์์ฑ๋ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค ์ ๋ณด๊ฐ ํ์ํ๋ฐ, ์ด๋ฅผ ๋ณดํต Java ์ฝ๋์์๋ ์๋์ ๊ฐ์ด new ์์ฑ์๋ฅผ ํตํด์ ์์กด์ฑ์ ์ฃผ์ ์์ผ ์ค๋๋ค.
์ด๋ ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ธ๋ถ์์ ์๋ก์ด Heap์ ํ ๋นํด ๊ฐ์ฒด๋ฅผ ์์ฑ ๋ถ์ฌํ๋ ๊ฒ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํตํด์ ๊ฐ์ฒด๋ฅผ ํ ๋นํด์ฃผ๋ ๊ฒ์ด ์๋ ์ธ๋ถ์ ์๋ก์ Heap์ ํ ๋น๋ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก Spring or Spring boot์์๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ์ํฌ ์ ์์ต๋๋ค.
์ด์ ๋น์ทํ ์ด๋ ธํ ์ด์ ์ผ๋ก @Resource ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ์ ์ด๋ ๊ฒ ๋ฐํ์ ์งํ ๊ณผ์ ์์ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ Reflection์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด ์คํ ์ด์ ์ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ฒ์ญ๋์ง ์์ ๋ ํผ๋ฐ์ค์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
Reflection์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์์๋ณด๋๋ก ํ์ฃ .
์ ์ฝ๋๋ ์ค์ Java ์ฝ๋๊ฐ ์๋๋๋ค. ์์๋ฅผ ์ค๋ช ํด์ฃผ๊ธฐ ์ํ ์ฝ๋๋ก ์ค์ ๋ก Reflection์ ์์ ๋น์ทํ ํํ๋ก ๋์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ MethodsBean ํด๋์ค๋ฅผ Reflectionํ์ฌ ์์กด์ฑ ์ฃผ์ ์ ํ๊ณ ์ ํ๋ค๋ฉด Reflection API์์ ์ ๊ณตํ๋ getClass(), getMethod() ํจ์๋ฅผ ์ด์ฉํด์ ํด๋์ค์ ๋ ํผ๋ฐ์ค๋ค์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด์ ํด๋น ๋ฉ์๋๊ฐ ์์ ๊ฒจ์ฐ ํธ์ถํ๊ณ , ์์ผ๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋์์ฃผ๋ ๊ฒ์ด์ฃ .
๋ง์น R์์ Java ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ ์ผ์ด์ค์ ๋๋ค. JVM์ ๋ก๋๋ ํด๋์ค๋ฅผ ์ง์ ๋ถ๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋น์ทํ API๋ฅผ GraalVM์์ ์ ๊ณตํด์ฃผ๊ณ , rJava ํจํค์ง๋ฅผ ํตํด์ invoke ํ ๋ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ ์๊ฐ ์๋ ๊ฒ์ด์ฃ .
ํ์ง๋ง ๊ณต๊ต๋กญ๊ฒ๋ GraalVM์์๋ ์ด API๋ฅผ ์ง์ํ์ง ์์ ์ง์ Spring์ ์์ ์ฌ๋ฆด ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ใ ใ
๋ง์น๋ฉฐ..
5๊ฐ์ ๋ง์ ๊ธ์ธ๋ฐ, ๋ญ๊ฐ ์ ์ ํ์ด๋ณผ์๋ก ๋ ์จ์ผํ๋๋ฐ... ๋ผ๋ ๋ง์๊ฐ์ง์ด ๋จ๋ ๊ธ์ด์์ต๋๋ค. ์ด ๊ธ์ ์ฐ๊ฒ ๋ ๊ณ๊ธฐ๋ ์ ๊ฐ ์ง๋ 1๋ ๋์ ์๋ฃ ๋ฐ์ดํฐ ๋ถ์ผ์์ ์ผ์ ํ๋ฉด์ R๋ก ๋ฐ์ดํฐ ๋ถ์์ ์ฃผ๋ก ์ด๋ฃจ๊ณ , Java์ ์ฝ๋๋ฅผ ์ด์ฉํด์ ๊ทธ๋ก ์ธํ ๋ถ์กฑํ ๋ถ๋ถ์ ๋ท๋ฐ์นจํ๋ ๊ฒฝ์ฐ๊ฐ ๊ต์ฅํ ๋ง์์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
R ์ธ์ด๋ ๊ต์ฅํ ๋๋ฆฐ ์ธ์ด์ด์ง๋ง C++, Java, Javascript, Python ๋ฑ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฐ์ด ํผ์ฉํด์ ์ธ ์ ์๋ค๋ ์ ์ด ์์ ๋ถํฐ ๋ง์์ ๊ฑธ๋ ธ์์ต๋๋ค. ์ด๋ป๊ฒ ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ๋ฆฌํฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ๋๊ณ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ฒ์ผ๊น?
๊ทธ ๋ต์ ์ ๊ฐ rJava ํจํค์ง๋ฅผ ์ฌ์ฉํด Java ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํผ์ฉ์ํฌ ๋ ์ ์ ์์์ต๋๋ค. Spring boot๋ฅผ ์ด์ฉํด Web API๋ก ์ ์๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ ์ฐํ๊ฒ ๋ถ๋ฅผ ์ ์์๊น๋ฅผ ๊ณ ๋ฏผํ์์ต๋๋ค. ๋ฌผ๋ก ์ฒ์์๋ REST API ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ํธ์ถํ๋ ๊ฒ์ผ๋ก ์ฝ๊ฒ ์๊ฐํ์ง๋ง ์ด๋ Web API๊ฐ ๋์ํ์ง ์์ผ๋ฉด ๋ฌด์ฉ์ง๋ฌผ์ด์์ต๋๋ค. ๋ฐ๋ผ์ ๊ทธ์ ์์กดํ๋ Java ์ฝ๋๋ฅผ ๋ถ๋ฌ์ ์ด๋ฅผ ๋ฆฌํฉํ ๋งํด์ ๋ค์ ์ฌํ์ฉํด์ ์ฐ๋ ๊ฒ์ ๋ชฉํ๋ก ๋ฐ๊พธ์์ฃ .
ํ์ง๋ง ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. R์์ ์ฌ์ฉํ๋ JVM์ ์ฐ๋ฆฌ๊ฐ ๋ณดํธ์ ์ผ๋ก ์๊ณ ์๋ Open Java Runtime์ด ์๋ ๋ค๋ฅธ JVM์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. JSON ๋ฐ์ดํฐ ํ์ ์ ์ฒ๋ฆฌํ๋ ์ค ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์ด, ์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํด๋ณด๊ณ ์, GraalVM์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, GraalVM์ ๋ํ ํ๊ธ ๋ ํผ๋ฐ์ค ๋ฌธ์๋ ๊ทธ ์ด๋์๋ R๊ณผ GraalVM์ ๋ํด์๋ ์์ธํ ๋ค๋ค์ ธ์๋ ๊ธ์ด ์กด์ฌํ์ง ์์์ต๋๋ค. Documentation์ ๋ณด๋ฉด์ ์ด๋ ๊ฒ "Native ์์์ ์์ง์ด๋ JVM๋ ์กด์ฌํ๋๊ตฌ๋"๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ๊ธ์ ์ฐ๊ธฐ ์์ํ์ต๋๋ค. ์ด ๊ธ์ ์ฐ๋ฉด์ R์์ ์๋ํ๋ Java ์ฝ๋์ ์ฑ๋ฅ์ด ์ด๋ ์ ๋์ด๊ณ , ์ต์ ํ๋ JVM์ ์ฐพ๋๋ค๋ฉด ์์ฃผ ์ข์ ๊ธ์ด ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ ๋ํ ์ฒ์ ์ ํด๋ณด๋ VM์ด์๊ณ ์ด๋ฅผ ํตํด์ Java์ ๋ํด ์ข ๋ ๊ณต๋ถํ๋ ๊ณ๊ธฐ๊ฐ ๋์ด์ ์ข์์ต๋๋ค. ์์ผ๋ก๋ ๋ ์ฝ๊ณ ์ ์ตํ๊ณ ์ข์ ๊ธ ๋ง์ด ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค... (์ ๋ ๋ง๋ง ํ์ง ์์๊ฒ์.. ๋ ๋ง์ด ๊ธ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค ใ )