Do you want to pick up from where you left of?
Take me there

Embedded Elixir (EEx)

Ruby가 ERB를 Java가 JSP를 가지고 있는 것처럼, Elixir도 EEx, 내장 Elixir를 가지고 있습니다. EEx를 통해서 문자열로 된 Elixir 코드를 심거나 평가할 수 있습니다.

API

EEx API는 문자열이나 파일을 직접 사용할 수 있게끔 지원합니다. API는 크게 3개의 컴포넌트로 구성되어 있습니다. 단순 평가, 함수 정의, AST로 컴파일.

평가

eval_string/3eval_file/2을 사용해서 문자열이나 파일에 대해서 단순 평가를 할 수 있습니다. 이는 가장 간단한 API이지만, 컴파일 없이 코드가 평가되기 때문에 가장 느립니다.

iex> EEx.eval_string "Hi, <%= name %>", [name: "Sean"]
"Hi, Sean"

정의

EEx를 사용하는 방법 중 가장 빠르고, 선호되는 것은 컴파일될 수 있도록 템플릿을 모듈에 삽입하는 것입니다. 이를 위해서는 컴파일 시간에 템플릿과 function_from_string/5, function_from_file/5 매크로가 필요합니다.

그럼 우리의 인사를 파일로 옮기고, 템플릿을 위한 함수를 생성해봅시다.

# greeting.eex
Hi, <%= name %>

defmodule Example do
  require EEx
  EEx.function_from_file(:def, :greeting, "greeting.eex", [:name])
end

iex> Example.greeting("Sean")
"Hi, Sean"

컴파일

마지막으로, EEx는 compile_string/2이나 compile_file/2를 통해 문자열이나 파일에서 Elixir AST를 직접 생성할 방법을 제공합니다. 이 API는 주로 위에서 설명한 API에서 사용하고 있습니다만, 내장 Elixir를 처리를 직접 하고 싶은 경우에도 사용 가능합니다.

태그

EEx에서 기본으로 지원하는 것은 다음의 4개의 태그입니다.

<% Elixir 표현식 - 출력물을 즉시 실행합니다 %>
<%= Elixir 표현식 - 반환된 값으로 대체됩니다 %>
<%% EEx 인용 - 안에 있는 것을 반환합니다 %>
<%# 주석 - 코드에서 제거됩니다 %>

결과물을 출력하고 싶은 모든 표현 식은 반드시 등호(=)를 사용해야 합니다. 다른 템플릿 언어에서는 if와 같은 철을 특별하게 처리하고 있지만, EEx는 그렇지 않기 때문에 중요합니다. =가 없다면 아무것도 출력되지 않을 것입니다.

<%= if true do %>
  A truthful statement
<% else %>
  A false statement
<% end %>

엔진

Elixir는 @name과 같은 할당을 지원하는 EEx.SmartEngine을 기본으로 사용합니다.

iex> EEx.eval_string "Hi, <%= @name %>", assigns: [name: "Sean"]
"Hi, Sean"

EEx.SmartEngine 할당은 템플릿 컴파일 없이 할당하는 값을 변경할 수 있으므로 유용합니다.

자신만의 엔진을 만드는 것에 흥미가 있으신가요? 무엇이 필요한지 알아보기 위해, EEx.Engine가 어떻게 동작하는지 확인해보세요.

강의에 실수가 있거나 기여하고 싶은 부분이 있으신가요? GitHub에서 이 강의를 수정해보세요!