End of Scala #4

이번 시간에는 Scala, Play, SBT에 대해서 살펴보겠습니다.

  1. Scala
    • 스칼라는 프로그래밍 언어입니다.스칼라는 “Scalable”과 “Language”의 합성어입니다. 스칼라의 특징으로는 빌드 시 자바 바이트 코드로 변환되어 JVM에서 동작합니다. JVM에서 작동하기 때문에 Java로 이루어진 많은 라이브러리를 스칼라에서 사용할 수 있습니다. 또한 함수형 패러다임과 객체지향 패러다임을 함께 제공하며, 타입 추론과 강력한 동시성, 패턴 매칭, 함수를 입급 객체로 다루는 특성을 갖습니다.
    • 2001년 마틴 오더스키(Martin Odersky)에 의해 디자인 됐으며, 2004년 공개됐습니다. 처음에는 Java 플랫폼과 .Net 플랫폼을 지원했지만 2012년 .Net 플랫폼에 대한 지원은 중단됐습니다. 이후 Odersky는 Typesafe라는 회사를 설립하고, 스칼라에 대한 컨설팅 및 교육에 대한 일을 하고 있습니다. Activator UI가 Typesafe라는 회사에서 개발된 걸 보면 Odersky와 Typesafe는 스칼라 진영에서 중요한 일을 여전히 하고 있습니다.
    • 스칼라로 가장 완벽하고 아름다운 프로그램인 “Hello World”를 만들려면 다음과 같이 코드를 작성하고, HelloWorld.scala 파일로 저장합니다. 스칼라 코드를 자바 바이트 코드로 변환하는 scalac를 터미널에서 사용해서 컴파일을 하고 scala로 HelloWorld를 실행하면 됩니다.
      // HelloWorld.scala 
      object HelloWorld extends App {
          println(“Hello, World!”)
      }
      스크린샷 2015-08-06 오전 10.41.03
  2. Play
    • 플레이는 프레임워크입니다. https://www.playframework.com/ 에서 확인할 수 있습니다. 최신 버젼은 2.4.2 Damiya로 플레이 프레임워크 홈페이지에서 다운로드 받을 수도 있지만, Typesafe 홈페이지에서 다운로드 받을 수도 있습니다. 2.2 이하 버젼의 플레이 프레임워크는 play 라는 커맨드를 통해 사용해왔지만, 2.3 이상의 플레이 프레임워크는 activator 커맨드를 통해 플레이 프레임워크를 사용합니다.
    • 2007년 자바 웹 어플리케이션을 쉽게 만들기 위해 개발 되었습니다. Zengularity 라는 회사의 내부 프로젝트로 시작됐으며 생산성, 웹아키텍쳐, 패키징에 대한 신선한 방식에 포커싱이 맞춰졌습니다. 2009년 Zengularity는 오픈 소스로 공개하기로 결정했으며, 많은 피드백을 받을 수 있었습니다.
    • 플레이 프레임워크는 5가지 기능에 초점이 맞춰졌습니다. 비동기 프로그래밍, 타입 안전성, 자바와 스칼라 네이티브 지원, 강려크한 빌드 시스템, 데이터 저장소와 모델 통합. HTTP 프로그래밍 모델을 통해 비동기 방식의 프로그래밍 모델을 지원합니다. 이러한 전통적인 방식의 웹 어플리케이션 외에도 Comet, 롱폴링, 웹 소켓 등도 지원합니다.
  3. SBT
    • SBT는 Scala Build Tool의 약자로 http://www.scala-sbt.org/ 에서 확인할 수 있습니다. SBT는 Typesafe에서 만든 스칼라 빌드 도구로, Activiator에 통합되어 있습니다. activator를 사용해 생성한 프로젝트는 ROOT의 project 하위의 build.properties에 보면 sbt.version에 빌드에 사용되는 SBT의 버젼을 확인할 수 있습니다.
      스크린샷 2015-08-10 오후 5.51.35
    • SBT는 스칼라로 작성되었고, 스칼라 빌드를 위한 편의 기능을 제공합니다. activator를 설치 했다면, activator 명령어를 사용해 작동하지만, sbt를 직접 설치 했다면 다음과 같이 프로젝트 ROOT에서 sbt를 명령어를 입력한 후 “run” 커맨드를 입력하면 컴파일 과정을 거친 후 코드가 실행됩니다.
      스크린샷 2015-08-10 오후 9.30.34
    • SBT는 build.sbt 파일에 빌드에 필요한 정보를 설정한 후 파일에 작성된 정보를 바탕으로 빌드 할 수 있습니다. activator를 사용해 생성된 프로젝트의 build.sbt는 다음과 같은 형태로 구성됩니다.
      스크린샷 2015-08-10 오후 9.35.51
      build.sbt 파일에는 프로젝트명, 스칼라 버젼, 스칼라 버젼, 라이브러리 의존성 등의 정보를 표시합니다. 자세한 정보는 다음 URL에서 확인할 수 있습니다.
      http://www.scala-sbt.org/0.13/tutorial/Basic-Def.html
    • SBT는 Interactive한 스칼라 빌드툴입니다. compile, clean, batch, reload 그리고 ~ compile 명령어를 사용해서 다양한 활용이 가능합니다. “~ compile” 명령어를 사용하면 소스 코드 변경을 감지하고 SBT가 자동으로 컴파일을 하게 됩니다.
      스크린샷 2015-08-10 오후 9.41.57

Scala, Play, SBT에 대해서 살펴봤습니다. activator라는 통합툴이 Play, SBT와 관련된 많은 부분을 다루고 있습니다. SBT나 Play를 직접 사용하기 위해서는 모두 직접 설치해서 사용하게 됩니다. 스칼라와 플레이에 대해서 자세히 알기 전까진 activator를 사용하는게 좋을 것 같네요. activator가 스칼라의 아버지 마틴 오더스키의 Typesafe에서 만들어진 것 이다 보니 추후에는 스칼라 표준이 되지 않을까 싶습니다.

지금까지는 개발 환경에 대해서 가볍게 살펴봤으니 다음 시간 부터는 진짜 스칼라와 플레이에 대해서 살펴보도록 하겠습니다.

End of Scala #3

End of Scala #1 – https://goodmorningcody.wordpress.com/2015/08/04/end-of-scala-1/
End of Scala #2 – https://goodmorningcody.wordpress.com/2015/08/04/end-of-scala-2/

앞서 개발환경을 구성하고, Activator를 사용해서 프로젝트를 생성/빌드/실행 과정에 대해서 살펴봤습니다.
(사실 스칼라 프로그래밍 언어 자체에 대한 이야기 보단 플레이 프레임워크에 대한 내용을 다뤘습니다.)
Activator UI에서 프로젝트를 생성할 때 “Play Scala Intro”라는 프로젝트 템플릿으로 프로젝트를 생성했습니다. JDK8을 사용한 빌드 및 실행이 정상적으로 됐으나, 사용자가 접속할 경우 다음과 같은 에러가 표시됐습니다.
스크린샷 2015-08-04 오후 9.35.01

people 이라는 테이블이 생성되어 있지 않아 발생하는 에러입니다. “Apply this script now!” 라는 버튼을 클릭하면 이름과 나이 정보를 입력할 수 있는 Form 페이지가 표시됩니다.
스크린샷 2015-08-05 오전 10.00.44

Activator UI를 통해 실행할 경우 위와 같은 서비스가 시작됩니다. 하지만 터미널에서 프로젝트의 ROOT로 이동한 후 “activator run” 커맨드로 실행하면 아래와 같이 “Your new application is ready”라는 메세지가 출력되는 웹페이지가 표시됩니다. 이러한 차이가 발생하는 이유는 추후 Activator에 대해서 살펴볼 때 확인하겠습니다.
스크린샷 2015-08-05 오전 10.07.56

이제 Play Scala 프로젝트의 구성을 바탕으로 어떻게 작동하는지 살펴보겠습니다. IntelliJ 14 CE 기준 스칼라 플러그인이 미리 설치되어 있으므로, Play Scala 프로젝트를 IntelliJ에 import합니다.
스크린샷 2015-08-05 오전 9.37.46 스크린샷 2015-08-05 오전 9.37.59 스크린샷 2015-08-05 오전 9.38.11 스크린샷 2015-08-05 오전 9.38.32

주의할 점은 Project SDK에 JDK8 즉 1.8 버젼의 JDK를 지정해야 한다는 것 입니다. 이제 IntelliJ에 import된 프로젝트 구조를 살펴보도록 합시다.
스크린샷 2015-08-05 오전 9.43.42

다양한 리소스가 프로젝트에 포함되어 있습니다. 다양한 프로젝트 리소스 중 가장 중요한 것은 app, conf, public 디렉토리입니다. app, conf, public 디렉토리의 프로젝트 리소스에 대해서 자세히 살펴봅시다. 플레이 프레임워크에 대한 내용은 플레이 홈페이지 https://www.playframework.com/ 를 참고했습니다. 특히 플레이 어플리케이션의 구조는 아래 페이지에서 확인할 수 있습니다.
https://www.playframework.com/documentation/2.4.x/Anatomy

  1. root
    플레이 스칼라 프로젝트의 빌드에 대한 명시는 build.sbt 파일에 작성합니다. 프로젝트 하위의 project 경로에는 .scala 파일을 사용해서 프로젝트 빌드에 대한 명시를 할 수 있습니다.
  2. app
    app 폴더의 하위에는 자바나 스칼라 소스, 템플릿 그리고 컴파일된 소스 등 실행 가능한 모든 리소스를 포함합니다. app 폴더 하위에는 MVC 아키텍쳐에 따라 controllers, models, views 라는 3가지 폴더를 사용합니다. 당연히 utils와 같이 필요에 따라 디렉토리를 추가할 수 있습니다.
  3. conf
    conf 폴더는 어플리케이션의 설정 파일을 포함합니다. 대표적으로 applications.conf 파일과 routes 파일이 있습니다. applications.conf 파일은 어플리케이션의 메인 설정 파일이고, routes는 라우팅 정보를 지정하는 파일입니다.
  4. public
    public 경로에는 웹 서버사가 직접 사용할 리소스를 저장합니다. 이 경로의 하위에는 images, css, javascripts 디렉토리가 위치합니다. public 디렉토리의 리소스는 conf 파일의 routes 설정에 의해 /assets URL에 매핑됩니다. 만약 원한다면 변경할 수 있습니다.

프로젝트의 구조를 살펴봤지만, 여전히 어떤 원리로 동작하는지 파악하긴 어려운 것 같습니다. 가장 큰 이유는 Scala, SBT, Activiator, Play, JDK, JVM이 우리가 만들 웹서비스에서 어떤 역활을 하는지 모르기 때문입니다. 프로젝트의 구조는 살펴봤으니, 다음 시간에는 Scala, SBT, Activiator, Play, JDK, JVM에 대해서 정리하는 시간을 갖겠습니다.

End of Scala #2

End of Scala #1 : https://goodmorningcody.wordpress.com/2015/08/04/end-of-scala-1/

End of Scala #1 에서 Scala Binaries, Typesafe Activator, Intellij Scala Plugin을 설치했습니다. 이번 시간은 activator ui를 통해 스칼라 Play 프레임워크 프로젝트를 생성하고, 생성한 프로젝트를 빌드하는 과정을 살펴보겠습니다.

  1. activator ui 실행

    activiator가 설치되어 있다면, 터미널에서 “activator new”를 이용해서 프로젝트를 생성할 수도 있지만, “activator ui”를 이용해서 프로젝트를 생성하겠습니다.

    스크린샷 2015-08-04 오후 8.18.03
    “activator ui”를 입력했더니, 로컬 환경에서 웹서비스가 실행되며 브라우저에 activator ui 창이 나타납니다.

  2. activator ui에서 Play Scala Intro 프로젝트 생성

    검색창에 “play scala”를 입력하면 나타나는 “Play Scala Intro” 템플릿을 선택하고, 생성할 프로젝트의 경로를 지정합니다. “Create App” 버튼을 클릭하면 프로젝트 템플릿을 Github에서 복사한 후 템플릿을 바탕으로 프로젝트를 로컬에 생성할 것 이빈다.
    스크린샷 2015-08-04 오후 8.24.52

    스크린샷 2015-08-04 오후 8.26.44정상적으로 프로젝트가 생성됐다면, SBT(Simple Build Tool)에 의해 빌드가 됩니다.

  3. JDK8 트러블 슈팅

    잘 될지도 모르지만, 어디선가 문제가 생길지도 모릅니다. Activator UI의 어딘가에서 로그를 찾아보면 다음과 같은 에러가 출력된걸 확인할 수 있습니다.
    java.lang.UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0

    2015년 8월 4일 기준 최신 Scala, Play, Activator를 사용하려면 JDK8 이상의 버젼을 사용해야 합니다. 해당 이슈는 아래 URL에서 확인했습니다.
    https://github.com/typesafehub/config/issues/321

    JDK 버젼은 안드로이드 개발 과정에서도 중요하므로 무조건 JDK8을 올려서 사용하는 것이 아닌 jenv 와 같은 툴을 사용해서 JDK 버젼에 대한 관리를 용이하게 합시다. jenv에 대한 자세한 내용은 다음 URL에서 확인할 수 있습니다.
    http://hanxue-it.blogspot.kr/2014/05/installing-java-8-managing-multiple.html

    jenv 설치가 완료됐다면 위 JDK8을 다운로드 받습니다.
    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    설치 완료된 JDK8과 기존 JDK7의 home 경로를 터미널에서 “jenv add ******”를 사용해 추가합니다. 정상적으로 JDK8이 설치되고 경로가 추가됐다면 터미널에서 “jenv versions” 입력 시 설치 및 추가된 JDK 목록이 표시됩니다.

    스크린샷 2015-08-04 오후 8.51.04JDK8을 사용하도록 하기 위해 터미널에서 “jenv local oracle64-1.8.0.51″를 입력해서 사용할 JDK의 버젼을 JDK8로 설정합니다. jenv versions 입력 시 (set by /Users/cody/scala/.java-version)이 설정된 JDK 버젼에 위치할 것 입니다. JDK8 버젼을 설치하고, activator ui에 반영하기 위해서는 activator ui를 종료하고 재실행해야 합니다. activator ui를 종료하고, 재실행해 봅시다.

  4. 프로젝트 빌드

    JDK8이 잘 설정됐고, activator ui를 실행했다면 Other exist apps에 “play-scala-intro”를 클릭하여 앱의 대쉬보드 화면으로 이동합니다.
    스크린샷 2015-08-04 오후 9.14.55

    play-scala-intro 대쉬보드의 좌측 빌드 메뉴를 클릭하면 빌드 상황을 확인할 수 있습니다. 기본 dependency가 걸려있는 모듈을 다운로드 받고, 기본 프로젝트 소스를 컴파일해서 문제가 없다면 노란색 글씨로 아래와 같은 내용이 표시됩니다.
    스크린샷 2015-08-04 오후 9.13.28

  5. 프로젝트 실행

    프로젝트 실행은 앱 대쉬보드 좌측의 “Run” 메뉴를 클릭하고, 중앙의 “Run” 버튼을 클릭하면 됩니다.

    스크린샷 2015-08-04 오후 9.29.59
    실행이 완료되면 웹브라우저의 주소창에 http://localhost:9000을 입력합니다.

    스크린샷 2015-08-04 오후 9.32.28어떤 화면이 나올지 기대를 해보지만, 데이터 베이스로 인해 에러 페이지만 표시될 것 입니다.

    스크린샷 2015-08-04 오후 9.35.01앱이 실행은 됐지만, 데이터베이스 이슈로 인해 정상적인 결과를 얻을 수는 없는 상황입니다. Scala Play 프레임워크 프로젝트에서의 데이터베이스 설정과 관련된 내용은 추후에 살펴보고 오늘 내용은 여기서 마치겠습니다.

End of Scala #1

“End of Scala” 첫번 째 시간입니다.
스칼라를 시작하기 위해서는 Scala Binaries, Typesafe Activator, Scala IDEs를 준비해야 합니다. 이 모든 것은 http://www.scala-lang.org/download/ 에서 다운로드 받을 수 있습니다.

  • Scala Binaries

    스칼라 공식홈페이지에서 scala-2.11.7.tgz 파일을 다운로드 받고, 로컬에 압축을 풉니다. 로컬에 압축을 풀었다면, 스칼라 인터프리터와 스칼라 컴파일러를 커맨드 라인에서 REPL로 사용하기 위해 $SCALA_HOME과 #PATH에 대한 환경 변수와 경로를 .bash_profile에 추가합니다.
    (brew, port 등을 사용하면 보다 간편하게 설치할 수 있습니다. 터미널에서 “brew install scala”를 입력합니다. brew를 사용한 설치의 경우 2015년 8월 4일 현재 2.11.6 버젼만 설치할 수 있습니다.)

  • Typesafe Activiator

    타입세이프 액티베이터는 브라우저나 커맨드라인에서 스칼라 개발을 도와주는 도구입니다. http://www.typesafe.com/get-started 에서 다운로드 받고 압축을 풀어줍니다. 압축을 풀면 ROOT 폴더에 activator 유닉스 실행 파일이 있는데, 파일을 실행하면 터미널과 웹브라우저에 Typesafe Activator가 실행됩니다. 보다 간편한 사용을 위해 .bash_profile의 환경 변수 $PATH에 그 경로를 추가합시다.
    스크린샷 2015-08-04 오전 9.37.44
    스크린샷 2015-08-04 오전 9.40.53

  • Scala IDEs

    스칼라 편집은 Eclipse, IntelliJ, NetBeans 등 다양한 IDE에서 플러그인만 설치하면 사용할 수 있습니다. IntelliJ 14 CE에서 프로젝트를 생성해 봅시다. Java 탭을 클릭하면 Scala 프레임웍을 선택할 수 있는 체크박스가 표시됩니다. IntelliJ 14 CE에서는 따로 설치할 필요는 없이 바로 사용하면 됩니다.스크린샷 2015-08-04 오전 9.54.58

이제 스칼라를 가지고 놀 준비가 완료됐는지 확인하기 위해 터미널에서 scala를 입력해 봅시다. 스칼라 REPL이 실행되면 print(“hello world”) 라고 입력하면 REPL은 hello world라는 값이 출력됩니다.
스크린샷 2015-08-04 오전 9.58.45

준비가 잘 된 것 같으니 다음 시간 부터는 스칼라 프로그래밍의 문법에 대해서 다루도록 하겠습니다.