Scala를 아시나요

Scala 로 플러그인 개발하기




Jonathan Gilbert가 2009년 9월 28일 블로깅





왜 Scala?


http://www.scala-lang.org/

Scala는 최근 자바 커뮤너티에서 여러가지 이유로 많은 관심을 받고 있습니다. 트위커가 기본의 루비기반의 메시징 시스템 백본을 Scala로 사용된 것으로 교체하였으며, 이제는 언어로서 많은 특징을 가지게 되었습니다. 이제는 자바와 같이 바이트코드로 컴파일도 가능하게 되었습니다. (Martin Odersky가 Scala 컴파일러와 javac 참조 컴파일러를 개발하였습니다).


이 언어가 Java 상에서 가지고 있는 것은 무엇인가?




매우 많이 있으며, 어떤것은 Java와 비교하여 좀 이상하게 보이기도 합니다. 여기 그 예 일부를 소개합니다.:

Methods as first-class objects:






 


1.//형제약으로 인해 사실 컴파일 되지는 않을 것입니다만, 요점은 보여줍니다..

2.def run(method, param) = \{ method(param) \}

3.run(System.out.println, "text")


Closures (물론 ! 추가로 lambda expressions 이 여기에...):






 


1.var total = 0

2.List(1,2,3).foreach \{ x => total += x \}



Static Typing:
Groovy 스타일의 fail-at-runtime typing이 없습니다. 여기 모든 것은 컴파일 시에 정적으로 타입 정의되고 체크됩니다. 차이점은 유추 된다는 점입니다. 그렇지 않으면 타입을 선언할 필요가 있습니다.:






 


1.var thing = 1

2.var other : Any = 1

3.thing = "new" //fail, was inferred as an integer

4.other = "new" //ok, marked as anything (value or ref type)


특징:
이제 간단하 다중 상속을 할 수 있습니다.
또한, 제가 C#이 Properties와 기타 다른 super-constructor 호출 (class myClass(i : Int) extends mySuper{...}), 에서 놓쳤었던 더욱 간단한 것들이 있습니다. 언어가 객체지향과 절차적 스타일을 모두 지원함으로 인해, 모두 복잡성을 줄이는데 일조하고 있는 것입니다. Scala 에 관련된 많은 포스팅들이 있지만, 다른 언어 자체에 대해 더욱 궁금하다면, Scala 사이트를 참조해 보십시요.


이것으로 어떻게 플러그인을 개발하는가?





빌드(Build)




Scala 코드를 빌드하기 위해서는 Maven2 플러그인을 사용해야 합니다. 그리고 src/main/scala 와 src/test/scala에 코드를 추가해야 합니다:






 


01.<plugin>

02.    <groupId>org.scala-tools</groupId>

03.    <artifactId>maven-scala-plugin</artifactId>

04.    <executions>

05.        <execution>

06.            <id>scala-compile-first</id>

07.            <phase>process-resources</phase>

08.            <goals>

09.                <goal>add-source</goal>

10.                <goal>compile</goal>

11.            </goals>

12.        </execution>

13.        <execution>

14.            <id>scala-test-compile</id>

15.            <phase>process-test-resources</phase>

16.            <goals>

17.                <goal>testCompile</goal>

18.            </goals>

19.        </execution>

20.    </executions>

21.</plugin>


혹은 IDE를 사용할 수도 있습니다. IDEA 9 은 괜찮은 Scala 플러그인을 가지고 있습니다. 문법 하일라이팅도 제공하며, 간단한 몇가지 리펙토링과 다른 디버깅 기능도 제공합니다. Eclipse 에서도 Scala 지원이 있을 것으로 생각됩니다.


배포(Deploy)



표준 Java 어플리케이션에서 Scala 플러그인을 실행하려면, 단지 런타임 jar org.scala-lang:scala-library를 추가하면 됩니다. 배포와 관련된 주요 이슈는 컨테이너와 연관된 것이 될 것입니다....


문제(Problems)


Velocity & WebWork



네. 반드시 Velocity를 사용할 필요는 없습니다만, Confluence 플러그인을 개발하는 경우 매우 매력적입니다. Velocity는 Scala와 잘 동작할 것입니다. 그렇지만 몇가지 알아야 할 사항이 있습니다. 여기 그 예제 action이 있습니다.:






 


01.class ScalaAction extends ConfluenceActionSupport \{

02. \\

03. @scala.reflect.BeanProperty

04. var myNumber : int = 21

05. \\

06. @scala.reflect.BeanProperty

07. var myString : String = "testString"

08. \\

09. def execute = \{

10.  try \{

11.   myString = //do something

12.  \} catch \{

13.   case e: Exception => myString = "error!"

14.  \}

15.  \\

16.  Action.SUCCESS

17. \}

18.\}


여기서 주목해야 할 점은 @scala.reflect.BeanProperty annotations 입니다. 이것은 Scala가 표준 이 속성에 대한 getters 와 setters를 생성하는 것을 의미합니다. 이것은 우리가 Java를 사용하듯이 Velocity와 Webwork에서 사용될 수 있는 것입니다. 이 annotation을 사용하지 않으면, Scala는 getPropertyName() / setPropertyName(...). 대신에 propertyName() / propertyName_eq$(...) 이름으로 getter/setter 쌍을 생성할 것입니다.


Spring




Spring 또한 위와 같은 동일한 이슈를 가지고 있습니다.- 다시말해, setter injection은 (mandatory for Confluence plugins-1 plugins) getters 와 setters를 필요로 합니다. 그러나 위의 방식을 사용하지 않는 몇가지 옵션이 있기는 합니다. FactoryBean을 사용할 수도 있습니다 – 이 방법은 plugins-1에서 문제를 일으키기도 하지만, Spring 마법이 필요하고, Bean 정의에 포함하고 싶다면, Top레벨 Bean이 생성될 수 있습니다.
저는 Spring이 bean 속성을 얻거나 설정할 때 그 메쏘드를 재정의할 수 있으면 좋을 것 같습니다. 그러나, 이러한 메쏘드를 찾는 표준 Java Introspector를 사용합니다. 겉으로 보기에는 이것은 Spring 3.0 에서 다시 쓰여진 듯 합니다. 그래서 커스텀 메쏘드를 사용할 수 있게 하여 이와 함께 Scalar 지원이 추가될 수 있도록 한 것입니다.
그러나 많은 Scala 맹신자들은 Scalar 자체가 충분히 융통성이 있기 때문에 DI 프레임워크를 좋아하지는 않습니다. 그들은 때때로 Cake Pattern 대신 제안하기도 합니다.

만약 Scala 에 관심이 있고, 다른 플러그인 개발자들과 의견을 교환하고 싶으시다면, Atlascamp로 오십시요!

댓글

이 블로그의 인기 게시물

JIRA의 대시보드를 효과적으로 구성해 보십시요

JIRA 와 Confluence 그리고 LDAP 연동을 간편히 하실 수 있습니다

JIRA 개요 및 기능