워크플로우: 코드 작성하기 (Workflow: Writing Code)

이 장에서는 코드를 작성하고 실행하는 다양한 방법들을 살펴보겠습니다. 이는 코딩을 처음 접할 때 매우 혼란스러울 수 있는 부분입니다.

서로 다른 요구 사항에 따라 코드를 작성(및 실행)하는 여러 방법이 있습니다. 예를 들어, 재현 가능한 작업 파이프라인을 구축하거나 프로덕션 급의 소프트웨어를 작성할 때는 대부분 코드로 이루어진 파일인 스크립트(script)를 선택할 수 있습니다. 하지만 동료에게 지침을 보내거나 이야기를 탐색하며 전개하고 싶을 때는 텍스트와 코드를 스크립트보다 더 자연스럽게 결합할 수 있는 노트북(notebook)을 선택할 수 있습니다.

이전 장들에서 이미 코드를 작성하고 실행하는 몇 가지 방법을 만났습니다. 여기서는 좀 더 체계적으로 정리하여, 이 장을 마칠 때쯤 여러분이 스크립트와 노트북 양쪽 모두에서 편안하게 코드를 작성할 수 있도록 하겠습니다. 숙련된 사용자를 위해 실행 가능한 코드 청크(chunks)가 포함된 마진 파일인 마크다운(markdown)으로 코드를 작성하는 방법도 제공합니다. 하지만 스크립트와 노트북이 단연코 가장 인기 있는 코드 작성 방식입니다.

먼저 몇 가지 정의부터 시작하겠습니다.

이제 Visual Studio Code와 같은 완전한 기능을 갖춘 통합 개발 환경에서 코드를 작성할 수 있는 모든 다양한 방법들을 살펴보겠습니다. 각각 장단점이 있으며, 상황에 따라 다른 방식을 사용하고 싶을 것입니다. 아래 표는 코드를 작성하고 실행하는 다양한 방법들을 보여줍니다.

일반적인 워크플로우를 찾고 계신다면, 이 책은 스크립트(.py 파일)와 VS Code 대화형 창(interactive window)을 조합하여 작업하는 것을 권장합니다. .py 파일로 작업 중일 때도 언제든지 스크립트 내에서 우클릭하고 ’Run in interactive window’를 선택하여 Visual Studio Code 대화형 창을 열 수 있음을 기억하세요.

항목 사용 방법 사전 요구 사항 장점 단점
스크립트 (예: script.py) 통합 개발 환경(IDE)에서 ‘Run in interactive window’ 실행 파이썬 설치 + Visual Studio Code와 같은 파이썬 지원 IDE 필요에 따라 한꺼번에 또는 단계별로 실행 가능. 스크립트 코딩을 돕는 매우 강력한 도구들 사용 가능. 제품 수준의 코드 작성을 위한 사실상 표준. 다른 스크립트에서 임포트 가능. 버전 관리(Git)에 유리함 코드와 함께 많은 텍스트를 담기에는 부적합함
주피터 노트북 (예: notebook.ipynb) Visual Studio Code로 파일을 염 Visual Studio Code와 VS Code Jupyter 익스텐션 사용 코드와 텍스트가 번갈아 나타날 수 있음. 풍부한 코드 결과물을 문서에 통합 가능. PDF, HTML 등으로 내보낼 수 있으며, Quarto를 통해 코드 입력/출력 표시 여부 제어 가능. 한꺼번에 또는 단계별 실행 가능 버전 관리(Git) 시 까다로움. 동일한 ‘셀’ 안에 코드와 텍스트 혼용 불가. 다른 코드 파일에서 임포트하기 어려움
실행 가능한 코드 청크를 포함한 마크다운 (Quarto 사용, 예: markdown_script.qmd) 마크다운과 코드 블록을 섞어 작성한 뒤 명령줄에서 quarto render markdown_script.qmd --to html 등으로 내보내거나 VS Code 익스텐션 사용 파이썬 및 쿼토 설치와 관련 의존성 패키지들 텍스트와 코드의 진정한 혼용 가능. PDF, HTML 등 매우 다양한 포맷으로 내보낼 수 있으며 코드 입력/출력 표시 여부 제어 가능. 버전 관리(Git)에 유리함 다른 코드 파일에서 임포트할 수 없음

위의 옵션 중 일부는 컴퓨터에 텍스트 기반 지침을 내리는 방법인 명령줄(command line)을 사용합니다. 명령줄(일명 터미널)은 맥의 Terminal 앱, 윈도우의 Command Prompt 앱, 또는 리눅스의 ctrl + alt + t를 통해 접속할 수 있습니다. Visual Studio Code 내에서 명령줄을 열려면, 키보드 단축키 + ` (맥) 또는 ctrl + ` (윈도우/리눅스)를 누르거나 상단 메뉴에서 “View > Terminal”을 클릭하세요.

이제 흔한 예제인 Hello World를 사용하여 이러한 코드 실행 방식들을 더 자세히 살펴보겠습니다.

스크립트 (Scripts)

대부분의 코드는 스크립트로 작성되며 여러분의 주된 도구가 되어야 합니다.

스크립트에 대해 이미 만나보았지만 다시 한번 요약해 보겠습니다. Visual Studio Code에서 hello_world.py라는 새 파일을 만드세요. 에디터에서 파일에 다음 한 줄을 추가합니다:

print('Hello World!')

파일을 저장하세요. 우클릭한 후 스크립트를 실행하려면 ‘Run current file in interactive window’, ‘Run current file in terminal’, 또는 ‘Run selection/line in interactive window’ 중 하나를 사용할 수 있습니다. 이는 스크립트를 실행하는 두 가지 다른 방법입니다: IDE(여기서는 VS Code) 내에서 실행하거나 명령줄에서 실행하는 것입니다.

일반적인 워크플로우는 스크립트 내의 몇 줄을 선택한 다음 ’Run selection/line in interactive window’를 누르거나 shift + enter 단축키를 사용하는 것입니다.

후자의 대안으로, 여러분이 직접 명령줄을 열고 다음을 실행할 수도 있습니다:

python hello_world.py

그러면 스크립트가 실행됩니다.

주피터 노트북 (Jupyter Notebooks)

주피터 노트북은 실험, 땜질 작업, 그리고 텍스트와 코드를 함께 보관하기 위한 도구입니다. 코딩 세계의 실험 노트라고 할 수 있습니다. 이 책의 대부분은 주피터 노트북으로 작성되었습니다! ’Jupyter’라는 이름은 주피터가 지원했던 원래의 세 가지 언어인 Julia, Python, R에 대한 참조이자, 목성의 위성 발견을 기록한 갈릴레오의 노트북에 대한 참조이기도 합니다. 주피터 노트북은 이제 원래의 세 언어를 넘어 Ruby, Haskell, Go, Scala, Octave, Java 등 수많은 언어를 지원합니다.

주피터 노트북을 시작하려면 파이썬이 설치되어 있어야 하며 명령줄에서 pixi add jupyterlab을 실행해야 합니다.

이 튜토리얼을 따라가다 막힌다면 여기에 더 자세한 VS Code 및 주피터 노트북 튜토리얼이 있습니다.

Visual Studio Code에서 새 파일을 만들고 hello_world.ipynb로 저장하세요. 파일을 닫았다가 다시 엽니다. 노트북 인터페이스가 자동으로 로드되며 ’Code’와 ’Markdown’이라고 라벨이 붙은 플러스 기호와 함께 셀을 생성할 수 있는 옵션이 보일 것입니다. 셀은 코드 또는 텍스트 중 하나의 독립적인 덩어리입니다. 텍스트 셀에는 마크다운 (Markdown) 장에서 더 자세히 배울 가벼운 텍스트 출력 언어인 마크다운이 들어갑니다. 우선 다음 내용을 담은 마크다운 셀을 만드세요:

# 제목입니다

## 부제목입니다

이 노트북은 'hello world!'를 화면에 출력하는 것을 보여줍니다.

이제 다음 셀로 ’Code’를 선택하고 다음과 같이 작성하세요:

print('hello world!')

노트북을 실행하려면 모든 셀을 실행하거나(대개 노트북 페이지 상단에 있는 이중 재생 버튼) 각 셀을 하나씩 실행(셀 옆의 재생 버튼)할 수 있습니다. 마크다운 셀을 ‘실행’하면 마크다운이 표시 모드로 렌더링 되며, 코드 셀을 실행하면 코드가 실행되고 그 결과가 아래에 삽입됩니다. 코드 셀을 실행하면 ’hello world!’ 메시지가 나타나는 것을 볼 수 있을 것입니다.

주피터 노트북은 아이디어의 초기 탐색, 특히 데이터 과학과 같은 분야에서 다재다능하고 인기가 많습니다. 이 책 전체는 주피터 노트북과 실행 가능한 마크다운의 조합으로 작성되었습니다. 주피터 노트북은 별도의 설치 없이 브라우저(Binder나 Google Colab 사용)를 통해 클라우드에서 쉽게 실행할 수도 있습니다. 코드가 아주 많지는 않지만, 지금 여러분이 읽고 있는 이 페이지도 페이지 상단의 로켓 아이콘 아래 ’Colab’을 클릭하여 Google Colab에서 주피터 노트북으로 로드할 수 있습니다.

주피터 노트북의 정말 멋진 기능 중 하나는 .qmd 파일 대신 Quarto의 입력 파일로 사용할 수 있다는 점이며, 이는 (일부 코드 입력을 숨기는 것과 같은) 많은 내보내기 옵션과 가능성을 열어줍니다. 자세한 내용은 여기 (주피터 노트북 또는 .ipynb 파일에 대한 안내를 찾으세요)에서 확인하거나 마크다운 (Markdown)쿼토 (Quarto) 장을 미리 살펴보세요.

https://jupyter.org/try에서 아무것도 설치하지 않고 주피터 노트북을 체험해 볼 수 있습니다. 튜토리얼을 보려면 Try Classic Notebook을 클릭하세요.

주피터 노트북 사용 팁

  • 버전 관리: 버전 관리(Git)를 사용 중이라면, 코드만 저장하고 싶을 때 주피터 노트북의 출력 결과까지 저장되지 않도록 주의해야 합니다. 주피터 노트북을 지원하는 대부분의 IDE에는 출력 결과 지우기(clear outputs) 옵션이 있습니다. 이를 pre-commit git hook(무엇인지 모르더라도 걱정 마세요)으로 자동화할 수도 있습니다. 노트북을 스크립트나 마크다운 파일(다음 섹션에서 설명함)과 페어링할 수도 있습니다. 출력 결과가 있든 없든 주피터 노트북은 깃허브에서 렌더링 되어 보일 것입니다.

  • 터미널 명령어: 셀에서 명령어 앞에 !를 붙이고 실행함으로써 주피터 노트북 내부에서 터미널 명령어를 실행할 수 있습니다. 예를 들어 !ls는 노트북이 있는 디렉토리의 내용을 나열하고, !pwd는 노트북이 포함된 디렉토리 경로를 알려줍니다. 이 방식으로 !pixi add도 할 수 있습니다. 이는 Google Colab 노트북에서도 작동하지만, !pixi add 대신 !pip install을 사용하게 될 것입니다.

  • 매직 명령어(Magic commands): %로 시작하는 문장은 매직 명령어입니다. %whos는 정의된 변수들에 대한 정보를 표시합니다. %run script.pyscript.py라는 스크립트를 실행합니다. %timeit은 셀이 실행되는 데 걸리는 시간을 측정합니다. 마지막으로 %quickref를 사용하여 더 많은 매직 명령어들을 볼 수 있습니다.

  • 노트북 셀은 여러분이 선택한 어떤 순서로든 실행될 수 있습니다. 하지만 노트북을 다른 사람과 공유하거나 나중에 직접 다시 사용할 계획이라면, 셀들이 위에서 아래로 순서대로 실행될 때 의도한 대로 작동하는지 확인하는 것이 좋은 습관입니다.

  • 주피터 노트북에는 수많은 익스텐션(extension)이 있습니다. 여기에서 목록을 찾을 수 있습니다. 특히 상호작용성을 더해주는 ipywidgets가 주목할 만합니다.

  • 명령어 뒤에 ?를 붙여 실행하면 해당 명령어에 대한 도움말 정보를 얻을 수 있습니다.

실행 가능한 코드 청크를 포함한 마크다운

이 방식은 비록 최근 몇 년 사이 인기를 얻고 있지만 단연코 가장 덜 일반적인 코딩 방식입니다. 하지만 슬라이드, 문서, 또는 웹사이트와 같은 다른 형식으로 최종 내보내기를 하려는 경우에는 매우 훌륭합니다!

코드보다 텍스트가 훨씬 더 많을 때는 주피터 노트북을 사용하는 것조차 부담스럽게 느껴질 수 있습니다. 역사적으로 노트북에서 텍스트를 편집하는 것은 다소 번거로웠으며 특히 셀을 자주 옮겨야 할 때 더 그랬습니다. 마크다운은 훨씬 더 쾌적한 쓰기 경험을 제공합니다. 하지만 마크다운 자체로는 코드를 실행할 수 없습니다. 재현성, 텍스트, 그리고 코드와 코드 출력 결과를 결합하고 싶다고 상상해 보세요. 마크다운에 실행 가능한 코드 청크를 추가함으로써 이를 가능하게 해주는 Quarto라는 도구가 있습니다.

이는 다소 고급 주제이며 코드를 작성하는 것만큼이나 소통에 관한 것이기도 하므로, 쿼토 (Quarto) 장에서 다시 다루도록 하겠습니다.