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` 파일을 사용하여 정의할 수 있다. 다음은 `build.sbt` 빌드 정의의 예시다:


```scala
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는 각 빌드 명령마다 호출될 수 있으며, 명령이 주어지지 않으면 대화형 모드로 진입할 수 있다. 현재 빌드의 빌드 결과물을 삭제하려면 다음과 같이 한다:


```bash
$ sbt clean
```


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

```bash
$ sbt "testOnly Foo" publish
```


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

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

## 비교

빌드 도구 중 **sbt**의 주요 대안으로는 Gradle과 아파치 메이븐이 있으며, 둘 다 JVM 플랫폼에서 개발된 프로젝트를 위한 확립된 빌드 도구다. 스칼라 생태계 내에서 또 다른 인기 있는 빌드 도구는 Mill이다. **sbt**, Gradle, 아파치 메이븐, Mill 사이의 선택은 프로젝트의 특정 요구 사항과 도구에 대한 익숙함에 따라 달라진다. 주로 스칼라로 작업하는 경우 **sbt**나 Mill이 더 적합할 수 있으며, 여러 언어나 기술을 사용하는 경우 다른 두 가지 중 하나가 더 나은 선택이 될 수 있다.

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

## 각주

## 외부 링크
*

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