설 연휴 기간동안에 홀린듯이 엘릭서와 관련된 영상들을 몇개 시청하고
저도 모르게 엘릭서를 취미(?)로 시작해 보게 되었습니다.
그동안 객체지향 언어와 객체지향에 관련된 스터디만 주구장창 하면서... 다른 패러다임으로도 생각해 볼 수 있어서 재밌게 느꼇는지도 모르겠습니다.
그리고 개발 모임원들에게 약(Elixir)를 약 장수마냥 팔게 되었습니다!



스터디원들의 뜨거운(?) 반응
엘릭서에 대해서 친절하게 설명해주신 영상을 보게 되었고 해당 내용의 일부를 정리하고 공유하여
엘릭서에 대한 관심이 조금이나마 생기셨으면 좋겠습니다.
https://www.youtube.com/watch?v=NotXpRovDoA&t=2084s
이거 배워놓고 활용도 못하는거 아냐?
라고 생각하실 수 도 있지만 생각보다 많은 기업들에서 활용중입니다.
대표적으로는
Discord
pinterest , Whatsapp , Telegram
이 외에도
카카오 워크
https://www.youtube.com/watch?v=NotXpRovDoA&t=2084s
엑스엘게임즈의 달빛조각사
https://www.youtube.com/watch?v=-e3qRqy4FSk
이렇게 매력적인 엘릭서.. 시작하지 않을 수 없겠죠?
그전에 먼저 패턴매칭이이라는 기능을 알고 가야 합니다.
패턴 매칭 = 구조 분해 할당(Destructuring) + 제어 흐름(Control flow)
예시코드
var a, b, rest;
[a, b] = [10 ,20]
console.log(a) // 10
console.log(b) // 20
[a, b, ...rest] = [10, 20, 30, 40, 50]
console.log(a) // 10
console.log(b) // 20
console.log(rest)// [30, 40, 50]
Elixir에서는 패턴매칭을 통해 타입을 명시하지 않고도 값의 구조와 형태에 따라 로직을 구성할 수 있게 도와 줍니다.
Elixir는 동적타입의 패턴매칭을 지원하기 때문이죠.
예시코드
def get_y(position) do
case position do
{x, y} -> {:ok, y}
_other -> :error
end
end
패턴매칭을 통해 원하는 값 외에는 모두 에러를 반환하게 만들고 있습니다.
예상되는 패턴에 맞지 않는 값이 함수에 전달되면, Elixir는 패턴 매칭 실패를 발생시키고 에러를 반환하게 합니다.
case문을 사용하여 position이 튜플 {x, y}의 형태일 때만 값을 추출하고, 그렇지 않은 경우에는 에러를 반환하고 있습니다.
그럼 엘릭서 및 다른 함수형언어에서는 어떻게 다형성을 처리해 줄까요?
// 자바로 구현
interface MessageSender {
public void sendMessage(String message);
}
class User implements MessageSender {
public void sendMessage(String message) {
// 암호화 책임
}
}
class Bot implements MessageSender {
public void sendMessage(String message) {
// ...
}
}
# 엘릭서로 구현
defmodule MessageSender do
# User
def send_message(%{type: :user} = user, message) do
# 암호화
end
def send_message(%{type: :bot} = bot, message) do
# ...
end
# 구조체로 변경
def send_message(%User{} = user, message) do
# 암호화
end
def send_message(%Bot{} = bot, message) do
# ...
end
end
함수형에서는 자연스럽게 상황에 맞는 모듈을 만들어 주는 것 만으로도 다형성을 쉽게 처리할 수 있게 됩니다.
이런식으로 패턴 매칭은 함수 중심의 선언적인 구조를 만들 수 있게 도와줍니다.
함수형에는 패턴매칭이 필 수인 이유!
엘릭서는 동적타입이 가능하기 떄문에 User , Bot 이 아닌 값이 들어올 수 도 있음
→ 그런 경우에는 매칭되는 패턴이 없다고 에러를 뱉어 Crash 가 발생하게 됩니다.
혹은 방어코드를 추가할 수도 있습니다.
def send_message(something_else, message) do
# error handling
end
이렇게 되면… 복잡해진 코드로 인한 낮은 가독성이 발생할 가능성이 있습니다.
또한 코드 작성과 exception 정의로 인한 많은 비용발생 하게 됩니다.
"그럼에도 불구하고… 정말 예외가 없을까?" 라는 의문을 남길 수도 있죠.
-> 엣지케이스를 찾아내고 에러를 찾아 내느라 많은 비용을 투자하게 됩니다.
결국 우리가 풀어내야할 비즈니스 로직에 당연히 덜 집중하게 됩니다.
그래서! 엘릭서는 그냥 Crash가 나게 둡니다.
이것이 엘릭서의 핵심인 Let it Crash 철학! 입니다.
에러가 발생하여도 감시자라고 부르는 모듈이 해당 스레드를 격리시키고, 자동으로 복구하게 해줍니다!
이에 대해서는 더 좋은 링크를 남기도록 하겠습니다 :)
https://medium.com/@vamsimokari/erlang-let-it-crash-philosophy-53486d2a6da
이 외에도 엘릭서에 대해서 관심이 더 생기셨다면
아래의 링크들의 영상을 시청해보시는걸 추천드리겠습니다.
https://www.youtube.com/watch?v=-e3qRqy4FSk
https://www.youtube.com/watch?v=Rjyf_dELAeg&t=2228s
https://www.youtube.com/watch?v=lAaD-6OQSHE&t=307s
그리고 엘릭서는 공부 위한 링크도 몇개 남겨두겠습니다!
https://exercism.org/tracks/elixir
https://elixirschool.com/ko