모든 것은 함수다

202025년 09월 04일4

스탠다드 ML의 세계에 깊이 빠져들수록, 조던 워크의 사고방식은 근본부터 변해가고 있었다. 불변성을 넘어, 그의 마음을 사로잡은 또 하나의 강력한 개념은 바로 ‘함수를 일급 객체(First-class citizen)’로 취급하는 것이었다.

자바(Java)나 C++ 같은 전통적인 객체지향 언어에서 함수(메서드)는 클래스나 객체에 종속된 존재였다. 스스로 존재할 수 없고, 언제나 특정 객체의 소유물이었다.

하지만 스탠다드 ML이나 자바스크립트 같은 언어에서 함수는 달랐다.

  • 함수를 변수에 할당할 수 있다.
  • 함수를 다른 함수의 인자(argument)로 전달할 수 있다.
  • 함수가 또 다른 함수를 결과값으로 반환할 수 있다.

마치 숫자나 문자열처럼, 함수를 자유롭게 다룰 수 있는 것이다. 이 특성은 조던에게 새로운 무기를 쥐여주었다.

그는 XHP로 만들었던 <ui:post> 컴포넌트를 떠올렸다. 그것은 클래스였다. 상태를 가질 수 있고, 복잡한 생명주기를 가질 수도 있는, 무겁고 장엄한 존재였다.

하지만 모든 UI 조각이 그렇게 거대할 필요는 없었다. 뉴스피드 속 ‘좋아요’ 버튼을 한번 생각해보자. 이 버튼의 역할은 지극히 단순하다. ‘좋아요가 눌렸는지(isLiked)’와 ‘총 몇 개인지(likeCount)’라는 두 가지 데이터를 받아서, 적절한 모양의 HTML을 뱉어내기만 하면 된다.

조던은 머릿속에서 코드를 그려보았다. 만약 ‘좋아요’ 버튼을 클래스가 아닌, 단순한 함수로 정의한다면?

// 가상의 자바스크립트 코드
function LikeButton(data) {
  if (data.isLiked) {
    return '<button class="liked">좋아요 취소 (' + data.likeCount + ')</button>';
  } else {
    return '<button>좋아요 (' + data.likeCount + ')</button>';
  }
}

// 사용법
var postData = { isLiked: true, likeCount: 15 };
var buttonHtml = LikeButton(postData);

// buttonHtml 변수에는 이제 완성된 HTML 문자열이 담긴다.
// -> '<button class="liked">좋아요 취소 (15)</button>'

LikeButton 함수는 완벽한 순수 함수(Pure Function)였다.

  • 오직 입력받은 data에만 의존한다.
  • 동일한 data가 들어오면 언제나 동일한 HTML 문자열을 반환한다.
  • DOM을 직접 건드리거나 외부 상태를 변경하는 어떤 부작용(Side Effect)도 일으키지 않는다.

이 접근법은 놀라울 만큼 단순하고 명쾌했다. 복잡한 클래스 상속이나 this 키워드의 혼란스러움도 없었다. 그냥 함수를 호출하면, UI 조각이 튀어나왔다.

더 나아가, 함수는 조립이 가능했다.

// 가상의 자바스크립트 코드
function Post(postData) {
  var authorHtml = AuthorProfile(postData.author);
  var contentHtml = PostBody(postData.content);
  var likeButtonHtml = LikeButton(postData.likes); // 함수 호출

  return '<div>' + authorHtml + contentHtml + likeButtonHtml + '</div>';
}

하나의 거대한 Post 함수가 더 작은 AuthorProfile 함수, PostBody 함수, LikeButton 함수를 호출하여 그 결과물들을 조립하고 있었다. 복잡한 UI가 단순한 함수들의 조합으로 완벽하게 표현될 수 있었다.

“모든 것은 함수다…”

조던은 나지막이 읊조렸다. 그것은 함수형 프로그래밍의 핵심을 관통하는 선언이었다. UI를 객체의 집합이 아닌, 함수의 중첩과 조합으로 바라보는 새로운 관점.

이 깨달음은 1부 ‘혼돈의 시대’의 종언을 고하는 신호탄이었다. 그는 더 이상 기존의 코드베이스를 개선하거나 보수하는 데 머무르지 않을 터였다. jQuery, 백본, 심지어 XHP의 성공적인 개념들마저도 과거의 유산으로 남겨두고, 완전히 새로운 판을 짜야 할 때가 왔음을 직감했다.

스탠다드 ML의 철학으로 무장한 그는 이제, 자바스크립트라는 혼돈의 대지 위에 ‘함수’와 ‘불변성’이라는 두 개의 기둥을 세워, 새로운 질서의 성전을 건축할 준비를 마쳤다. 그 누구도 가보지 않은 길, 그 위대한 여정의 두 번째 장이 막 시작되려 하고 있었다.