Elixir는 2011년 Jose Valim이 Ruby 생산성과 Erlang VM(BEAM)의 동시성·내결함성을 결합해 만든 함수형 언어다. 분산 시스템, 실시간 웹(Phoenix), IoT 등에 강점을 가진다.
핵심 특성
| 특성 | 설명 |
|---|
| 경량 프로세스 | 수백만 프로세스 동시 실행 가능 |
| 메시지 패싱 | 공유 메모리 없는 동시성 |
| 내결함성 | Supervisor 트리, "let it crash" |
| 불변 데이터 | 모든 데이터 불변 |
| 패턴 매칭 | 구조 분해 할당 |
기본 문법
elixir
# 기본 함수와 패턴 매칭
defmodule Math do
def factorial(0), do: 1
def factorial(n) when n > 0, do: n * factorial(n - 1)
def sum([]), do: 0
def sum([head | tail]), do: head + sum(tail)
end
IO.puts Math.factorial(10) # 3628800
# 파이프 연산자
result =
[1, 2, 3, 4, 5]
|> Enum.filter(&rem(&1, 2) == 0)
|> Enum.map(&(&1 * 3))
|> Enum.sum() # 18
# 동시성: GenServer
defmodule Counter do
use GenServer
def start_link(initial), do: GenServer.start_link(__MODULE__, initial)
def increment(pid), do: GenServer.cast(pid, :increment)
def value(pid), do: GenServer.call(pid, :value)
def handle_cast(:increment, count), do: {:noreply, count + 1}
def handle_call(:value, _from, count), do: {:reply, count, count}
end
{:ok, pid} = Counter.start_link(0)
Counter.increment(pid)
Counter.increment(pid)
IO.puts Counter.value(pid) # 2
Phoenix 웹 프레임워크
elixir
# 실시간 채널 (WebSocket)
defmodule MyAppWeb.RoomChannel do
use Phoenix.Channel
def join("room:" <> _room_id, _payload, socket) do
{:ok, socket}
end
def handle_in("new_message", %{"body" => body}, socket) do
broadcast!(socket, "new_message", %{body: body})
{:noreply, socket}
end
end
관련 개념