프로그래밍 에릭슬
Elixir를 사용한 기능적이고 동시성 프로그래밍에 대한 포괄적인 안내서입니다. 객체 지향적 사고에서 함수형 사고로의 전환, 패턴 매칭, 불변성, 동시성 처리를 위한 액터 모델, 그리고 OTP를 활용한 견고한 분산 시스템 구축에 대해 다룹니다.
강좌 개요
📚 콘텐츠 요약
엘릭서를 사용한 기능형 및 동시성 프로그래밍에 대한 종합 가이드입니다. 객체 지향 프로그래밍에서 기능형 사고로의 전환, 패턴 매칭, 불변성, 동시성의 액터 모델, 그리고 OTP를 활용한 강력한 분산 시스템 구축을 다룹니다.
기능형 프로그래밍의 아름다움을 통해 내구성 있고 동시적인 시스템을 구축하는 예술을 마스터하세요.
저자: 데이브 토머스
감사의 말: 조제 발림, 코리 헤인즈, 브루스 테이트, 제시카 커, 앤서니 에든, 채드 파워, 김 쇼어, 캔디 캐너민, 포토마크 인덱싱
🎯 학습 목표
- 엘릭서의 데이터 변환 모델과 전통적인 상태 기반 프로그래밍을 비교합니다.
- 상호작용 가능한 엘릭서 쉘 (IEx)을 구성하고 스크립트 및 컴파일을 통해 엘릭서 코드를 실행합니다.
- 매치 연산자 (
=), 핀 연산자 (^), 와일드카드 (_)를 사용하여 데이터를 분해하고 검증합니다. - 불변성의 이론적 및 실질적 영향을 성능과 메모리 관리 측면에서 설명합니다.
- 엘릭서의 내장 타입(값, 시스템, 컬렉션 타입 포함)을 식별하고 활용합니다.
- 변수 스코프 규칙과
with표현식을 적용하여 복잡한 데이터 변환을 관리합니다. - 표준 및 캡처(
&) 표기법을 사용하여 익명 함수를 생성하고 호출합니다. - 패턴 매칭과 재귀를 사용하여 모듈 내에 이름이 붙은 함수를 구현하여 복잡한 로직을 처리합니다.
- 가드 절과 기본 매개변수를 적용하여 함수 실행 흐름을 제어합니다.
- 리스트 분해 및 구성: 머리/꼬리 패턴 매칭을 사용하여 재귀적인 리스트 구조를 탐색하고 구성합니다.
🔹 수업 1: 엘릭서와 패턴 매칭 소개
개요: 이 수업에서는 상태 변경이 아닌 데이터 변환에 중심을 둔 기능형 언어로서의 엘릭서를 소개합니다. 학생들은 엘릭서 환경(IEx)을 탐색하고 스크립트를 컴파일하며 실행하며, 변수 바인딩과 제어 흐름의 기본 메커니즘인 패턴 매칭을 마스터하게 됩니다.
학습 결과:
- 엘릭서의 데이터 변환 모델과 전통적인 상태 기반 프로그래밍을 비교합니다.
- 상호작용 가능한 엘릭서 쉘 (IEx)을 구성하고 스크립트 및 컴파일을 통해 엘릭서 코드를 실행합니다.
- 매치 연산자 (
=), 핀 연산자 (^), 와일드카드 (_)를 사용하여 데이터를 분해하고 검증합니다.
🔹 수업 2: 불변성과 엘릭서 기본 개념
개요: 이 수업에서는 엘릭서의 근본 철학인 불변성을 탐구합니다. 학생들은 엘릭서가 데이터를 변경 불가능한 개체로 다루는 방식, 이 접근 방식의 성능상 이점, 그리고 간단한 값 타입(예: 어텀, 범위)부터 복잡한 컬렉션(예: 맵, 바이너리)까지 다양한 내장 타입을 배우게 됩니다. 수업은 변수 스코프와 강력한 with 표현식에 대한 깊이 있는 탐구로 마무리됩니다.
학습 결과:
- 불변성이 성능과 메모리 관리에 미치는 이론적 및 실질적 영향을 설명합니다.
- 엘릭서의 내장 타입(값, 시스템, 컬렉션 타입 포함)을 식별하고 활용합니다.
- 변수 스코프 규칙과
with표현식을 적용하여 복잡한 데이터 변환을 관리합니다.
🔹 수업 3: 함수, 모듈, 파이프 연산자
개요: 이 수업에서는 엘릭서 프로그래밍의 핵심인 기능적 변환을 탐구합니다. 익명 함수와 클로저에서 시작하여 구조화된 모듈과 이름이 붙은 함수로의 전환을 다룹니다. 학생들은 패턴 매칭, 재귀, 파이프 연산자를 활용하여 간결하고 가독성 좋으며 유지보수가 쉬운 코드를 작성하면서도 기반의 에르랭 가상 머신과 상호 작용하는 방법을 배웁니다.
학습 결과:
- 표준 및 캡처(
&) 표기법을 사용하여 익명 함수를 생성하고 호출합니다. - 패턴 매칭과 재귀를 사용하여 모듈 내에서 이름이 붙은 함수를 구현하여 복잡한 로직을 처리합니다.
- 가드 절과 기본 매개변수를 적용하여 함수 실행 흐름을 제어합니다.
🔹 수업 4: 재귀적 리스트와 데이터 구조
개요: 이 수업에서는 재귀를 통해 엘릭서 리스트의 기본 메커니즘을 다룹니다. 특히 "머리와 꼬리" 패턴을 사용하여 데이터를 처리하고 구성하는 데 집중합니다. 이후 맵, 구조체, 키워드 리스트 같은 복잡한 데이터 구조로 넘어가며, 적절한 구조 선택을 위한 의사 결정 프레임워크와, Access 모듈 및 엘릭서의 타입 시스템 이론을 활용한 중첩된 데이터 조작의 고급 기술을 제공합니다.
학습 결과:
- 리스트 분해 및 구성: 머리/꼬리 패턴 매칭을 사용하여 재귀적 리스트 구조를 탐색하고 구성합니다.
- 고차원 패턴 구현: 사용자 정의
map및reduce함수를 만들어 리스트 데이터를 변환하거나 집계합니다. - 적절한 데이터 구조 선택: 성능, 순서, 데이터 무결성 요구 사항에 따라 맵, 구조체, 키워드 리스트를 구분하고 사용합니다.
🔹 수업 5: 열거형, 스트림, 문자열 처리
개요: 이 수업에서는 엘릭서의 컬렉션 처리에 대한 이중 접근 방식을 탐구합니다: 비관적인 Enum 모듈과 게으른, 조합 가능한 Stream 모듈입니다. 또한 리스트 이해를 통한 데이터 변환과 내부적으로 문자열이 어떻게 작동하는지 깊이 있게 살펴봅니다. 단일 따옴표로 묶인 문자열(문자 리스트)과 이중 따옴표로 묶인 문자열(바이너리)의 차이점을 구분하며, 올바른 모듈(리스트 vs 문자열)을 선택하여 조작하는 방법을 배웁니다. 복잡한 데이터 구조 처리, 무한 데이터 다루기, 저수준 비트 추출 기술도 다룹니다.
학습 결과:
- 컬렉션 처리 시 비관적 평가와 게으른 평가의 차이점을 구분합니다.
- 여러 생성자와 필터를 사용한 리스트 이해를 통해 데이터를 변환하고 비트 수준 정보를 추출합니다.
- 단일 따옴표로 묶인 문자열(문자 리스트)과 이중 따옴표로 묶인 문자열(바이너리)을 구분하고, 조작에 맞는 올바른 모듈(리스트 또는 문자열)을 적용합니다.
🔹 수업 6: 제어 흐름, Mix 프로젝트, 전문 도구
개요: 이 수업은 단순한 엘릭서 함수 작성에서 시작하여, 전문 수준의 애플리케이션을 빌드하고 테스트하며 모니터링하는 과정으로 전환하는 과정을 안내합니다. 고급 제어 구조(case, cond), Mix 프로젝트의 생명주기(디렉터리 구조에서 CLI 실행 파일까지), 디버깅, 속성 기반 테스트, 서버 모니터링을 위한 전문 도구 세트를 다룹니다.
학습 결과:
case,cond, 예외 처리를 사용하여 복잡한 분기 로직을 구현합니다.Mix를 사용하여 엘릭서 프로젝트를 구조화하고,HTTPoison과Poison과 같은 외부 종속성을 관리하며, 애플리케이션 환경을 구성합니다.ExUnit,DocTest,StreamData를 사용한 속성 기반 테스트를 활용하여 견고한 테스트 스위트를 개발합니다.
🔹 수업 7: 동시성과 분산 노드
개요: 이 수업에서는 단일 프로세스 엘릭서 애플리케이션에서 분산 시스템으로의 전환을 탐구합니다. 메시지 처리의 메커니즘, 꼬리 재귀 루프를 통한 프로세스 지속성, 그리고 링크와 모니터링을 통한 프로세스 생명주기 관리를 다룹니다. 마지막으로, 에르랭 가상 머신의 분산 모델을 소개하여 노드 연결, 쿠키를 통한 보안 설정, 네트워크를 넘나드는 입출력 처리 방법을 가르칩니다.
학습 결과:
- 꼬리 재귀와 메시지 타임아웃을 사용하여 상태가 유지되고 지속되는 프로세스를 구현합니다.
- 링킹(
spawn_link)과 모니터링(spawn_monitor)을 사용하여 장애에 강건한 프로세스 트리를 구성합니다. - 이름 규칙, 보안 쿠키, 전역 프로세스 등록을 사용하여 분산 노드를 구성하고 연결합니다.
🔹 수업 8: OTP의 기초: 서버와 감시자
개요: 이 수업에서는 엘릭서 생태계 내에서 오픈 텔레콤 플랫폼(OTP) 프레임워크를 소개하며, 특히 GenServer 행동과 Supervisor 패턴에 초점을 맞춥니다. 학생들은 견고하고 상태가 있는 서버 프로세스를 구축하는 방법, 동기식과 비동기식 통신의 차이를 구분하고, 자동으로 프로세스 생명주기를 관리하는 장애에 강건한 감시 트리 구현 방법을 배웁니다.
학습 결과:
- OTP의 핵심 구성 요소를 정의하고 표준
GenServer콜백 생명주기를 구현합니다. - 동기식(콜)과 비동기식(캐스트) 메시지 패턴의 차이를 구분하고 구현합니다.
- 워커 프로세스를 모니터링하고 시스템 신뢰성을 유지하기 위해 감시자(서포터)를 구성하고 배포합니다.
🔹 수업 9: 복잡한 OTP 아키텍처와 상태 관리
개요: 이 수업에서는 개별 GenServer에서 시작하여 복잡한 다성분 OTP 애플리케이션 설계 및 배포로 전환합니다. "더퍼(복제 파일 찾기기)" 애플리케이션의 아키텍처 설계, OTP 애플리케이션 사양의 메커니즘, 그리고 Distillery를 사용한 핫 업그레이드 포함된 고급 배포 기술을 다룹니다. 또한, 작업 및 에이전트와 같은 단순화된 상태 관리 대안을 탐색하며, 특정 동시성 필요에 맞는 도구를 선택하는 프레임워크를 제공합니다.
학습 결과:
- 다섯 가지 질문 프레임워크를 사용하여 애플리케이션 요구사항을 분석하고, 초점과 실행 시 특성들을 식별합니다.
- 전용 서버(결과, 경로 탐색기, 수집기)와 동적 감시자(Dynamic Supervisor)를 활용하여 다서버 OTP 애플리케이션(더퍼)을 구성합니다.
- Distillery를 사용하여 코드 배포 및 핫 업그레이드를 수행하고,
code_change콜백을 통해 상태 마이그레이션을 진행합니다.
🔹 수업 10: 메타프로그래밍, 프로토콜, 타입 안전성
개요: 이 수업에서는 엘릭서의 고급 확장성을 탐구하며, 메타프로그래밍과 매크로를 통해 코드를 데이터로 조작하는 방법을 중심으로 다룹니다. 학생들은 프로토콜과 행동(behaviours)을 사용하여 다형성을 달성하고, 우미브렐라 프로젝트로 대규모 시스템을 구조화하며, 견고한 오류 처리를 구현합니다. 마지막으로, 엘릭서의 타입 시스템과 Dialyzer를 사용하여 정적 분석 계층을 추가하여 코드의 정확성을 보장하는 방법을 배웁니다.
학습 결과:
quote와unquote를 사용하여 매크로 내에서 코드 블록을 주입하고 조작하는 방법을 마스터합니다.- 사용자 정의 프로토콜과 행동을 구현하여 다형적이며 재사용 가능한 코드 구조를 만듭니다.
- 멀티앱 우미브렐라 프로젝트를 구성하고, 동적 엘릭서 코드에 공식적인 타입 사양을 적용합니다.