GraalVM - R๊ณผ Java ์‚ฌ์ด

๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”. ์ •๋ง ์˜ค๋žœ๋งŒ์— ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์˜ค๋žœ๋งŒ์— ์ž‘์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด์•„ ์กฐ๊ธˆ ํŠน๋ณ„ํ•œ ๊ฐœ๋ฐœ๊ธ€์„ ์ ์–ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด, ํ•œ ๊ฐ€์ง€ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ €์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋Š๋ผ๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ์š”.

GraalVM์ด ๋ฌด์—‡์ด๊ณ  ์ด๊ฒƒ์ด ํ˜ผ์šฉ ์–ธ์–ด์˜ ๊ฐœ๋ฐœ๊ณผ ์–ด๋– ํ•œ ์—ฐ๊ด€์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

R๊ณผ Java ์‚ฌ์ด

R ์–ธ์–ด๋Š” ๋ณดํ†ต ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. R์—์„œ๋Š” Shiny๋ผ๋Š” ๊ณต์‹ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฅผ ์ด์šฉํ•ด์„œ๋„ R์„ ์ด์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์ด๋Ÿฌํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€์šฉ๋Ÿ‰ ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜๋„๋ก ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Shiny๋กœ๋Š” ์•„๋งˆ ์—ญ๋ถ€์กฑ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์„ฑ๋Šฅ์ด ๊ฒ€์ฆ๋˜์ง€๋„ ์•Š์•˜๊ณ , ๋‹จ์ˆœํžˆ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์„œ๋น„์Šค์šฉ์œผ๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค ๋ณด๋ฉด ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Java์˜ Spring boot ๋“ฑ๊ณผ ์—ฐ๋™ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ Java์—์„œ ๊ตฌํ˜„ํ•œ ๋ฉ”์†Œ๋“œ๋‚˜ ํ•จ์ˆ˜๋ฅผ R์—์„œ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” R์˜ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ rJava ์ž…๋‹ˆ๋‹ค.

 

What is GraalVM ?

GraalVM Architecture

๊ทธ๋ ‡๋‹ค๋ฉด 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์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์— ๋น„ํ•ด ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๊ณ , ์‹คํ–‰ ์ค‘์— ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ทธ๋งŒํผ ์ ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

GraalVM Performance plot (Oracle)

ํŠนํžˆ Oracle์—์„œ ๋ฐœํ‘œํ•œ GraalVM์˜ ์„ฑ๋Šฅ ์ฐจํŠธ๋Š” R ์–ธ์–ด์—์„œ ๊ฐ€์žฅ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ R ์ž์ฒด๊ฐ€ ๊ต‰์žฅํžˆ ํผํฌ๋จผ์Šค๊ฐ€ ์•ˆ์ข‹์€ ์–ธ์–ด์ธ ๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ, R ์ž์ฒด์˜ ์„ฑ๋Šฅ์„ ๋Œ์–ด ์˜ฌ๋ ค์„œ๊นŒ์ง€ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐ”๋ž˜์„œ๋Š” ์•ˆ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Polygot

GraalVM Supported Runtimes (http://www.graalvm.org/docs)

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์— ๋Œ€ํ•ด ์ข€ ๋” ๊ณต๋ถ€ํ•˜๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ๋” ์‰ฝ๊ณ  ์œ ์ตํ•˜๊ณ  ์ข‹์€ ๊ธ€ ๋งŽ์ด ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค... (์ ˆ๋Œ€ ๋ง๋งŒ ํ•˜์ง€ ์•Š์„๊ฒŒ์š”.. ๋” ๋งŽ์ด ๊ธ€ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ใ… )

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments