Which New Language Should I Learn for Web Development?

Michael Lynch

웹 개발을 위해 어떤 새로운 언어를 배워야 할까?

원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기

올해 목표 중 하나는 새로운 프로그래밍 언어를 배우는 것이다. 새로운 언어를 배운 지 꽤 오래됐고, 내가 잘 아는 언어들(Go, Python, C++)은 서로 비슷하다고 느껴져서, 내게는 좀 낯설게 느껴지는 언어로 컴포트 존에서 살짝 벗어나 보고 싶다.

요구사항

내가 찾는 조건은 다음과 같다:

  • 내가 잘 아는 언어들과 확연히 다르다
  • 웹 앱을 일급으로 지원한다
  • 작고 단순한 앱을 쉽게 만들 수 있다
    • 대규모 프로젝트에 지나치게 최적화된 느낌인 Angular의 반대편에 있는 무언가를 원한다
  • 백엔드와 프론트엔드를 모두 지원한다
    • 프론트엔드 프레임워크가 꼭 있어야 하는 건 아니지만, Go나 Python에서처럼 백엔드와 프론트엔드에 동일한 툴체인을 사용할 수 있기를 원한다.
    • Elm처럼 프론트엔드 전용인 것은 원하지 않는다.
    • 프론트엔드와 백엔드 코드에 별도의 빌드 체인을 두고 싶지 않다(가벼운 백엔드 템플릿과 함께 바닐라 JS를 쓰는 건 괜찮다).
  • 데이터 저장소로 SQLite와 호환된다
  • 유닛 테스트를 잘 지원한다
  • 오픈소스다
  • 활발히 유지보수되고 있다

있으면 좋은 것들

  • 좋은 전자책이 있다.
    • 유료 책도 괜찮다.
  • 추상화가 적고 ‘마법’이 제한적이다.
    • Angular나 Vue 같은 프레임워크는 너무 ‘마법 같다’고 느낀다. 내가 이해하지 못하는 Node.js 패키지들이 뒤섞여 있기 때문이다. 처음 시작할 때는 괜찮아 보이지만, 간단한 프로그램을 넘어서면 추상화는 새기 마련이고, 겉으로는 보이지 않던 복잡한 시스템이 숨어 있었다는 걸 깨닫게 된다. 반대편 끝에 있는 Zig는 이해하기가 극도로 쉽다고 느껴진다.
  • 정적 타이핑

목표가 아닌 것

  • 최대 성능
    • 내가 만드는 앱 대부분은 성능 요구사항이 매우 낮다. 보통 유일한 사용자는 나 자신이고, 그 외의 경우에도 동시에 수십 명 이상이 쓰는 일을 예상하지 않는다.
    • 한 명의 사용자에게 느린 것은 원하지 않지만, 높은 규모를 달성하기 위해 트레이드오프를 감수하는 것은 피하고 싶다.

여러 언어에 대한 선호도

참고로, 내가 아는 몇몇 프로그래밍 언어를 얼마나 좋아하는지는 다음과 같다:

언어평점경험비고
Go9많음Go는 웹 앱에 아주 잘 설계된 언어다.
Zig8적음고효율 혹은 고성능 코드에는 매우 재미있지만, 웹 앱에는 이상적인 도구가 아니다.
Python6많음Python으로 많은 작업을 했지만, 형편없는 패키징과 타입 부재가 점점 거슬리기 시작했다.
JavaScript5보통node.js에 의존하지 않는 더 나은 패키징/테스팅 도구가 있었으면 좋겠다.
Angular2적음너무 마법 같고 복잡하다.
Vue4보통한동안 Vue2를 정말 좋아했지만, 내 코드가 아니라 프레임워크의 버그나 함정 때문에 앱이 망가지는 일을 너무 많이 겪었다.
C++4보통한동안 쓰지 않았다. Google처럼 훌륭한 툴링 지원이 있는 환경에서는 괜찮지만, 2025년에 C++ 개발 환경을 처음부터 구축하는 일은 즐겁지 않을 것 같다.
C6적음C++와 같은 문제가 있지만 단순함은 높이 산다.

조사 방법

각 언어를 조사하기 위해 나는 다음과 같이 했다:

  • 언어의 기능 페이지를 읽었다
  • 해당 언어의 대표 웹 프레임워크 기능 페이지를 읽었다
  • 각 언어로 된 간단한 “hello world” 웹 앱 예제를 찾아봤다
  • LLM에게 내가 아는 언어들과 각 언어의 기능을 비교해 달라고 요청했다

후보

Elixir / Phoenix / LiveView

Elixir가 내 목록 상위에 있는 이유는 내가 똑똑하다고 생각하는 많은 블로거들이 Elixir를 즐겨 쓰는 것 같기 때문이다. 또 Elixir에는 낯설고 흥미로워 보이는 개념과 기능이 있는 것 같다.

Elixir에 아주 공식적인 웹 프레임워크가 있다는 점이 마음에 든다: Phoenix. Phoenix가 기본적으로 Tailwind CSS에 의존한다는 점은 별로지만, 끌 수 있는 것 같다.

요즘 새로 나온 것은 Phoenix LiveView인데, LiveView가 웹소켓을 이용해 페이지 새로고침 없이 백엔드 상태를 프론트엔드로 밀어 넣어주기 때문에 JavaScript를 많이 쓰지 않고도 웹 앱을 만들 수 있는 방법인 것 같다. 하지만 LiveView는 SPA를 생성하고, 나는 SPA에 정말 질렸고 더 이상 SPA에 투자하고 싶지 않다. LiveView 없이 Phoenix를 사용할 수도 있지만, Phoenix 팀이 리소스를 많이 쏟는 곳이 LiveView라는 느낌이 든다.

  • 장점
    • ✅ 멋진 언어 기능
    • ✅ 웹 앱을 위한 매력적인 솔루션이 있다
    • ✅ Erlang 기반이라 Erlang 생태계를 활용할 수 있다
  • 단점
    • ❌ 정적 타이핑이 없다
    • ❌ LiveView는 SPA용으로 설계됐다
    • ❌ LiveView가 ‘마법 같다’고 느껴진다

Gleam / Lustre

Gleam은 Elixir의 패기 넘치는 동생 같은 느낌이다. 패턴 매칭이나 파이핑 같은 언어 기능이 Elixir와 많이 겹치지만, 정적 타이핑이 있다(좋다!).

Gleam은 메타프로그래밍을 지원하지 않는데, 이에 대해서는 생각이 엇갈린다. 일반적으로 나는 메타프로그래밍을 싫어하고, 할 만큼 똑똑하지 않다고 항상 느끼기 때문에 어떤 면에서는 Gleam이 이 기능을 빼버린 게 반갑다. 반면에 내 목표가 새로운 것을 시도하는 것이라면 억지로라도 메타프로그래밍을 시도해 봐야 할지도 모른다.

Gleam의 웹 프레임워크는 lustre라고 하며, Gleam 함수 호출 형태로 HTML을 작성하게 한다:

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에는 모나드, 무한 자료구조, 대수적 데이터 타입 같은 정신을 확장시켜 줄 것 같은 기상천외한 기능이 많지만, 한편으로는 언어를 생산적으로 쓰기까지 학습 곡선이 가파를 것 같다는 느낌도 든다.

인기 있는 웹 프레임워크는 IHPYesod인 것 같다. IHP는 PostgreSQL을 엄격하게 요구하는 것 같아 탈락이고, 그러면 Yesod가 남는다. 하지만 Yesod는 괜찮아 보인다. 무료 O’Reilly 책도 있고, 간단한 예제들도 문법은 좀 낯설지만 직관적으로 보인다.

Haskell / Yesod는 내가 배워야 할 것 같은 스택이지만, Elixir나 Gleam만큼 재미있어 보이지는 않는다.

  • 장점
    • ✅ 풍부하고 성숙한 생태계
    • ✅ 내가 아는 어떤 언어보다 강력한 타입 시스템
    • ✅ Nix를 이해하는 데 도움이 될지도 모른다
    • ✅ 학습 자료가 풍부하다(무료 자료 포함)
  • 단점
    • ❌ 코드가 좀 못생겨 보이지만, 그냥 낯설어서 그럴지도 모른다
    • ❌ 학습 곡선이 가파른 것 같다
    • ❌ 이상한 Haskell 사람이 될 것 같다

Ruby / Rails

Ruby on Rails가 매력적인 이유는 많은 사람들이 Rails를 사랑하고 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 웹 프레임워크지만, 문서에 예제가 꽤 빈약하다. 다만 살 수 있는 전자책이 하나 있다.

  • 장점
    • ✅ variance annotation이나 compound type 같은 타이핑 관련 흥미로운 기능
  • 단점
    • ❌ Scala의 객체 지향적인 측면이 C++의 안 좋은 부분을 떠올리게 한다. 그만큼 심하지는 않지만
    • ❌ Java 생태계와 너무 밀접하게 얽혀 있는 것 같고, 나는 그게 별로다
    • ❌ 어떤 웹 프레임워크에도 흥미가 생기지 않는다

요약

Gleam이 내 목표와 경험에 가장 잘 맞는 것 같고, Elixir가 그 다음으로 가깝다. Haskell은 용기와 인내심을 낼 때 배워야 할 언어다.

Gleam + Lustre와 Elixir + Phoenix를 조금씩 실험해 보고 어느 쪽이 더 흥미로운지 살펴볼 계획이다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글