Github Actions의 워크플로우 정의 파일의 확장자는 .yml이다. 이는 YAML 언어를 사용한 파일임을 나타내는데, YAML이 무엇인지에 대해 알아보자.
YAML은 원래 "Yet Another Markup Language"라는 의미로 시작했다. 1990년대 후반, 다양한 마크업 언어가 있었는데 "또 하나의 (markup)언어"라는 뜻으로 붙인 이름이다. 하지만 나중에 의미를 조금 더 실용적으로 바꾸면서 YAML Ain’t Markup Language로 해석되기도 했다. 이는 마크업 언어가 아니라 데이터 직렬화(serialization)언어라는 점을 강조하는 것이다.
- 직렬: 연속된, 일렬로 늘어선
- 직렬화: 입체적이고 복잡한 구조인 메모리 속 데이터를 단일하고 연속적인 데이터 흐름으로 변환하는 것
데이터 직렬화(Data Serialization)란, 프로그램이 사용하는 데이터 구조(객체, 배열 등)를 텍스트나 바이트 스트림처럼 전송하거나 저장하기 쉬운 형태로 변환하는 과정을 말한다.
.github/workflows안에 있는 .yml 확장자를 가진 파일의 구조를 살펴보자.
name: Run Daily Update
on:
schedule:
- cron: '0 0 * * *'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install
위 구조에서 볼 수 있듯이, 개발자는 name, on, jobs 등의 구조를 가진 YAML 텍스트 파일을 작성한다. 이 파일 자체가 바로 워크플로우의 구조와 설정이 직렬화된 데이터이다. 워크플로우가 실행될 때, Github Actions의 내부 시스템은 이 .yml 파일을 읽어서 자신이 이해할 수 있는 내부 실행 계획(Execution Plan) 객체로 변환한다. 이 과정을 파싱(Parsing) 또는 역직렬화라고 한다.
따라서 Github Actions의 .yml 파일에서 일어나는 직렬화는 일반적인 API 통신에서의 데이터 직렬화와 차이가 있다. API 통신에서의 데이터 직렬화는 애플리케이션 간의 데이터 전송 또는 저장을 목적으로 애플리케이션이 동적으로 데이터를 생성하고 직렬화하는 것이라면, Github Actions에서의 YAML은 사람이 시스템에게 작업 흐름을 정의하고 설정할 목적으로 사람이 정적인 설정 값을 작성하는 것이다.
여기서 한 가지 의문이 드는 점이 있다. 우리가 작성하는 코드는 모두 컴퓨터가 이해할 수 있도록 하는 명령어의 집합인데, 그렇다면 코드 작성과 직렬화는 같은 말이라고 볼 수 있을까?
엄밀히 따지자면 코드 작성에 직렬화가 포함된다고 볼 수 있다. 코드는 JSON.stringify()처럼 직렬화, 즉 데이터를 포장하기 위한 명령 뿐 아니라 계산(a + b), 조건문(if...), 반복문(for...) 등 직렬화와는 전혀 상관없는 수많은 다른 명령들이 포함되어 있다. 따라서 코드 > 직렬화는 맞지만, 코드 = 직렬화는 틀린 말이다.
YAML의 핵심 특징은 다음과 같다.