니름 스프린트 사전 준비
따라하다가 잘 되지 않을 때는 프로젝트 대화방에 오셔서 물어보시면 도와드립니다.
스프린트를 하기 전에, 니름이 어디에 쓰는 소프트웨어인지 감을 잡을 필요는 있겠죠. 개괄적인 소개는 아래 발표 자료를 참고해주세요.
-
RPC 프레임워크 제작 삽질기 (파이콘 APAC 2016)
참고로 이 발표 이후에 추가된 기능에 대한 설명은 빠져있습니다. 또, 예제 코드에 나온
boxed
예약어는 이후unboxed
로 바뀌었으니 참고 바랍니다. -
니름: 쉬운 SOA 단위 테스트 (파이콘 한국 2017)
빌드 환경을 준비하기 전에, 우선 니름을 한번 써보면 좋습니다. 니름 문법이 어떻게 생겼는지 보기 위해 니름 컴파일러 저장소에 들어있는 예제 패키지를 열어봅시다.
각 파일들의 내용은 다음과 같습니다. (꼭 내용을 전부 이해할 필요는 없으니, 어떤 모양인지만 보셔도 됩니다.)
-
package.toml
: 니름의 빌드 단위는 한 .nrm 파일이 아니라, 패키지 디렉토리 단위입니다.package.toml
은 패키지 디렉토리의 가장 바깥쪽에 위치하며, 해당 패키지 디렉토리를 빌드할 때 사용될 설정을 담습니다. (파이썬 패키지의 setup.py나 자바스크립트 패키지의 package.json 같은 것입니다.)이 파일의 자세한 설명은 문서에 써져있으나, 굳이 지금 숙지할 필요는 없습니다.
-
product.nrm
: 니름의 가장 기본적인 구조인 레코드(record
)와 열거형(enum
)을 정의하는 예제입니다. 인터넷 쇼핑몰의 제품과 제품의 가격, 그리고 주문을 담는 시나리오입니다. 또한, 파이썬의 딕셔너리에 해당하는 맵 자료형과, 파이썬 3.5에 추가된typing.Optional[T]
에 해당하는 옵션 자료형을 쓰는 것도 보여줍니다. -
shapes.nrm
: 니름의 좀더 복잡한 구조인 공용체(union
)와 언박스드 자료형(unboxed
)을 정의하는 예제입니다. 뒷 이름(behind name)을 별도로 정하는 예제도 보여줍니다. 아주 간단한 기하학의 거리와 점, 도형을 니름으로 정의합니다. -
address.nrm
: 니름 패키지 내에서 다른 모듈에 정의된 자료형을 임포트하는 예제입니다. 주소지와 좌표를 담는 자료형을 정의합니다. -
countries.nrm
: 위address.nrm
예제에서 사용할 ISO 3166-1 코드를 열거형으로 정의하는 예제입니다. -
builtins.nrm
: 니름에 내장된 기본 자료형을 소개합니다. -
pdf-service.nrm
: 실제 서로 통신하는 서비스를 만들 때 필요한 인터페이스를 정의하는 예제입니다. 서비스에서 제공하는 메서드들을 나열하고, 각 메서드가 받는 인자와 결과의 자료형, 그리고 오류가 날 경우 오류의 자료형을 정의하는 것을 보여줍니다. 웹 문서의 URI나 HTML 문자열, 또는 마크다운 텍스트를 렌더링한 PDF를 바이너리로 돌려주는 가상의 서비스 시나리오입니다.
이 예제를 직접 빌드해봅시다. 우선 최신의 야간 빌드 실행 바이너리를
다운로드합니다. 이하의 예에서는 해당 실행 바이너리를 적당히 PATH
경로에
위치시키고, 이름은 nirum.exe
또는 nirum
으로 바꿨다고 가정합니다.
(물론 리눅스나 맥에서는 실행 권한도 줘야 합니다.)
먼저 예제가 들어있는 소스 코드를 받습니다.
git clone git://github.com/spoqa/nirum.git
cd nirum/
그 뒤 아래 명령으로 examples/
디렉토리에 들어있는 예제 니름 패키지를
파이썬으로 컴파일합니다.
nirum -t python -o out/ examples/
위 nirum
명령의 각 옵션은 다음과 같습니다.
-
-t
/--target
: 어떤 언어의 소스 코드로 컴파일할지를 결정합니다. 현재는 파이썬(python
)과 HTML 문서(docs
)만 지원합니다. (현재 타입스크립트 작업이 진행중입니다.) -
-o
/--output-dir
: 컴파일된 결과 코드가 저장될 디렉토리의 경로입니다. 해당 경로에 디렉토리가 없으면 알아서 생성합니다. -
마지막의 인자는 컴파일할 니름 소스 코드가 들어있는 패키지 디렉토리의 경로입니다.
package.toml
파일이 들어있는 디렉토리여야 합니다.
따라서 위 명령을 실행하면 out/
디렉토리가 생기고 그 안에 파이썬 소스 코드들이
생성됩니다. 생성된 파이썬 패키지를 시범 사용해보기 위해, 임시 가상 환경을
만들어서 설치해봅시다.
python3 -m venv tmpenv
. tmpenv/bin/activate # 윈도(cmd.exe)의 경우에는 tmpenv\bin\activate
# 윈도(파워셸)의 경우에는 tmpenv\bin\activate.ps1
pip3 install -e out/
설치됐으면 python3
명령으로 파이썬 대화형 셸을 실행해서 설치된 패키지를
임포트하여 써볼 수 있습니다.
>>> from shapes import *
>>> r = Rectangle(upper_left=Point(Offset(5.), Offset(10.)),
... lower_right=Point(Offset(20.), Offset(30.)))
>>> isinstance(r, Shape)
True
>>> isinstance(r, Rectangle)
True
>>> isinstance(r, Circle)
False
>>> r.__nirum_serialize__()
{'_tag': 'rectangle',
'_type': 'shape',
'lower_right': {'_type': 'point', 'top': 30.0, 'x': 20.0},
'upper_left': {'_type': 'point', 'top': 10.0, 'x': 5.0}}
하스켈 스택은 하스켈을 위한 패키지 매니저 겸 개발 환경 관리 도구입니다. 하스켈은 빌드 및 배포 면에서 파이썬과 특성이 많이 다르기 때문에, 하스켈 스택이 파이썬의 어떤 도구에 해당되는지는 1:1로 비교해서 설명하기 힘듭니다. 어쨌든 하스켈 스택은 다음과 같은 일들을 도와줍니다.
-
프로젝트에 필요한 버전의 하스켈 컴파일러(GHC)가 아직 시스템에 설치되어 있지 않다면, 알아서 받아서 설치해줍니다.
-
서로 다른 하스켈 프로젝트끼리 다른 컴파일러나 다른 라이브러리에 의존하더라도 섞이지 않도록 프로젝트별로 개발 환경을 격리해줍니다.
-
프로젝트에서 의존하는 라이브러리들을 받아서 설치해줍니다.
-
프로젝트의 단위 테스트를 실행해줍니다.
-
프로젝트를 빌드하여 네이티브 실행 바이너리 파일을 만들어줍니다.
짧게 요약하면, 하스켈 개발 환경 준비는 하스켈 스택을 설치하는 것으로 끝납니다.
하스켈 스택의 설치 설명서를 따라하면 복잡하지 않게 설치할 수 있습니다.
성공적으로 설치됐다면, stack
명령어를 쓸 수 있습니다.
stack --version
혹시 이전에 하스켈 스택을 설치한 적이 있지만, 그 이후 오랫동안 사용하지 않았다면, 최신 버전으로
업그레이드해주세요. stack upgrade
명령으로 업그레이드할 수 있습니다.
이 부분은 미리 해오시면 좋지만, 잘 되지 않는다면 스프린트 당일에 진행자가 도와드릴 수 있습니다.
앞서 예제를 위해 받아둔 소스 코드의 디렉토리로 이동한 뒤, 다음 명령어로 니름 프로젝트에 필요한 버전의 하스켈 컴파일러(GHC)를 설치합니다.
stack setup
컴파일러가 준비됐다면 아래 명령을 통해 테스트를 실행해봅시다.
stack test
아래 명령어를 통해 니름 실행 바이너리를 만들 수 있습니다.
stack build
실행 바이너리 빌드가 성공적으로 끝났다면, 아래 명령어로 빌드된 실행 바이너리를 써볼 수 있습니다.
stack exec -- nirum -t python -o out/ examples/
stack exec
는 해당 프로젝트에서 빌드한 실행 바이너리를 하스켈 스택이 대신 실행시켜주는
명령어입니다. (위 예시에서 --
는 그 이후의 옵션이 stack exec
의 옵션이 아닌, nirum
실행 바이너리의 자체적인 옵션이라는 표시입니다.)