Ash Framework 튜토리얼 따라하기 (5)

지난 글에 이어 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 익스텐션은 현 시점 아직 알파 버전 이다. 감안하고 사용해야 할 것 같다.

다음 글 에서는 리소스 간 관계 설정에 대해 알아 보겠다.

댓글 남기기