TECH 으로 돌아가기
TECH HACKER NEWS 2주 전 6분 읽기 93 READS

Elixir 1.20, 드디어 '점진적 타입 언어'가 되다 — 동적 언어에 타입을 입히는 영리한 방법

Elixir 1.20, 드디어 '점진적 타입 언어'가 되다 — 동적 언어에 타입을 입히는 영리한 방법

무슨 일이 있었냐면요

Elixir라는 언어 들어보셨을 거예요. Ruby처럼 읽기 편한 문법에, 통신사 시스템에서 쓰이던 Erlang의 든든한 동시성(여러 일을 동시에 처리하는 능력)을 물려받은 언어죠. Phoenix라는 웹 프레임워크 덕분에 우리나라에서도 쓰는 팀이 꽤 있고요.

그런데 Elixir에는 오랫동안 한 가지 '아쉬운 점'이 있었어요. 바로 동적 타입 언어라는 거였죠. 이게 뭐냐면, 변수에 숫자가 들어올지 문자열이 들어올지 미리 정해두지 않고 실행할 때 가서야 결정되는 방식이에요. 자유롭고 빠르게 짤 수 있어서 좋은데, 대신 "5" + 3 같은 실수를 컴파일할 때 못 잡고 한참 뒤에 실제 사용자 화면에서 터지는 일이 생기곤 했거든요.

이번 v1.20에서 Elixir는 스스로를 "점진적 타입 언어(gradually typed language)"라고 공식 선언했어요. 몇 년에 걸친 큰 프로젝트의 결승선을 넘은 셈이에요.

점진적 타입이 뭐길래

점진적 타입이라는 말부터 풀어볼게요. '타입을 한 번에 다 붙이는 게 아니라, 필요한 곳부터 조금씩(gradually) 붙여나간다'는 뜻이에요. 기존 코드는 그대로 둬도 돌아가고, 새로 짜는 중요한 함수에만 타입을 명시하면 거기서부터 안전망이 생기는 거죠. 전부 다 고쳐야 하는 부담 없이 도입할 수 있다는 게 핵심 매력이에요.

더 흥미로운 건 Elixir가 채택한 집합론적 타입(set-theoretic types)이에요. 이건 José Valim(언어 창시자)이 타입 이론 전문가 Giuseppe Castagna와 손잡고 몇 년간 연구한 결과물인데요. 이름은 거창하지만 아이디어는 직관적이에요. 타입을 '값들의 집합'으로 보고, 합집합(integer or string)이나 교집합 같은 연산으로 자유롭게 조합하는 거예요.

왜 이게 Elixir에 딱 맞냐면요. Elixir 코드는 패턴 매칭으로 가득해요. case 문에서 {:ok, value}일 때와 {:error, reason}일 때를 나눠 처리하잖아요. 집합론적 타입은 이런 분기를 자연스럽게 표현할 수 있어요. 어떤 가지에서는 타입이 이렇고 저 가지에서는 저렇다는 걸 정확히 추적하거든요. 그래서 타입 어노테이션을 한 줄도 안 써도 컴파일러가 패턴 매칭과 가드(when is_integer(x) 같은 조건)를 보고 알아서 타입을 추론해줘요. 이미 짜둔 코드에서도 명백한 타입 오류가 슬그머니 잡히기 시작하는 거죠.

물론 함수 시그니처에 타입을 직접 적는 것도 가능해요. 적어두면 그 함수를 쓰는 다른 코드까지 검사 범위가 넓어지고, 에디터 자동완성도 똑똑해지고요.

다른 언어들은 어떻게 했나

사실 이 흐름은 Elixir만의 이야기가 아니에요. 동적 언어들이 다 같은 고민을 했거든요. Python은 type hints를 넣고 mypy 같은 외부 도구로 검사하는 방식을 택했고, Ruby는 RBS와 Sorbet으로 비슷한 길을 갔어요. JavaScript는 아예 TypeScript라는 별도 언어로 갈아타는 식이 됐고요.

Elixir의 접근이 돋보이는 부분은, 타입 검사가 언어와 컴파일러에 직접 내장됐다는 점이에요. 별도 도구를 깔거나 .d.ts 같은 선언 파일을 따로 관리할 필요 없이, 그냥 컴파일하면 검사가 같이 돌아가요. 게다가 집합론적 타입은 학계에서 이론적 엄밀함까지 검증받으며 설계됐다는 점에서, 실용성과 이론을 둘 다 챙긴 보기 드문 사례예요.

한국 개발자에게는

Phoenix로 서비스를 운영 중인 팀이라면 이번 업데이트는 꽤 반가울 거예요. 그동안 런타임에 가서야 터지던 자잘한 타입 버그들을 컴파일 단계에서 미리 걸러낼 수 있으니까요. 무엇보다 기존 코드를 갈아엎지 않아도 된다는 게 실무적으로 큰 장점이에요. 점진적으로 적용하면 되니 리스크가 적죠.

아직 Elixir를 안 써봤더라도, '동적 언어에 어떻게 타입을 우아하게 얹을 것인가'라는 주제는 요즘 언어 설계의 큰 흐름이에요. 집합론적 타입이라는 접근을 한 번 들여다보는 것만으로도 타입 시스템을 보는 시야가 넓어질 거예요.

정리하면

Elixir 1.20은 '자유로운 동적 언어'와 '안전한 정적 언어' 사이에서 양쪽의 좋은 점만 취하려는 시도의 결정판이에요. 어노테이션 없이도 작동하는 타입 추론이 특히 인상적이고요.

여러분은 동적 언어에 타입을 붙이는 게 '자유를 해치는 일'이라고 보시나요, 아니면 '꼭 필요한 안전벨트'라고 보시나요? 실무에서 타입 때문에 고생했던 경험이 있다면 댓글로 풀어주세요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-relea...
SHARE
처리 중...