Elixir로 만들어진 프레임워크를 가지고 개발을 할 때 다음과 같이 use 구문을 자주 보게 된다.
defmodule MyAppWeb.DemoLive do
use Phoenix.LiveView
...
end
구문이 익숙하지 않더라도 뭔가 모듈에 해당 프레임워크 기능을 추가? 사용? 한다는 느낌이 든다. use 키워드가 어떤 기능을 하는지 알아 보자.
Elixir School 에서는 use 키워드를 다음과 같이 설명하고 있다.
use매크로로 현재 모듈의 정의를 다른 모듈이 수정할 수 있게 합니다. 코드에서use를 호출하면 실제로 제공된 모듈에 의해 정의된__using__/1콜백을 호출합니다.__using__/1매크로의 결과는 모듈 정의의 일부가 됩니다.
사용하는 모듈 입장에서는 use 구문을 통해 외부 모듈이 만들어 놓은 코드(기능)를 내 모듈로 가져오는 효과가 있다. Elixir School 의 예제 코드를 살펴 보자.
defmodule Hello do
defmacro __using__(_opts) do
quote do
def hello(name), do: "Hi, #{name}"
end
end
end
어떤 외부 모듈이 미리 만들어 매크로로 hello 라는 기능(함수)을 정의해 놨다.
defmodule Example do
use Hello
end
Example 모듈에서 Hello 모듈이 만들어 놓은 기능을 사용할 수 있도록 use 구문을 사용했다.
iex> Example.hello("Sean")
"Hi, Sean"
Example 모듈에서 마치 본인 모듈의 기능인 것 처럼 함수를 호출할 수 있다.
use 키워드를 살펴보면서 자바/스프링에서 어노테이션이 자연스럽게 떠올랐다. 자바/스프링 개발 경험이 있다면 데이터 클래스에 @Data 를 붙이거나 컨트롤러에 @RestController 를 붙이는 예를 생각하면 이해가 쉬울 것 같다. 개발자가 프레임워크를 쓰는 이유는 “이미 잘 만들어진 걸 가져다 쓰자”인데, Elixir 에서는 use 키워드가 그걸 가능하게 해 준다.