지난 글에 이어 Ash Framework 에서 영속성에 대해 다루는 방법을 알아 본다.
지난 글 에서도 잠깐 언급이 있었지만 리소스에 data_layer 를 추가하면 해당 레이어에 데이터가 저장 된다. 예제에서는 ETS 를 data layer 로 사용 한다. ETS 는 Erlang/Elixir 환경의 인메모리 데이터베이스이다. Ticket 리소스에 다음 코드를 추가 한다.
# lib/helpdesk/support/ticket.ex
use Ash.Resource,
domain: Helpdesk.Support,
data_layer: Ash.DataLayer.Ets
Ash 에서 어떤 데이터 레이어를 지원하는지 궁금할 수 있다. Ash 에서는 데이터 레이어를 익스텐션 형태로 제공하는데 기본으로 제공하는 것은 ETS, Mnesia, Simple 이 정도 인 것 같고 다른 것은 추가로 익스텐션을 설치해야 하는 것 같다. 대표적인 익스텐션으로 AshPostgres 가 있다.
데이터 레이어를 추가하고 다음 코드를 다시 실행해 보자. 이전 글 과는 달리 리소스에서 데이터 레이어를 지정했기 때문에 따로 set_data 를 통해 데이터를 제공하지 않아도 된다.
require Ash.Query
for i <- 0..5 do
ticket =
Helpdesk.Support.Ticket
|> Ash.Changeset.for_create(:open, %{subject: "Issue #{i}"})
|> Ash.create!()
if rem(i, 2) == 0 do
ticket
|> Ash.Changeset.for_update(:close)
|> Ash.update!()
end
end
# 제목에 "2"를 포함한 티켓
Helpdesk.Support.Ticket
|> Ash.Query.filter(contains(subject, "2"))
|> Ash.read!()
# :closed 이면서 제목에 "4"를 포함하지 않은 티켓
Helpdesk.Support.Ticket
|> Ash.Query.filter(status == :closed and not(contains(subject, "4")))
|> Ash.read!()
비교적 쉽게 리소스를 데이터 레이어에 저장할 수 있게 되었다. 그러나 데이터 레이어는 보통 외부 데이터 저장소를 사용하고 저장소마다 특성이 있기 때문에 그에 맞는 익스텐션 사용법을 추가로 확인해야 할 것 같다. 범용 데이터베이스인 PostgreSQL 의 익스텐션이 있긴 하나 MySQL 익스텐션은 현 시점 아직 알파 버전 이다. 감안하고 사용해야 할 것 같다.
다음 글 에서는 리소스 간 관계 설정에 대해 알아 보겠다.