[SCALA] SBT로 패키징 하기

오현우·2022년 10월 22일
0

패키지 의존성 관리

간단한 프로젝트라면 모르겠지만 조금만 복잡한 프로젝트 단계에서 많은 패키지들을 설치하게 되고 그러한 패키지의 의존성을 관리하는 것은 쉽지 않은 일이 된다.
때문에 이런 패키지 의존성을 체계적으로 관리하기 위해서 많은 언어에서 다양한 방법들을 도입한다.

파이썬에서의 의존성 관리

내가 주로 사용하는 파이썬에서는 패키지 의존성을 pip와 pyvenv를 통해 requirment들을 명시해 패키지들을 관리한다.

Scala에서의 의존성 관리

스칼라는 JVM 위에서 동작하는 언어이며 컴파일 되어야 하는 언어이기 때문에 빌드시 폴더 구조가 복잡하며 특히 많은 패키지의 의존성 및 프로젝트 형상유지를 위해서 sbt 라는 빌드 툴을 사용한다.

간단하게 스칼라 SBT로 빌드해보기

공식 독스에 나온 순서대로 진행하는 것이 스칼라 폴더 구조를 명확하게 알 수 있으므로 진행해 보자.

빌드할 폴더 세팅하기

$ mkdir foo-build
$ cd foo-build
$ touch build.sbt

그러면 빌드할 폴더안에 build.sbt 가 생성이 된다.
해당 폴더에서 sbt shell을 실행시켜보자.

정상적으로 작동이 된다.

해당 쉘에서 compile을 입력해서 기계어로 번역할 수도 있고, 해당 쉘을 종료한 뒤 sbt compile 엔트리포인트로 컴파일하는 방법도 존재한다.

폴더 구조를 아래와 같이 구성한 뒤 vi나 nano를 사용해서 해당 코드를 만들자.
src/main/scala/example

Hello.scala

package example

object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello")
  }
}

main 함수 실행시켜보기

우리가 스칼라 코드로 작성한 것을 sbt를 활용해 빌드해보자.

해당 폴더에서 sbt 쉘로 들어간 후 run을 실행시켜 보자.

sbt:foo-build> run
[info] running example.Hello 
Hello
[success] Total time: 1 s, completed 2022. 10. 21 오후 5:59:37

우리가 작성한 코드가 정상적으로 작동한다.

프로젝트 관리하기

우리는 sbt로 빌드할 때 참조하는 파일인 build.sbt를 활용하여 프로젝트의 세팅에 필요한 형상관리 및 프로젝트 세팅들을 여기서 한다.

ThisBuild / scalaVersion := "2.13.6"
ThisBuild / organization := "com.example"

lazy val hello = (project in file("."))
  .settings(
    name := "Hello"
  )

위와 같이 build.sbt를 적용하여 프로젝트의 이름 그리고 org 스칼라 버젼들을 정의한다.

SBT를 실행시키니 해당 프로젝트의 이름이 잘 나온다.

라이브러리 의존성 추가

build.sbt

ThisBuild / scalaVersion := "2.13.8"
ThisBuild / organization := "com.example"

lazy val hello = (project in file("."))
  .settings(
    name := "Hello",
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test,
  )

위와 같이 스칼라 코드를 테스트 할 수 있는 라이브러리를 추가하자.

이제 테스트 코드를 작성해 우리가 적절한 코드를 실행시키고 있는지 확인해보자.

h 는 H 가 아니었다! 헉!

Agregate And dependsOn

해당 내용은 프로젝트의 세부 프로젝트별 의존성을 설정하는 것과 각 프로젝트 수행시 같이 컴파일할 세부 프로젝트들을 정의한다.

Aggregate: 프로젝트 컴파일할 때 같이 컴파일 할 녀석들을 지정하는 것
dependsOn: 컴파일시 해당 프로젝트가 반드시 참조해야할 녀석들을 제공

해당 내용은 아래의 커뮤니티를 참조하는 것이 더욱 적절하다.

https://stackoverflow.com/questions/58321263/when-do-you-need-aggregate-over-dependson

마치며

해당 내용은 내가 스칼라를 처음 접했을 때 도커와 굉장히 비슷하다고 느꼈다.
해당 서브 프로젝트들을 레이어라고 했을 때 각각의 레이어 중첩을 통해 큰 틀의 프로젝트를 완성시켰다.

sbt는 확실히 편리한 툴이다. 전반적인 환경세팅 의존성 관리등 컴파일 과정에서 신경써야 할 것들을 모두 관리할 수 있게 도와준다. 하지만 해당 내용에 대해 깊게 알기는 쉽지 않았다. 때문에 지속적으로 공부하면서 내용을 채워 나갈 예정이다.


참조
https://www.scala-sbt.org/1.x/docs/index.html

profile
핵심은 같게, 생각은 다르게

0개의 댓글