본 글은 2026-06-03 José Valim이 발표한 Elixir v1.20 점진적 타입 시스템을 한국 백엔드 팀 관점에서 점검합니다. BEAM/Phoenix 서비스를 운영 중이거나 도입 검토 중인 팀이 먼저 확인할 항목을 정리합니다.

참조 환경: Elixir v1.20.0, Erlang/OTP 25 이상. 코드와 동작은 공식 발표 본문과 GitHub v1.20.0 릴리즈 노트 기준입니다.
1. v1.20에서 무엇이 바뀌었는가
Elixir 공식 발표에 따르면 v1.20은 set-theoretic 기반 점진적 타입 시스템의 첫 개발 마일스톤을 완료한 버전입니다. 핵심은 타입 어노테이션 없이 모든 Elixir 프로그램에 대해 타입 추론과 점진적 타입 검사가 수행된다는 점입니다.
- 죽은 코드(dead code) 보고
- 실행 시 반드시 실패하는 verified bug 탐지
- 가드(guard)·case·조건문 기반 타입 narrowing
- 다중 코어 환경에서의 컴파일 속도 추가 개선
- 새 컴파일러 옵션
:module_definition도입
공식 블로그가 밝힌 바에 따르면 이번 구현은 University of Utah의 If T: Benchmark for Type Narrowing 벤치마크 13개 카테고리 중 12개를 통과했습니다. 동적 타이핑 코드에서도 실제 사용 패턴을 추적해 정밀한 타입 정보를 복원한다는 의미입니다.
2. dynamic() 타입 — 다른 점진 타입과 무엇이 다른가
TypeScript의 any나 Python typing의 Any는 “무엇이든 통과”의 의미로 사용되는 경우가 많아 도입 후 타입 정보를 사실상 폐기하는 사례가 잦습니다. Elixir는 동일한 자리를 dynamic()으로 채우면서 두 가지 속성을 추가합니다.
- 호환성(compatibility): 공급된 타입과 받는 함수의 허용 타입이 완전히 disjoint일 때만 위반 보고. 거짓 양성 최소화.
- 좁히기(narrowing): 변수 사용 흐름을 따라 타입 범위가 점진적으로 좁혀짐. 정적 타입 시스템에 가까운 정확도 제공.
공식 본문에 등장한 예시는 다음과 같습니다.
def add_a_and_b(data) do
data.a + data.b
end
여기서 data는 처음에는 dynamic()이지만 본문 내부에서 data.a, data.b로 사용되면서 %{..., a: number(), b: number()}로 좁혀집니다. 만약 data.a + data처럼 잘못 쓰면 즉시 위반이 보고됩니다.
3. Verified Bug — 어떤 오류를 잡아주는가

공식 정의 기준 verified bug는 “실행 경로에 도달했을 때 반드시 런타임 예외를 일으키는 타입 위반”입니다. 따라서 v1.20이 보고하는 위반은 단순한 추정이 아니라 결정적 오류입니다.
3-1. case·조건문에서의 자동 narrowing
case System.get_env("SOME_VAR") do
nil -> :not_found
value -> {:ok, String.upcase(value)}
end
공식 블로그가 제시한 위 예시에서 System.get_env/1의 반환은 nil | binary()입니다. 첫 절에서 nil이 걸러지므로 두 번째 절의 value는 자동으로 binary()로 좁혀지고 String.upcase/1 호출이 통과합니다.
3-2. 가드에서의 타입 추론
is_list/1, is_integer/1, is_map_key/2, tuple_size/1 같은 가드 함수가 그대로 타입 추론에 활용됩니다. 공식 발표 기준 tuple_size(x) < 3 가드가 걸린 함수에서 elem(x, 3)를 호출하면 위반이 즉시 보고됩니다.
3-3. 기존 코드 베이스에 미치는 영향
어노테이션이 없는 기존 코드라도 타입 추론은 동작합니다. 다만 실제 도입 시 false positive가 0이라고 단정하기는 어렵습니다. 공식 블로그는 “매우 낮은 거짓 양성률”이라고만 밝혔고, 구체 수치는 공개되지 않았습니다(확인 필요). 첫 도입 시에는 dev/test 환경에서 컴파일 결과를 먼저 수집하는 절차를 권장합니다.
4. Dialyzer를 어떻게 보완하는가
BEAM 생태계의 기존 정적 분석 도구는 Erlang의 Dialyzer입니다. Dialyzer는 success typing 방식으로 동작해 false negative가 많고 CI 통합이 번거롭다는 평이 많았습니다. v1.20의 내장 타입 검사는 컴파일 시점에 직접 동작하므로 별도 파이프라인이 필요 없습니다.
다만 두 도구의 검출 범위는 다르므로 즉시 Dialyzer를 제거하기보다 일정 기간 병행 운영해 결과를 비교하는 편이 안전합니다. spec 어노테이션 기반 검증이 필요한 라이브러리 코드에서는 당분간 Dialyzer가 더 정밀할 수 있습니다.
5. 컴파일 시간 개선과 새 옵션

공식 블로그에 따르면 v1.20은 멀티 코어 환경에서 컴파일 속도가 추가로 개선되었으며, José Valim이 공개한 langcompilebench 합성 벤치마크 기준 Elixir 빌드 도구가 BEAM 계열 중 가장 빠른 것으로 보고됩니다(저자 직접 측정).
또한 신규 컴파일러 옵션 :module_definition이 추가되었습니다. 값은 :compiled(기본)와 :interpreted 두 가지이며, 대규모 프로젝트의 컴파일 시간을 단축할 수 있습니다. 적용 방법은 다음과 같습니다.
# mix.exs
def project do
[
app: :my_app,
version: "0.1.0",
elixir: "~> 1.20",
elixirc_options: [module_definition: :interpreted],
deps: deps()
]
end
중요: .beam 출력 파일은 동일하며 defmodule 내부 코드의 실행 방식만 달라집니다. 자세한 동작은 Code.put_compiler_option/2 문서에서 확인할 수 있습니다.
6. 한국 백엔드 팀 도입 전 체크리스트

운영 환경에 즉시 적용하기 전 다음 항목을 점검하십시오.
- OTP 버전 호환성: Erlang/OTP 25 이상 권장. CI 이미지가 OTP 24에 고정된 팀은 빌드 이미지 교체 계획 선행.
- 의존 라이브러리 컴파일: Ecto, Phoenix, Broadway 등 핵심 라이브러리의 v1.20 호환 패치 적용 여부를 hex.pm 릴리즈 노트로 확인.
- CI 경고 게이트: v1.20 도입 첫 주에는 타입 경고를 실패가 아닌 정보 수준으로 처리. 거짓 양성 발생 패턴을 먼저 수집한 뒤 점진적으로 엄격화.
- Dialyzer 병행: 즉시 제거하지 말고 최소 한 분기 병행 운영. 검출 차이를 sprint 리뷰에서 비교.
- 회사 보안·법무 요건: 신규 컴파일러 동작이 보안 스캐너(예: SCA 도구) 결과 포맷에 영향을 미치는지 사전 확인.
7. 향후 로드맵 — 타입 시그니처는 언제 도입되는가
공식 발표는 user-supplied 타입 시그니처 도입을 다음 마일스톤으로 명시했습니다. 다만 도입 시점은 네 가지 조건을 충족해야 한다고 밝혔습니다.
- v1.20 타입 시스템 성능에 대한 충분한 만족
- 재귀 타입(recursive types)의 효율적 구현
- 파라메트릭 타입(parametric types)의 효율적 구현
- 맵의 key-value enumerable 순회를 효율적으로 표현할 수 있는 방법 연구 완료
네 번째 항목은 아직 연구 단계로, José Valim의 ElixirConf EU 2026 키노트에서도 동일한 입장이 확인됩니다. 따라서 “타입 시그니처가 곧 나온다”는 가정 아래 코드 베이스를 재구성하는 결정은 시기상조입니다.
8. 정리 — 누구에게 어떤 가치가 있는가
v1.20 도입은 다음 상황에서 가장 큰 가치를 줍니다.
- Phoenix 기반 서비스를 운영 중이며 Dialyzer를 사용하지 않는 팀
- 점진적 도입 정책을 선호해 어노테이션 추가 비용을 들이고 싶지 않은 조직
- BEAM 호환 컴파일 속도를 빌드 파이프라인 SLA에 포함시킨 팀
반대로 Dialyzer가 사내 검증 표준이고 spec 어노테이션을 광범위하게 유지보수 중인 팀, v1.20 호환 패치가 없는 의존 라이브러리를 다수 쓰는 팀은 신중해야 합니다. dev 환경에서 검출 결과를 검토한 뒤 단계적으로 운영에 적용하기를 권장합니다.
관련 글
외부 의존성 점검과 백엔드 운영 결정에 도움이 되는 본 블로그 기존 글을 함께 참고하면 좋습니다.
- 외부 라이브러리 도입 전 의존성을 어떻게 평가할지 다룬 Anthropic이 SEC에 S-1을 제출했다 — 한국 백엔드 팀의 의존도 점검 체크리스트는 신규 기술 도입 의사결정에 직접 적용 가능합니다.
- 오픈소스 도입 시 라이선스·운영 안정성을 살피는 절차는 public-apis 43만 스타 — 외부 무료 API 도입 전 백엔드 체크리스트에서 자세히 다룹니다.
- BEAM 외부 워크플로 엔진 대안 검토와 Postgres 활용 사례는 Postgres 하나로 Durable Workflow — Temporal·Airflow 대체 가능성 점검을 참고하십시오.
📌 함께 보시면 좋은 글
※ 본 글은 AI(Claude)의 초안을 기반으로 편집자 검수를 거쳐 발행되었습니다. (한국 AI기본법 대응 고지)
이직·퇴사, 지금 움직여도 될지 헷갈리시나요?
막연히 불안한 건지, 정말 시점이 온 건지 판단이 어려울 때가 있습니다.
5분 체크리스트로 지금 상태를 먼저 정리해보세요.
결론을 대신 내리기보다, 스스로 판단할 기준을 잡는 데 도움을 드립니다.
아직 확신이 없다면, 지금이 ‘고민 단계’인지부터 먼저 점검해보세요