웹 개발을 위해 어떤 새로운 언어를 배워야 할까?
올해 목표 중 하나는 새로운 프로그래밍 언어를 배우는 것이다. 새로운 언어를 배운 지 꽤 오래됐고, 내가 잘 아는 언어들(Go, Python, C++)은 서로 비슷한 점이 많다고 느낀다. 그래서 나에게는 다소 낯설게 느껴지는 언어로 익숙한 영역에서 조금 벗어나 보고 싶다.
요구사항
내가 찾는 조건은 다음과 같다:
- 내가 잘 아는 언어들과 뚜렷하게 다르다
- 웹 앱을 일급으로 지원한다
- 작고 단순한 앱을 쉽게 만들 수 있다
- 대형 프로젝트에 지나치게 최적화되어 있다는 느낌이 드는 Angular의 반대가 필요하다
- 백엔드와 프론트엔드를 모두 지원한다
- 프론트엔드 프레임워크가 꼭 있어야 하는 것은 아니지만, Go나 Python처럼 백엔드와 프론트엔드에 동일한 툴체인을 사용할 수 있기를 바란다.
- Elm처럼 프론트엔드 전용인 것은 원하지 않는다.
- 프론트엔드와 백엔드 코드에 별도의 빌드 체인을 두고 싶지 않다(가벼운 백엔드 템플릿과 함께 바닐라 JS를 쓰는 정도는 괜찮다).
- 데이터 저장소로 SQLite와 호환된다
- 유닛 테스트를 잘 지원한다
- 오픈소스다
- 활발히 유지보수되고 있다
있으면 좋은 것들
- 좋은 전자책이 있다.
- 유료 책도 괜찮다.
- 낮은 추상화 / 적은 “마법”
- 나는 Angular나 Vue가 너무 “마법” 같다고 느낀다. 이해하지 못하는 Node.js 패키지들이 뒤섞여 있기 때문이다. 처음 시작할 때는 괜찮아 보이지만, 간단한 프로그램을 넘어서면 추상화는 새기 마련이다라는 걸 깨닫게 되고, 겉으로 보이지 않는 곳에 내가 이해하지 못하는 복잡한 시스템이 있다는 걸 알게 된다. 반대편 끝에는 Zig가 있는데, 이 언어는 아주 쉽게 논리를 따라갈 수 있다고 느껴진다.
- 정적 타이핑
목표가 아닌 것
- 최대 성능
- 내가 만드는 앱 대부분은 성능 요구사항이 매우 낮다. 보통 유일한 사용자는 나 자신이고, 그 외의 경우에도 동시에 몇십 명 이상의 사용자를 예상하지 않는다.
- 한 명의 사용자에게도 느린 것은 쓰고 싶지 않지만, 높은 확장성을 달성한다는 명목으로 트레이드오프를 감수하는 것은 피하고 싶다.
언어별 선호도
참고로 내가 아는 다른 프로그래밍 언어들을 얼마나 즐겁게 다루는지 정리하면 다음과 같다:
| 언어 | 평점 | 경험 | 비고 |
|---|---|---|---|
| Go | 9 | 많음 | Go는 웹 앱을 위해 아름답게 설계되었다. |
| Zig | 8 | 적음 | 고효율·고성능 코드를 작성할 때 아주 재미있지만, 웹 앱용으로는 이상적인 도구는 아니다. |
| Python | 6 | 많음 | Python으로 많은 작업을 했지만, 부실한 패키징과 타입 부재가 점점 거슬리기 시작했다. |
| JavaScript | 5 | 보통 | Node.js에 의존하지 않는 더 나은 패키징/테스트 도구가 있었으면 좋겠다. |
| Angular | 2 | 적음 | 너무 마법 같고 복잡하다. |
| Vue | 4 | 보통 | 한동안 Vue 2를 좋아했지만, 내 코드가 아니라 프레임워크의 버그나 함정 때문에 앱이 망가진 경험이 너무 많다. |
| C++ | 4 | 보통 | 한동안 써보지 않았다. Google처럼 훌륭한 툴링 지원이 있는 환경에서는 괜찮지만, 2025년에 C++ 개발 환경을 처음부터 구축하는 일은 즐겁지 않을 것 같다. |
| C | 6 | 적음 | C++와 같은 문제가 있지만 단순함은 높이 평가한다. |
연구 방법
각 언어를 조사하기 위해 다음과 같은 일을 했다:
- 해당 언어의 기능 소개 페이지를 읽었다
- 해당 언어의 주요 웹 프레임워크 기능 소개 페이지를 읽었다
- 각 언어별 간단한 “hello world” 웹 앱 예제를 찾아봤다
- LLM에 내가 아는 언어들과 해당 언어의 기능을 비교해 달라고 요청했다
후보
Elixir / Phoenix / LiveView
Elixir는 내가 똑똑하다고 생각하는 많은 블로거들이 즐겨 쓰는 것 같아 내 후보 목록에서 상위권에 있다. 또 개념이나 기능 중에는 낯설면서도 흥미롭게 들리는 것들이 많은 것 같다.
Elixir에 매우 공식적인 웹 프레임워크인 Phoenix가 있다는 점이 마음에 든다. Phoenix가 기본적으로 Tailwind CSS에 의존한다는 점은 그리 마음에 들지 않지만, 끌 수 있는 것 같다.
새로운 기능은 Phoenix LiveView인데, LiveView가 웹소켓을 이용해 페이지 새로고침 없이 백엔드 상태를 프론트엔드로 밀어 넣기 때문에 JavaScript를 많이 쓰지 않고도 웹 앱을 만들 수 있는 방식인 것 같다. 하지만 LiveView는 SPA를 생성하는데, 나는 SPA에 완전히 질렸다고 느끼고 더 이상 투자하고 싶지 않다. Phoenix를 LiveView 없이 사용할 수도 있지만, LiveView 쪽에 리소스를 많이 투자하고 있다는 느낌을 받는다.
- 장점
- ✅ 멋진 언어 기능
- ✅ 웹 앱을 위한 매력적인 솔루션을 갖추고 있다
- ✅ Erlang 위에 구축되어 Erlang 생태계를 활용할 수 있다
- 단점
- ❌ 정적 타이핑이 없다
- ❌ LiveView는 SPA를 위해 설계되었다
- ❌ LiveView는 “마법”처럼 느껴진다
Gleam / Lustre
Gleam은 Elixir의 패기 넘치는 동생 같은 느낌이다. 패턴 매칭이나 파이핑 같은 언어 기능이 Elixir와 공통점이 많지만, 정적 타이핑을 지원한다(좋다!).
Gleam은 메타프로그래밍을 지원하지 않는데, 이에 대해서는 복잡한 심정이다. 일반적으로 나는 메타프로그래밍을 좋아하지 않고, 할 때마다 내가 그것을 할 만큼 충분히 똑똑하지 않다고 느끼기 때문에, 한편으로는 Gleam이 이 기능을 제외한 것이 반갑다. 반면 내 목표가 새로운 것을 시도하는 것이라면 억지로라도 메타프로그래밍에 도전해야 할지도 모른다.
Gleam의 웹 프레임워크는 lustre라고 하며, HTML을 Gleam 함수 호출 형태로 작성하게 한다:
pub fn main() {
let app =
lustre.element(
html.div([], [
html.h1([], [html.text("Hello, world!")]),
html.figure([], [
html.img([attribute.src("https://cdn2.thecatapi.com/images/b7k.jpg")]),
html.figcaption([], [html.text("A cat!")])
])
])
)
let assert Ok(_) = lustre.start(app, "#app", Nil)
Nil
}솔직히 저렇게 HTML을 쓰는 건 엄청 지루하고 보기에도 좋지 않아 보이지만, 그래도 시도해 볼 의향은 있다.
Gleam은 아직 임계 규모에 도달하지 못했기 때문에 5년 뒤에 이 언어가 남아 있지 않을 위험도 있지만, 뭐 괜찮다고 생각한다. Gleam으로 비즈니스를 만들려는 게 아니라 그냥 가지고 놀면서 새로운 것을 배우려는 것이니까.
- 장점
- ✅ 멋진 언어 기능
- ✅ Erlang 위에 구축되어 Erlang과 Elixir 생태계를 모두 활용할 수 있다
- 단점
- ❌ 비교적 새롭고 미성숙한 언어다
- ❌ 공식 문서 외에는 학습 자료가 많지 않다
Haskell
내가 아는 Haskell을 좋아하는 사람들은 컴파일러나 언어 설계에 대해 고민하는 걸 좋아하는, 얄밉도록 똑똑한 언어 덕후인 경우가 많다. 나는 그런 사람이 아니다.
Haskell에 가장 호기심을 갖게 된 계기는 Alexis King의 “Parse, don’t validate”다. 그 글 덕분에 이전에는 별로 신경 쓰지 않던 정적 타이핑의 가치를 알게 됐다. 나는 Go에서 Alexis의 아이디어를 적용하고 있지만, Haskell은 데이터 타입으로 훨씬 더 많은 것을 표현할 수 있다고 하니 멋지게 들린다.
Haskell에는 모나드, 무한 자료구조, 대수적 데이터 타입 같은 머리를 확장시켜 줄 것 같은 기발한 기능이 많지만, 한편으로는 생산적으로 언어를 다루기까지 학습 곡선이 가파를 것 같다는 느낌도 든다.
인기 있는 웹 프레임워크는 IHP와 Yesod인 것 같다. IHP는 PostgreSQL을 엄격하게 요구하는 것 같아 탈락이고, 그러면 Yesod가 남는다. 하지만 Yesod는 좋아 보인다. 무료 O’Reilly 책도 있고, 간단한 예제들도 문법이 좀 낯설긴 해도 직관적으로 보인다.
Haskell / Yesod는 내가 배워야 할 스택처럼 느껴지지만, Elixir나 Gleam만큼 재미있어 보이지는 않는다.
- 장점
- ✅ 풍부하고 성숙한 생태계
- ✅ 내가 아는 어떤 언어보다 강력한 타입 시스템
- ✅ Nix를 이해하는 데 도움이 될지도 모른다
- ✅ 학습 자료가 풍부하다(무료 자료 포함)
- 단점
- ❌ 코드가 좀 못생겨 보이지만, 그냥 낯설어서 그럴 수도 있다
- ❌ 학습 곡선이 가파른 것 같다
- ❌ 괴짜 Haskell 사람이 될 것 같다
Ruby / Rails
Ruby on Rails는 많은 사람들이 정말 좋아하고 생산성이 엄청나다고 느끼는 걸 알기 때문에 끌린다. 하지만 언어 기능을 살펴보면 Python에서 온 입장에서 새롭거나 혁신적으로 느껴지는 것이 잘 보이지 않는다.
Rails에 대한 내 인상은 의견이 강한 프레임워크라는 것이지만, 그 의견들이 정말 훌륭하다는 것이다. Rails 팬들은 프레임워크가 개발자의 힘이나 커스터마이징 가능성을 빼앗지 않으면서도 고된 작업을 얼마나 잘 추상화해 주는지를 극찬한다.
- 장점
- ✅ 풍부하고 성숙한 생태계
- ✅ 작은 규모에서도 잘 동작하도록 설계되었다
- ✅ 많은 사람들이 좋아하는 것 같다
- 단점
- ❌ 정적 타이핑이 없다
- ❌ Ruby는 Python과 꽤 비슷해 보여서 얼마나 배울 수 있을지 모르겠다
PHP / Laravel
고백하자면, 나는 PHP에 대해 엘리트주의적인 거부감을 가지고 있다.
대학 시절 PHP와 재미있게 놀았지만, 다른 언어를 배우고 나니 PHP는 그냥 거슬리게 느껴졌다.
최근 몇 년간 PHP가 성숙해졌고 Laravel 덕분에 PHP 웹 개발이 전문적이고 매끄럽게 느껴진다는 말을 들어서 한 번 살펴봤다.
기본적인 Laravel 앱 예제를 찾는 것이 놀라울 정도로 어렵다는 걸 알게 됐다. Laravel 문서는 기본 앱을 만드는 명령어는 보여주지만, 코드가 어떻게 생겼는지나 어떻게 렌더링되는지는 보여주지 않는다. Laracasts를 통해 동영상 강의를 판매하는 것이 Laravel 비즈니스 모델의 일부이기 때문에, 공개된 텍스트 기반 문서가 그다지 좋지 않은 것 같다 (수정: Laravel은 Laracasts를 소유하고 있지 않지만, 일부 Laravel 핵심 개발자들이 Laracasts에 강의를 게시한 적은 있다).
내가 찾을 수 있었던 기본 예제에 가장 가까운 것은 스타터 키트였는데, React(사양한다), Vue(사양한다), Livewire(모르지만 함께 엮여 있는 걸 보니 별로다)를 끌어온다. 하지만 Laravel의 내장 프론트엔드 솔루션인 Blade Templates는 HTML 템플릿 언어 치고는 실제로 꽤 괜찮아 보인다.
- 장점
- ✅ 정적 타이핑을 지원한다
- ✅ 첫인상으로는 Blade 템플릿이 마음에 든다
- 단점
- ❌ 언어가 거슬린다
- ❌ Laravel에 대한 좋은 글로 된 입문 자료를 찾을 수 없었다
Scala
Scala에 대해 좋은 얘기를 많이 듣는다. 언어도 흥미로워 보이고, 다른 언어에서는 경험해 보지 못한 기능이 많다. 문법은 덜 장황한 Java처럼 보여서 좋다.
Scala는 강하게 객체 지향적인 것 같다. 예전에는 객체 지향을 좋아했지만, Go의 훨씬 더 제한적인 객체 지향 기능을 수년간 사용한 뒤로는 상속과 다형성이 득보다 실이 많다고 느끼게 됐다.
주류 웹 프레임워크는 Play인 것 같은데, 문서를 읽어보니 오래되어 보이고 엔터프라이즈 느낌이 난다. hello world 튜토리얼은 Play 아키텍처의 복잡한 도표로 시작하는데, 엄청 지루하고 프레임워크를 배우고 싶은 의욕이 전혀 생기지 않는다.
Scalatra는 단순함에 더 초점을 맞춘 또 다른 Scala 웹 프레임워크지만, 문서에 예제가 상당히 부족하다. 다만 구매할 수 있는 전자책은 있다.
- 장점
- ✅ 가변성 어노테이션이나 복합 타입 같은 타이핑 관련 흥미로운 기능
- 단점
- ❌ Scala의 객체 지향적 측면은 C++의 안 좋은 부분을 떠올리게 하지만, 그 정도까지 심하지는 않다
- ❌ 내가 즐기지 않는 Java 생태계와 강하게 얽혀 있는 것 같다
- ❌ 어떤 웹 프레임워크에도 흥미가 생기지 않는다
정리
Gleam이 내 목표와 경험에 가장 잘 맞는 것 같고, Elixir가 그 다음으로 가깝다. Haskell은 용기와 인내가 생겼을 때 배워야 할 언어다.
Gleam + Lustre와 Elixir + Phoenix를 조금씩 실험해 보면서 어느 쪽이 더 흥미로운지 살펴볼 계획이다.
글을 무작위로 읽기