Sbt (소프트웨어)

sbt(원래 이름은 simple build tool이었으나, 현재는 특별한 약자가 아님)는 자바, 스칼라, 코틀린 프로젝트를 빌드할 수 있는 오픈 소스 빌드 도구다. 애플리케이션, 라이브러리 및 프레임워크를 구성, 컴파일, 테스트 및 패키징하는 절차를 간소화하는 것을 목표로 한다. sbt는 적응성이 매우 뛰어나 개발자가 프로젝트의 특정 요구 사항에 따라 빌드 프로세스를 맞춤 설정할 수 있다.

sbt는 스칼라 프로젝트를 쉽고 효율적으로 빌드하고 관리할 수 있도록 광범위한 기능을 제공한다. 주요 기능은 다음과 같다:

 의존성 관리: 프로젝트 의존성을 자동으로 다운로드하고 처리하는 기능을 통해 sbt는 외부 라이브러리와 프레임워크의 사용을 용이하게 한다.
 증분 컴파일: sbt는 변경된 코드 부분만 다시 컴파일할 수 있어 개발 주기 동안 상당한 시간을 절약해 준다.
 사용자 정의 가능한 빌드 프로세스: sbt는 고도로 맞춤 설정이 가능하여 개발자가 사용자 정의 빌드 설정을 정의하고 프로젝트의 고유한 요구 사항에 맞춰 빌드 프로세스를 구성할 수 있다.
 플러그인 생태계: sbt는 코드 품질 검사, 배포 자동화, 테스트 커버리지 보고서와 같은 추가 기능을 통합하여 기능을 확장하는 플러그인 생태계를 갖추고 있다. 새로운 플러그인의 개발과 통합이 전적으로 지원되고 권장된다.
 지속적인 컴파일 및 테스트: sbt를 사용하면 소스 파일이 수정될 때마다 시스템이 자동으로 다시 컴파일하고 테스트를 다시 실행하도록 설정할 수 있다.
 멀티 프로젝트 빌드: 여러 스칼라 프로젝트를 작업하는 개발자를 위해 sbt는 단일 빌드 내에서 이를 관리할 수 있는 유용한 기능을 제공한다.
 대화형 셸: sbt에는 대화형 셸이 장착되어 있어 개발 프로세스 전반에 걸쳐 작업과 명령을 실행할 수 있는 편리한 방법을 제공한다.
 병렬 작업 실행: sbt는 작업을 병렬로 실행할 수 있어 대규모 프로젝트의 빌드 시간을 단축한다.
 IDE와의 통합: 개발 경험을 최적화하기 위해 sbt는 IntelliJ IDEA 및 비주얼 스튜디오 코드와 같은 대중적인 통합 개발 환경(IDE)과 원활하게 통합된다.

sbt는 스칼라 커뮤니티에서 사실상 표준 빌드 도구이며, 예를 들어 스칼라 2 및 스칼라 3 컴파일러 자체, 플레이 프레임워크, 유명한 체스 서버인 Lichess 등에서 사용된다. sbt 프로젝트는 "부트스트랩"되어 있다. 즉, 자기 자신을 빌드하기 위해 sbt를 사용하며 개밥 먹기를 긍정적인 특징으로 간주한다.

 역사 
sbt는 2008년 마크 하라(Mark Harrah)에 의해 오픈 소스 프로젝트로 처음 출시되었다. 수년에 걸쳐 수많은 릴리스를 통해 크게 발전해 왔으며, 각 릴리스마다 새로운 기능, 버그 수정 및 개선 사항이 도입되었다. 도입된 주요 변경 사항과 혁신을 포함한 주요 릴리스 개요는 다음과 같다:

 sbt 0.3.2 (2008): sbt의 첫 번째 공식 릴리스다. 프로젝트 정의, 의존성 관리, 컴파일과 같은 기본적인 기능을 도입했다.
 sbt 0.7 (2009): 스칼라 프로젝트를 구축하고 관리하기 위한 기본 프레임워크를 확립했다. 주요 기능으로는 증분 컴파일, 의존성 관리, 간단한 작업 실행 등이 있었다.
 sbt 0.10 (2011): 빌드 정의 구문을 대대적으로 개편하여 더욱 표현력이 풍부하고 유연하게 만들었다. 성능, 의존성 관리 및 구성 측면에서도 향상이 있었다.
 sbt 0.12 (2012): 멀티 모듈 프로젝트에 대한 지원이 개선되었고, 사용자 정의 구성을 정의하는 기능과 단순화된 플러그인 개발 기능이 추가되었다.
 sbt 0.13 (2013): 사용성과 성능에 집중했다. 이 버전에서는 프로젝트를 생성하고 관리하기 위한 웹 기반 도구인 액티베이터(Activator)가 도입되었다. 다른 기능으로는 증분 매크로 컴파일, 빌드 정의 오류 처리 개선, 다양한 성능 최적화가 포함되었다. 0.13 버전은 이후 4년 동안 주요 sbt 버전으로 유지되었다.
 sbt 1.0 (2017): 성능과 안정성에 중점을 두고 sbt 코드베이스에 상당한 변화를 도입하는 동시에 이전 버전과의 호환성을 최대한 유지하려고 시도했다. 새로운 기능으로는 작업 및 설정을 정의하기 위한 통합 슬래시 구문, 개선된 의존성 관리, 빌드 정의에 사용되는 언어 버전으로 스칼라 2.12 채택 등이 있다. 또한 새로운 Zinc 1.0 증분 컴파일러로 전환하여 증분 컴파일 성능을 더욱 향상시켰다.
 sbt 1.1 (2018): 이 릴리스에서는 IDE 및 기타 도구가 언어 서버 프로토콜(LSP)을 통해 sbt와 상호 작용할 수 있도록 하는 sbt 서버를 출시했다. 또한 Scala.js 및 Scala Native에 대한 크로스 빌드 지원을 추가하고 다양한 작업의 성능을 개선했다.
 sbt 1.3 (2019): 이 버전은 쿠르시에(Coursier)를 기본 의존성 관리자로 채택하여 의존성 해결 속도를 높임으로써 사용자 경험을 크게 개선했다. 또한 빌드 캐싱 메커니즘 개선 및 JDK 11 지원이 추가되었다.
 sbt 1.5 (2021): 스칼라 3에 대한 지원이 추가되었다. 또한 BSP(빌드 서버 프로토콜) 지원이 강화되어 IDE와의 통합이 개선되었다.
 sbt 1.8 (2022): 이 릴리스에서는 쿠르시에 업데이트와 개선된 Ivy 지원이 포함되었다.
 sbt 1.9 (2023): 쿠르시에 추가 업데이트와 새 프로젝트 생성을 돕는 텍스트 기반 메뉴가 추가되었다.

 빌드 파일 
sbt 빌드는 .sbt 파일을 사용하여 정의할 수 있다.sbt: .sbt build definition 다음은 build.sbt 빌드 정의의 예시다:

val scalaTest   = "org.scalatest" %% "scalatest" % "3.2.14"
val akkaVersion = "2.6.20"
val akkaActor   = "com.typesafe.akka" %% "akka-actor" % akkaVersion
val akkaCluster = "com.typesafe.akka" %% "akka-cluster" % akkaVersion

// 이 빌드에 사용되는 스칼라 버전을 2.13.10으로 설정한다.
ThisBuild / scalaVersion := "2.13.10"
ThisBuild / version      := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"

lazy val root = (project in file("."))
  .aggregate(helloCore)
  .dependsOn(helloCore)
  .settings(
    name := "Hello",
    // 테스트용 단일 의존성을 추가한다.
    libraryDependencies += scalaTest % Test
  )

lazy val helloCore = (project in file("core"))
  .settings(
    name := "Hello Core",
    libraryDependencies += scalaTest % Test,
    // 여러 의존성을 추가한다.
    libraryDependencies ++= List(akkaActor, akkaCluster)
  )

 사용 예시 
sbt는 각 빌드 명령마다 호출될 수 있으며, 명령이 주어지지 않으면 대화형 모드로 진입할 수 있다. 현재 빌드의 빌드 결과물을 삭제하려면 다음과 같이 한다:

$ sbt clean

한 줄에 여러 명령을 사용할 수 있다. "Foo"라는 이름의 단일 테스트를 실행한 다음 내보낸 jar 파일을 배포하려면 다음과 같이 한다:
$ sbt "testOnly Foo" publish

 확장성 및 통합 
sbt의 기능은 플러그인 아키텍처를 통해 확장될 수 있다. 커뮤니티에서 기여한 플러그인들은 서명, 패키징, 아티팩트 배포 및 릴리스, 블로그나 데이터베이스와 같은 다른 서비스 연결, 또는 기타 기술과의 통합과 같은 영역을 다룬다.

IntelliJ IDEA와 VS Code 모두 스칼라 플러그인을 통해 sbt를 지원한다. 두 IDE 모두에서 초기 sbt 빌드 파일을 사용하여 새 프로젝트를 생성할 수 있으며, 프로젝트에 이미 sbt 빌드 파일이 포함된 경우 이를 사용하여 해당 IDE용 프로젝트 구성을 생성할 수 있다.

 비교 

빌드 도구 중 sbt의 주요 대안으로는 Gradle과 아파치 메이븐이 있으며, 둘 다 JVM 플랫폼에서 개발된 프로젝트를 위한 확립된 빌드 도구다. 스칼라 생태계 내에서 또 다른 인기 있는 빌드 도구는 Mill이다. sbt, Gradle, 아파치 메이븐, Mill 사이의 선택은 프로젝트의 특정 요구 사항과 도구에 대한 익숙함에 따라 달라진다. 주로 스칼라로 작업하는 경우 sbt나 Mill이 더 적합할 수 있으며, 여러 언어나 기술을 사용하는 경우 다른 두 가지 중 하나가 더 나은 선택이 될 수 있다.
sbtGradle아파치 메이븐Mill언어 및 대상 사용자스칼라 및 자바 프로젝트를 위해 특별히 설계되었다. 스칼라 생태계의 고유한 요구 사항을 충족하는 기능을 제공한다. 스칼라 프로젝트에서 가장 빈번하게 사용된다.자바, Groovy, 코틀린, 스칼라 등을 포함한 여러 언어를 지원하는 범용 도구다. 자바 및 코틀린 프로젝트에서 가장 빈번하게 사용된다.자바 프로젝트에 사용되지만 스칼라, Groovy, 코틀린과 같은 플러그인을 통해 다른 프로그래밍 언어도 지원할 수 있다. 자바 프로젝트에서 가장 빈번하게 사용된다.주로 스칼라를 대상으로 하지만, 스칼라/자바 혼합 프로젝트에서 자바 코드를 컴파일하는 기능을 지원한다. 스칼라 프로젝트에서 자주 사용되며, 특히 빌드 도구의 단순성과 예측 가능성을 중시하는 개발자들에게 매력적이다.빌드 파일 구문빌드 파일은 스칼라로 작성되며, 빌드 정의 중에 스칼라의 표현력과 타입 안전성을 활용한다.빌드 파일은 Groovy 또는 코틀린으로 작성할 수 있다. 구문은 선언적인 경향이 있다.POM(Project Object Model) 파일을 작성하기 위해 XML을 사용한다. 구문은 더 장황하고 선언적이며, 표준화된 프로젝트 구조와 설정보다 관례(convention over configuration)를 선호한다.빌드 파일에 일반 스칼라를 사용한다. 빌드 정의는 스칼라 객체 정의로 작성되며 작업은 해당 객체 내의 메서드로 정의된다.증분 컴파일코드에서 변경된 부분만 컴파일하는 증분 컴파일 기능을 제공하여 개발 프로세스 속도를 높인다.자바 및 코틀린 프로젝트에 대한 증분 컴파일도 지원하지만, 스칼라 증분 컴파일 기능은 sbt만큼 발달하지 않았다.기본적으로 증분 컴파일을 지원하지 않는다. 스칼라 프로젝트의 경우 scala-maven-plugin과 같은 플러그인을 통하거나, 자바 프로젝트의 경우 java-compiler-plugin의 증분 컴파일 기능을 통해 활성화할 수 있다.증분 컴파일 기능을 제공한다. 또한 작업 출력의 공격적인 캐싱과 각 작업에 대한 격리된 환경을 사용하여 빌드의 속도와 정확성을 더욱 향상시킨다.확장성 및 플러그인광범위한 플러그인 생태계를 제공하여 개발자가 빌드 도구의 기능을 확장할 수 있게 한다.수많은 언어와 플랫폼에서 더 널리 받아들여졌기 때문에 Gradle의 플러그인 생태계는 sbt보다 더 광범위하고 다양하다.오랜 역사와 자바 커뮤니티 내의 폭넓은 수용 덕분에 sbt보다 더 크고 성숙한 플러그인 생태계를 보유하고 있다.sbt보다 플러그인 생태계는 작지만, 다른 방식으로 확장성을 지원한다.

Mill에서는 재사용 가능한 모듈과 라이브러리를 빌드 파일 내에서 직접 일반 스칼라로 정의할 수 있다. 또한 빌드 파일에서 타사 스칼라 라이브러리를 가져와서 사용할 수도 있다.성능증분 컴파일 및 병렬 작업 실행과 같은 성능 최적화 기법을 사용하지만, 결과는 프로젝트 복잡성과 특정 사용 사례에 따라 달라진다.성능을 강조하며, 백그라운드에서 실행되는 데몬 프로세스를 활용하여 빌드 속도를 높인다.기본적으로 증분 컴파일이나 병렬 실행을 지원하지 않는다. 두 가지 모두 플러그인과 빌드 도구 옵션을 사용하여 달성할 수 있다.증분 컴파일과 병렬 실행을 지원한다. 일반적으로 캐싱에 대해 더 공격적인 접근 방식을 취하는 것으로 간주되며, 특히 대규모 프로젝트의 경우 sbt에 비해 더 빠른 증분 빌드 시간을 제공하는 경우가 많다.빌드 생명 주기빌드 정의를 위해 복잡한 DSL(도메인 특화 언어)을 사용하여 빌드 프로세스에 대해 더 세밀한 제어를 제공한다.DSL이 sbt보다 단순하고 선언적이며 초보자에게 더 직관적일 수 있다.compile, test, package, install 등과 같이 잘 정의된 단계로 구성된 고정된 빌드 생명 주기를 도입한다. 이를 통해 메이븐은 프로젝트 전반에 걸쳐 일관된 구조를 제공하지만 유연성은 떨어진다.빌드는 작업(task) 단위로 정의된다. 각 작업은 모듈 컴파일, 테스트 실행, 패키지 생성 등 빌드에서의 작업 단위를 나타낸다. 작업은 다른 작업에 의존할 수 있으며, Mill이 적절한 순서로 작업을 실행하도록 관리한다.커뮤니티주로 스칼라 프로그래밍 언어에 집중된 활발하고 지원적인 커뮤니티를 가지고 있다.커뮤니티가 sbt보다 더 광범위하고 다양하며 다양한 프로그래밍 언어와 기술에 중점을 둔다.커뮤니티가 더 크고 다양하며 여러 프로그래밍 언어와 기술을 다룬다.Mill은 활발하게 개발되는 오픈 소스 프로젝트다. 주변 커뮤니티가 sbt만큼 크거나 자리를 잡지는 않았지만, 활발하고 참여도가 높다.

 같이 보기 
 빌드 자동화 소프트웨어 목록

 각주 

 외부 링크 

분류:컴파일 도구
분류:빌드 자동화
분류:자바 개발 도구
분류:스칼라로 작성된 자유 소프트웨어
분류:BSD 라이선스 소프트웨어