.NET CLI로 F# 시작하기

.NET CLI로 F# 시작하기

F#을 처음 시작할 때 어떤 도구로 만들어야 할지 막막할 수 있어요. 이 글에서는 Windows, macOS, Linux 어느 운영체제든 .NET CLI 하나만으로 F#을 시작하는 방법을 보여드릴게요. 콘솔 애플리케이션이 호출하는 클래스 라이브러리로 이루어진 다중 프로젝트 솔루션을 직접 만들어 보면서, 프로젝트가 어떻게 구성되고 서로 어떻게 연결되는지 확인해 봐요.

출처: https://learn.microsoft.com/en-us/dotnet/fsharp/get-started/get-started-command-line

본문

사전 준비 (Prerequisites)

시작하려면 먼저 최신 .NET SDK를 설치해야 해요.

이 글은 명령줄(터미널)을 다룰 줄 알고, 본인이 선호하는 텍스트 편집기가 있다는 걸 전제로 해요. 아직 마땅한 편집기가 없다면 Visual Studio Code가 F#용 텍스트 편집기로 훌륭한 선택이에요.

간단한 다중 프로젝트 솔루션 만들기

명령 프롬프트나 터미널을 열고 dotnet new 명령어로 FSharpSample이라는 이름의 솔루션 파일을 만들어요.

dotnet new sln -o FSharpSample

이 명령을 실행하면 다음과 같은 디렉터리 구조가 만들어져요.

FSharpSample
 ├── FSharpSample.sln

클래스 라이브러리 작성하기

FSharpSample 디렉터리로 이동할게요.

dotnet new 명령어를 사용해 src 폴더에 Library라는 이름의 클래스 라이브러리 프로젝트를 만들어요.

dotnet new classlib -lang "F#" -o src/Library

이 명령을 실행하면 다음과 같은 디렉터리 구조가 만들어져요.

└── FSharpSample
 ├── FSharpSample.sln
 └── src
 └── Library
 ├── Library.fs
 └── Library.fsproj

Library.fs의 내용을 다음 코드로 바꿔볼게요. 여기서는 들어온 값을 System.Text.Json으로 직렬화해 원본 값과 JSON 문자열을 함께 돌려주는 getJson 함수를 정의해요.

module Library

open System.Text.Json

let getJson value =
 let json = JsonSerializer.Serialize(value)
 value, json

dotnet sln add 명령어로 Library 프로젝트를 FSharpSample 솔루션에 추가해요. 이 명령은 프로젝트를 솔루션 파일에 등록해서, 솔루션이 이 프로젝트를 추적하고 빌드할 수 있게 해줘요.

dotnet sln add src/Library/Library.fsproj

dotnet build를 실행해 프로젝트를 빌드해요. 빌드하는 과정에서 해결되지 않은 의존성은 자동으로 복원돼요.

클래스 라이브러리를 사용하는 콘솔 애플리케이션 작성하기

dotnet new 명령어를 사용해 src 폴더에 App이라는 이름의 콘솔 애플리케이션을 만들어요.

dotnet new console -lang "F#" -o src/App

이 명령을 실행하면 다음과 같은 디렉터리 구조가 만들어져요.

└── FSharpSample
 ├── FSharpSample.sln
 └── src
 ├── App
 │ ├── App.fsproj
 │ ├── Program.fs
 └── Library
 ├── Library.fs
 └── Library.fsproj

Program.fs의 내용을 다음 코드로 바꿔요.

open System
open Library

[<EntryPoint>]
let main args =
 printfn "Nice command-line arguments! Here's what System.Text.Json has to say about them:"

 let value, json = getJson {| args=args; year=System.DateTime.Now.Year |}
 printfn $"Input: %0A{value}"
 printfn $"Output: %s{json}"

 0 // return an integer exit code

dotnet reference add 명령어를 사용해 Library 프로젝트에 대한 참조를 추가해요. 이 명령은 App.fsproj 파일에 <ProjectReference> 요소를 추가하고, 이를 통해 컴파일러에게 App 프로젝트가 Library 프로젝트에 의존한다는 것을 알려줘요.

dotnet add src/App/App.fsproj reference src/Library/Library.fsproj

이 명령은 App.fsproj 파일에 다음 XML을 추가해요.

<ItemGroup>
 <ProjectReference Include="..\Library\Library.fsproj" />
</ItemGroup>

: 이 단계를 건너뛰고 App 프로젝트를 바로 빌드하면 Library 모듈을 찾을 수 없어서 컴파일 오류가 나요. 이런 경우 dotnet add reference 명령을 실행하거나, 위에 나온 <ProjectReference> 요소를 App.fsproj 파일에 직접 추가하면 돼요.

dotnet sln add 명령어를 사용해 App 프로젝트를 FSharpSample 솔루션에 추가해요.

dotnet sln add src/App/App.fsproj

dotnet restore로 NuGet 의존성을 복원하고, dotnet build를 실행해 프로젝트를 빌드해요.

src/App 콘솔 프로젝트 디렉터리로 이동하고, Hello World를 인자로 넘기며 프로젝트를 실행해요.

cd src/App
dotnet run Hello World

그러면 다음과 같은 결과가 나와요.

Nice command-line arguments! Here's what System.Text.Json has to say about them:
Input: { args = [|"Hello"; "World"|] year = 2021 }
Output: {"args":["Hello","World"],"year":2021}

입력으로 넘긴 인자들이 익명 레코드(anonymous record)에 담겨 잘 직렬화되는 걸 볼 수 있어요.

더 알아보기 (Learn more)

다음으로는 Tour of F#를 살펴보면서 다양한 F# 기능을 더 알아보는 걸 추천해요.