JRuby는 Ruby 인터프리터를 JVM에서 구현한 것이다. 인터프리터는 자바로 만들어져있다. JRuby는 단지 JVM에서 도는 Ruby인터프리터 클론은 아니다. Ruby코드와 Java코드를 서로 연동하고 각각의 장점을 최대한 발휘할 수 있게 설계되어있다.

JRuby를 자바와 연동해서 사용하는 것은 3가지 정도 시나리오가 가능한 것 같다.

첫째는 Java코드에서 임의의 Ruby코드를 구동시키는 것이다. 물론 각각 독립적으로 되어있고 파라메터나 결과값 정도는 전달 할 수 있다. Ruby는 단지 Ruby API만 사용한다. 기존에 Ruby로 개발된 코드를 자바쪽에서 호출해서 실행해서 사용하는 정도의 목적으로 쓸 수 있겠다. 서버환경에서 기능의 일부를 수정했을때 바로 적용할 수 있는 장점이 있겠다.

두번째는 Ruby에서 자바로 개발된 API나 코드를 함께 사용하는 경우다. 자바는 지금까지 나온 어떤 언어보다 가장 많은 코드베이스를 가지고 있다. 풍부한 API와 재사용 가능한 컴포넌트들이 있다. JRuby를 이용하면 Ruby로 애플리케이션을 개발할때 자바의 풍부한 API와 클래스들을 거의 제한 없이 사용할 수 있다. 아직은 API나 라이브러리가 상대적으로 적은 Ruby의 단점을 보상해줄 수 있는 방법이다. 이경우 자바는 Ruby에서 호출하는 라이브러리 역할을 담당하게 된다.

셋째는 Java와 Ruby를 매우 깊이 연동해서 쓰는 구조이다. 기본 애플리케이션은 자바로 되어있고 첫번째 방식처럼 일부 컴포넌트를 Ruby로 개발한다. 하지만 Ruby의 자체기능만 사용하는 것이 아니고 자바의 기능을 이용하는 방식으로 사용하는 것이다. Ruby의 class가 자바의 인터페이스를 상속하도록 만들고 그것을 지원하는 프레임워크 등에 사용하는 방법이 가능하다. 예를 들어 Controller라는 인터페이스를 사용하는 SpringMVC에서 역시 자바의 Controller 인터페이스를 상속해서 만든 Ruby로 된 Controller오브젝트를 사용하게 하는 것 등이 가능하다. 사실 Ruby오브젝트는 자바에서 바로 사용할 수 없으므로 Proxy를 이용해서 method invoking하는 간단한 wrapper를 만들 필요가 있다. 이를 잘 적용한 예가 Spring2.0에서 Ruby를 bean으로 사용하도록 확장한 기능이다. Spring에서는 딱 두개의 클래스를 가지고 이 방식의 사용이 가능하도록 준비되어있다. 내가 주목하는 부분은 바로 이 세번째 용도이다.

간단히 JRuby를 테스트 하는 코드를 만들어봤다.

간단한 인터페이스를 만들고

[java]
package ruby;

public interface Hello {
  public String sayHello(String name);
}
[/java]

이를 구현한 Ruby class를 만든다.

[ruby]
require ‘java’

include_class ‘ruby.Hello’

class MyHello < Hello
  def sayHello(name)
    “Hello ” + name
  end
end
[/ruby]
호출하는 것은 Spring의 JRubyScriptUtils를 쓰면 편하다. Ruby코드가 script변수에 들어있다면

[java]
Hello h = (Hello)JRubyScriptUtils.createJRubyObject(
       script, new Class[] {Hello.class});
System.out.println(h.sayHello(“Toby”)); 
[/java]
이렇게 Ruby오브젝트를 그 구현한 자바 인터페이스로 받아서 사용할 수 있다. 물론 내부적으로는 Proxy이기 때문에 그 내부에서 Ruby method를 invoke하는 JRuby기능을 이용한다.

이 방식을 FactoryBean을 이용해서 확장한 것이 Spring2.0의 script language bean이다. 조만간 100% Ruby코드로 된 SpringMVC프로그램들이 많이 만들어질지도 모르겠다.

다음은 Ruby에서 자바API를 이용하는 간단한 예제. ApplicationContext를 만들고 bean을 가져와 사용하는 것까지. Ruby는 irb라는 command방식의 인터프리터가 있는데 그것을 이용해서 Spring Context를 생성하고 bean을 가져다가 테스트해보는 것도 충분히 가능할 것이다.

[ruby]
require ‘java’

include_class ‘org.springframework.context.support.ClassPathXmlApplicationContext’

ap = ClassPathXmlApplicationContext.new(“ruby/context.xml”)
h = ap.getBean(“hello”)
puts h.sayHello(“Toby”)
[/ruby]

이러다 나도 Bruce Tate처럼 되는 거 아닌가 모르겠다…

Related posts:

  1. Maven 의존관계 수렁에 빠지다
  2. Ruby와 Ruby On Rails
  3. Ruby를 공부하면서…
  4. JRuby개발자 SUN에 고용되다
  5. Ruby Symbols
  6. Maven archetype 설정파일 자동생성기 – ArchetypeXmlWriter
  7. 최적의 Ruby IDE
  8. 켄트 벡의 오리사냥 – Optimistic Typing
  9. JRuby로 자바빌드하기. Raven, AntBuilder 그리고 JRake
  10. JRuby/JRor + Spring
  11. Oracle Mix – First Public JRubyOnRails Site
  12. 이번주 할 일
  13. JDK7에는 Closure가 추가될까?
  14. Java와 생산성
  15. QCon 2007 San Francisco 참석중

Facebook comments:

to “JRuby의 활용”

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha