[펌]Scala 시작하기

 

http://ppassa.wordpress.com/2012/02/19/getting_started_scala/

Scala 시작하기

요즘 들어서 Scala를 공부하고 있다. 아직 많이 부족하지만, 지금까지 배운 것들 기록해두고, 또 혹시 조금이라도 도움이 되는 분들이 있을 지 몰라 공유해보고자 한다.

1. 들어가며


뭘 또 배워야 한단 말인가? 이미 C++, Java, Python, Ruby, JavaScript 등 많은 프로그래밍 언어들이 있는데, 왜 자꾸 새로운 언어가 나오고 있냐? 기존 걸로 안되냐?

라는 의문을 가질 수 있다. 나 역시 처음에 그런 생각을 했었다. 하지만, Scala에 대해 공부를 하다 보니, 이제는 그런 의문들이 많이 없어졌다. 어떻게 의문을 해소했었는지, 그럼 조금 자세히 이야기 해보겠다.

2. Scala?


Scala는 다음과 같은 특징이 있다.

2.1 Fuctional language이며 또한 object-oriented language이다.

Ruby나 C#을 쓰다가 Java나 C++ 같은 언어를 쓸 때 조금 답답한 것이, lambda와 같은 functioncal language적인 syntax가 없다는 것이다. 이것을 안 쓸때는 몰랐는데, 일단 손에 익으면 생산성이 매우 높아진다. Scala는 lambda를 비롯하여 여러 functional language의 문법을 지원한다. 동시에, object-oriented적인 요소도 지원하기 때문에, objected-oriented language에 익숙한 프로그래머들이 functional language를 배우고자 할 때 쉽게 다가갈 수 있다.

나는 C++이 초기에 다른 object-oriented language들을 제치고 성공할 수 있었던 가장 큰 이유가, C++이 C 문법도 지원했기 때문이라고 생각한다. C++ 컴파일러를 이용하면, C에 익숙한 프로그래머들은 C로 코딩을 하면서도, 부분부분 쉽게 object-oriented적인 요소를 사용할 수 있었다. 마찬가지로 Scala는 기존의 Java나 C++등 object-oriented language에 익숙한 프로그래머들을 functional language로 쉽게 끌어 들일 수 있는 장점이 있다.

2.2 Java Virtual Machine에서 동작한다.

Java Virtual Machine(이하 JVM)은 Java를 컴파일해서 나오는 bytecode가 동작하는 virtual machine이다. Scala는 특이하게도 소스 코드를 컴파일하면 그 결과로 JVM에서 동작하는 bytecode가 결과물로 나온다. 다시 말해 Scala는 JVM상에서 동작한다.

이것은 두 가지 중요한 의미를 갖는다. 하나는 컴파일 된 Scala 코드는 이미 10년 이상 최적화가 되어 있는 JVM 상에서 동작하기 때문에, 성능과 안정성을 어느 정도 보장한다.

또, 기존에 Java로 작성된 소스와 호환이 되기 때문에, 엄청나게 많은 Java 라이브러리들을 Scala에서 그대로 사용할 수 있다. 야호!

3. Who uses Scala?


Scala를 누가 쓰기는 쓰는가? 생각보다 많이 쓰고 있고, 점차 더 도입되는 추세인 것 같다. 대표적으로 다음과 같은 회사들이 사용한다.

3.1 Twitter

Twitter 서비스는 초기에 Ruby on Rails를 이용하여 개발되었다. 그런데 Ruby on Rails를 이용해 빨리 개발할 수는 있었지만, 이후에 traffic이 많아 지면서 성능이 문제가 되었다. 이를 해결하기 위해 Scala를 도입하였다고 한다. 트위터 개발자들의 인터뷰 참고.

3.2 FourSquare

FourSquare 서비스는 초기 버전은 PHP로 작성되었다고 한다. 하지만 사용자가 급증하자 software stack에 변화가 필요했고, Harry Heymann이라는 엔지니어가 이 작업을 주도하면서 Scala로 전면적으로 다시 개발했다고 한다. 이 과정에서 생산성 향상과 성능 향상이 있었다는 이야기도 있다. Scala 공식 홈페이지에 관련된 글이 있으니 참고.

3.3 Tumblr

Tumblr 또한 부분적으로 Scala를 쓰고 있다고 한다. Back-end용으로 쓰이고 있고, Twitter에서 만든 Scala용 라이브러리인 Finagle을 이용해 사용한다고 알려져 있다.Tumblr의 개발 방식에 대해 정리된 페이지 참고.

4. Scala 시작하기


Scala에 대한 흥미가 조금은 생겼으리라 예상해본다. 그럼 다음과 같은 자료를 활용해서 공부를 시작해보자.

4.1 Scala for the impatient

프로그래밍 경험이 어느 정도 있는 분들에게 추천하는 책이다. 제목에서도 알 수 있듯이 빨리 문법을 익혀 코딩해보고자 한다면 좋은 선택이다. 중요한 문법에 대해서 간결하게 잘 설명되어 있다. 공짜다.

4.2 Twitter Scala School

Twitter에서 만든 교육 자료이다. 아마도, 자사의 엔지니어들을 위해 만들지 않았나 생각된다. 내용이 간결하고, 예제 위주로 되어 있어서 빨리 익히기에 좋다.

4.3 Programming Scala

Scala의 동작 원리부터 차근차근 잘 설명한 책이다. Scala에 대해 좀더 깊이 이해를 하고자 하는 경우나 또는  프로그래밍 경험이 많지 않은 분들에게 추천하고 싶다. 역시 공짜다.

Programming language들이 많이 나오면서, 요즘은 각 language community들이 적극적으로 확산에 나서고 있고, 그래서 무료 자료가 참 많다. Scala를 공부하기 위해서, 굳이 돈주고 종이책 살 필요는 없을 듯 하다.

5. 개발 환경


5.1 build

Scala는 컴파일 language이기 때문에, build를 해주어야 한다. 물론 소스 하나씩 compile해서 build하는 방법도 있겠지만, 이것보다는 별도의 build 툴을 쓰면 편하다. 많은 scala 오픈 소스 프로젝트들이 최근에 simple build tool(이하 sbt)를 사용하고 있다. 사용법이 길지 않으니 꼭 사용법을 읽어보는 것이 나중에 수고를 덜어줄 것이다.

5.2 IDE

개발툴로 많이 쓰이는 것이 Eclipse와 IntelliJ IDEA이다. 2개 모두 사용해봤는데, 둘 다 괜찮다. Eclipse는 Scala IDE for Eclispe라는 plugin을 설치해야 하고, IntelliJ IDEA도 JetBrains에서 제공하는 Scala plugin을 설치해야 한다. 둘다 Syntax highlighting, debugging 등의 기능이 있어서 Vim이나 Emacs같은 에디터 보다 낫지 않나 싶다.

6. Hello World


그럼 간단한 프로그램을 만들고, debugging까지 해보겠다. 기본적인 순서는 다음과 같다.

  1. Eclipse 설치
  2. Scala IDE for Eclipse Plug-in 설치
  3. sbt 설치
  4. sbt용 디렉토리 구성
  5. sbt를 이용해 Eclipse 프로젝트 생성
  6. 소스 코드 작성
  7. Debugging

6.1 Eclipse 설치

Eclipse는 3.6(Helios) 버전을 설치한다.

6.2 Scala IDE for Eclipse

Eclipse용 scala plugin인 Scala IDE for Eclipse를 설치한다.

6.3 sbt 설치

이 링크를 이용하여 sbt를 설치한다.

참고로, sbt를 설명하는 wiki 페이지가 길지 않으니, 반드시 읽어보고 sbt의 개념이나 사용 방법을 알아두는 것이 나중에 시간을 줄일 수 있는 방법이다.

6.4 sbt용 디렉토리 구성

프로젝트의 기본 정보 및 사용하는 이 프로젝트에서 사용하는 플러그인을 설정하여 sbt용 디렉토리 및 설정파일을 구성한다. 이 부분은 sbt 메뉴얼을 참고하도록 한다.

6.5 sbt를 이용해 Eclipse 프로젝트 생성

앞에서 만든 sbt용 디렉토리로 들어가서 다음과 같이 입력하면 Eclipse용 프로젝트 파일인 .project와 .classpath가 생긴다.

> sbt eclipse

Ecilpse의 메뉴에서 ‘File’ > ‘‘Import…’를 클릭하고, 앞에서 만든 디렉토리를 선택하면 프로젝트를 열 수 있다.

6.6 소스 코드 작성

Ecilpse에서 앞에서 생성한 프로젝트를 열어보면 이미 ‘src/main/scala’ package가 생성된 것을 확인 할 수 있다. 이 package 밑에 App.scala 파일을 만들고 다음과 같이 입력한다.

1
2
3
4
5
object App {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

6.7 Debugging 하기

이제 거의 다 되었다. println에 breakpoint를 설정하고, 메뉴의 ‘Run’ > ‘Debug’를 선택한 후에 ‘Scala Application’을 선택하면 프로그램이 시작되고, debugger가 동작해서 breakpoint에서 멈추는 것을 확인할 수 있다. 위 소스 파일은 이 곳에서 다운로드 받을 수 있다.

7. Scala용 Framework


이제 Scala용 프로그램을 만들 준비는 끝났다. 지금부터는 웹서비스 개발을 위해 이용할 수 있는 Framework 중에 개인적으로 제일 괜찮다고 보이는 2가지를 소개하려고 한다.

7.1 Play Framework

Play Framework는 Ruby on Rails의 Java 버전이라고 보면 되겠다. MVC 패턴에 맞춰 개발할 수 있도록 해주고, 여러가지 편리한 library를 제공한다. 실제 대용량 서비스에서 많이 쓰이고 있는 framework이라 안정성에도 문제가 없다고 할 수 있겠다.

현재 stable한 1.x 버전에서는 scala를 부분적으로 지원해서 조금 아쉽다. 하지만, Play 2.0에서는 본격적으로 Scala를 지원한다. 2.0은 현재 RC버전이며, 곧 정식 버전을 release할 것으로 보인다.

7.2 Finagle

Finagle은 Twitter에서 back-end 서비스용으로 만든 framework이다. 서버 간의 통신을 지원하는데 특화 되어 있다. 무엇보다 Twitter에서 실제로 사용되기 때문에 주목 받고 있고, Tumblr등 다른 서비스에서도 이용되는 듯 하다. 기본적인 서버 간 통신 기능 외에 비동기 처리, 분산 처리, 그리고 Memchached, Redis 등을 지원한다. Twitter에서 어떤 식으로 Finagle을 사용하는 지에 대해서는 Twitter Engineering 블로그의 이 포스팅에 잘 설명이 되어 있다.

8. 마치며


당연하겠지만, 소프트웨어 개발에 있어 어떤 언어가 최고인지 정답은 없는 것 같다. 상황에 맞게 언어와 라이브러리 등을 선택해야 할 것이다. 성능과 확장성(scaling)이 매우 중요하고, 비교적 빠르게 개발해야 하는 경우 라면, 내가 생각하기에 Scala가 제일 적합한 선택인 것 같다. 단, Scala 개발자가 많지 않고 언어를 배우는데에 learning curve가 조금 있기 때문에, 개발자가 바뀌는 상황이 되었을 때 향후 유지보수는 조금 어려울 수도 있다는 점은 주의해야 한다.

무엇보다도 Scala의 장점은 succint한 syntax 덕에, 개발자가 프로그래밍 그 자체에 집중할 수 있고 이로 인해 프로그래밍이 재미있다는 점이다. 좀더 많은 개발자들이 Scala를 접해보았으면 하는 바램으로 두서없는 글을 마치겠다.