개요

Elixir는 Erlang VM(BEAM) 위에서 동작하는 함수형 프로그래밍 언어로, 대규모 동시성, 내결함성, 분산 시스템에 특화되어 있습니다. Ruby 영향을 받은 친숙한 문법으로 Erlang의 강력한 동시성 모델을 더 접근하기 쉽게 만들었습니다.

왜 Elixir인가

BEAM VM의 강점

┌─────────────────────────────────┐
│          BEAM VM (Erlang VM)     │
├─────────────────────────────────┤
│  수백만 경량 프로세스 동시 실행     │
│  프로세스 간 메모리 격리           │
│  프로세스 크래시 → 다른 프로세스 무영향 │
│  핫 코드 스와핑 (무중단 배포)       │
│  분산 노드 간 투명한 통신          │
└─────────────────────────────────┘
  • 경량 프로세스: OS 스레드가 아닌 BEAM 프로세스 (각 ~2KB, 수백만 개 생성 가능)
  • “Let it crash”: 프로세스 크래시를 허용하고 Supervisor가 자동 재시작
  • 선점형 스케줄링: 하나의 프로세스가 CPU 독점 불가 → 안정적 응답 시간
  • 핫 코드 스와핑: 서버 재시작 없이 코드 업데이트

Erlang과의 관계

항목ErlangElixir
출시1986년 (Ericsson)2012년
문법Prolog 영향, 독특함Ruby 영향, 친숙함
메타프로그래밍제한적강력한 매크로
도구rebar3Mix (빌드/의존성/태스크)
패키지hex.pm 공유hex.pm 공유
상호운용-Erlang 함수 직접 호출 가능
커뮤니티통신/인프라웹/스타트업

→ Elixir = Erlang의 모든 장점 + 현대적 문법/도구

핵심 문법

# 패턴 매칭
{:ok, result} = {:ok, 42}
 
# 파이프 연산자
"hello world"
|> String.upcase()
|> String.split(" ")
# => ["HELLO", "WORLD"]
 
# 모듈과 함수
defmodule Math do
  def factorial(0), do: 1
  def factorial(n) when n > 0 do
    n * factorial(n - 1)
  end
end
 
# 동시성 — 프로세스 생성
pid = spawn(fn ->
  receive do
    {:hello, name} -> IO.puts("Hello #{name}")
  end
end)
 
send(pid, {:hello, "World"})
 
# GenServer (OTP 패턴)
defmodule Counter do
  use GenServer
 
  def init(initial), do: {:ok, initial}
  def handle_call(:get, _from, count), do: {:reply, count, count}
  def handle_cast(:increment, count), do: {:noreply, count + 1}
end

주요 생태계

Phoenix Framework

항목내용
역할웹 프레임워크 (Rails/Django 대안)
특징실시간 WebSocket (Channels), LiveView
성능단일 서버에서 200만+ 동시 WebSocket 연결
GitHubhttps://github.com/phoenixframework/phoenix

Phoenix LiveView:

  • 서버 사이드 렌더링 + 실시간 업데이트 (JavaScript 프레임워크 없이)
  • WebSocket으로 DOM diff 전송 → 클라이언트 자동 업데이트
  • React/Vue 없이도 인터랙티브 UI 구현
defmodule MyAppWeb.CounterLive do
  use Phoenix.LiveView
 
  def mount(_params, _session, socket) do
    {:ok, assign(socket, count: 0)}
  end
 
  def handle_event("increment", _, socket) do
    {:noreply, update(socket, :count, &(&1 + 1))}
  end
 
  def render(assigns) do
    ~H"""
    <h1><%= @count %></h1>
    <button phx-click="increment">+1</button>
    """
  end
end

Ecto

항목내용
역할데이터베이스 라이브러리 (ORM 대안)
특징Changeset (검증), 마이그레이션, 쿼리 DSL
지원 DBPostgreSQL, MySQL, SQLite
# 스키마
defmodule User do
  use Ecto.Schema
  schema "users" do
    field :name, :string
    field :email, :string
    timestamps()
  end
end
 
# 쿼리
from(u in User, where: u.age > 18, select: u.name)
|> Repo.all()

Nerves

항목내용
역할IoT/임베디드 시스템 프레임워크
특징Elixir로 펌웨어 작성, OTA 업데이트
하드웨어Raspberry Pi, BeagleBone 등

Nx (Numerical Elixir)

항목내용
역할수치 계산/ML 프레임워크
특징NumPy 대안, GPU 가속 (EXLA/Torchx)
관련Axon (신경망), Explorer (데이터프레임)

기타 핵심 라이브러리

라이브러리역할
ObanPostgreSQL 기반 백그라운드 Job 큐
AbsintheGraphQL 서버
Broadway데이터 파이프라인 (Kafka, SQS, RabbitMQ)
Membrane멀티미디어 처리 (오디오/비디오 스트리밍)
JidoAI 에이전트 프레임워크
Ash리소스 기반 애플리케이션 프레임워크
Livebook인터랙티브 노트북 (Jupyter 대안)

OTP (Open Telecom Platform)

Elixir의 핵심 강점은 Erlang의 OTP 패턴:

패턴역할
GenServer상태를 가진 서버 프로세스
Supervisor자식 프로세스 감시, 크래시 시 자동 재시작
Application시작/중지 가능한 컴포넌트 단위
Task비동기 작업 실행
Agent간단한 상태 관리
Registry프로세스 이름 레지스트리
# Supervisor 트리
defmodule MyApp.Application do
  use Application
 
  def start(_type, _args) do
    children = [
      MyApp.Repo,           # DB 연결 풀
      MyAppWeb.Endpoint,    # 웹 서버
      {MyApp.Cache, []},    # 캐시 프로세스
      {Oban, oban_config()}  # Job 큐
    ]
    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

Elixir vs 다른 언어

항목ElixirGoNode.jsRustPython
동시성 모델BEAM 프로세스Goroutine이벤트 루프OS 스레드GIL (asyncio)
동시 연결수백만수십만수만수십만수천
내결함성최고 (Supervisor)중간낮음중간낮음
핫 코드 스왑OXXXX
성능 (CPU)중간높음중간최고낮음
학습 곡선중간낮음최저높음최저
웹 프레임워크PhoenixGin/EchoExpressAxumDjango/FastAPI
생태계작음최대성장 중최대

Elixir가 빛나는 곳:

  • 실시간 시스템 (채팅, 게임, IoT)
  • 대규모 동시 접속 (WebSocket)
  • 장기 실행 안정성 (통신, 금융)
  • 분산 시스템

대표 사용 기업

기업용도
Discord500만+ 동시 사용자 WebSocket
Pinterest알림 시스템 (14,000 → 2 서버로 축소)
PepsiCo전자상거래 플랫폼
Brex핀테크 결제 시스템
Fly.io인프라 플랫폼
SupabaseRealtime 서버
Heroku라우팅 레이어
WhatsAppErlang 기반 (Elixir와 같은 BEAM)

도구

도구역할
Mix빌드 도구 + 의존성 관리 + 태스크 러너
Hex패키지 매니저 (hex.pm)
IEx인터랙티브 셸 (REPL)
ExUnit테스트 프레임워크 (내장)
ExDoc문서 생성
Dialyzer/Dialyxir정적 타입 분석
Credo코드 린터

관련 항목