프로세스를 생성하는 일은 쉽지만, 그 상태와 동작을 관리하는 일은 아주 복잡해질 수 있어요. Agent 모듈은 Elixir 프로세스에서 공유 상태를 관리하기 쉽게 해 주는 추상화예요.
Agent 모듈의 함수를 사용할 때는 에이전트와 관련된 함수를 하나의 모듈에 모아 두는 것이 관례예요.
# A simple use of agent processes to represent a counter
defmodule Counter do
def start_link(initial_value) do
Agent.start(fn -> initial_value end)
end
def value(pid) do
Agent.get(pid, & &1)
end
def increment(pid) do
Agent.update(pid, &(&1 + 1))
end
end
Agent 모듈을 쓸지, 아니면 여러 프로세스를 아예 쓸지 하는 선택은 데이터로 모델링하려는 관계에 따라 달라요. _Agent 프로세스_는 여러 프로세스가 공유 상태를 사용해야 할 때 유용해요.
별도의 프로세스를 두지 않고 함수 안의 변수로 상태를 담는 편이 더 나은 선택인 경우가 많아요. 그리고 이를 무턱대고 전역 변수처럼 다루지 않도록 주의해야 해요. 다른 프로세스가 값을 조작해서 경쟁 조건이나 추적할 수 없는 오류를 만들 수 있거든요.
_Agent 프로세스_를 쓰기로 했다면, 목표는 단순한 상태를 담는 것이어야 하고, _Agent 프로세스_에 대한 호출은 모듈 안에 캡슐화해서 호출을 한데 모아 정리하는 게 좋아요.
비용이 많이 드는 작업을 다른 프로세스에서 처리해야 한다면 Task 프로세스(Task 사용)를 고려해 봐요. 프로세스가 상태를 보관하면서 동작까지 수행해야 한다면 GenServer 프로세스(GenServer 사용)를 고려해 봐요.