차세대 마이크로서비스를 위해 Clojure를 사용해야 하는 이유

마이크로 서비스를 위한 기능 구현에 Clojure를 선택해야 하는 이유가 몇가지 있습니다. 

  • 코드 재사용 : 여러 팀은 이미 구축한 코들 이용할 수 있습니다. 예를들면: 검색, 파일 저장소 혹은 pub/sub
  • 애플리케이션의 기능을 독립적으로 확대축소 할 수 이쓴ㄴ 기능.
  • 기술 선태에서의 자유로움

이 글은 세번째 관점에 대해 이야기 합니다.

기술선택의 자유로움


마이크서비스 기반 구조의 중요한 특징입니다. 마이크로 서비스는 작아야 합니다. 얼마나 작아야 하는지는 회사나 팀의 문화에 따라 달라지지만, 마이크로서비스는 100줄의 코드보다 커서는 안된다고 들었습니다. (만약 자바였다면, 여전히 작다고 할 것입니다)

마이크로서비스는 작아야 하기 때문에, 개발자는 가장 좋은 개발기술이 무엇이든 이용하는데 주저하지 않습니다. 그것이 잘못된 선택이었더라도 상관없습니다. - 선택을 통해 배우고 그것을 새로운 미래 프로젝트에서 고려하는 지식으로 활용합니다.
어떤 경우는 몇백줄의 코드만으로 가능하기 때문에 더 잘 어울리는 언어로 마이크로서비스를 다시 작성할것을 결심할 수도 있습니다.

모두 멋지고 좋은 일입니다. 그렇지만 만약 기술의 선택에서 자유롭다면 현재 당신이 사용하는 언어대신 클로져(Clojure)를 선택해 보는 것은 어떨런지요.

현대의 Lisp


"Lisp 는 비밀을 가진 외계이 기술로 만들어졌습니다." — lisperati.com

Clojure 는 자바 가상 머신에 동작하는 현대의 리스프(Lisp) 입니다. JVM을 타겟(기반)으로 하는 것은 많은 이점을 가집니다:

  • JVM 은 인간이 역량으로 수십년간 더욱 빨라져 왔습니다. 
  • 문제 도메인의 확장된 범위에서 훌륭한 라이브러리가 있습니다. 새로운 바퀴를 개발하는 것보다 문제 자체에 집중할 수 있습니다.
  • JVM은 작거나 큰 업무영역 모두에서 폭넓게 사용됩니다. JVM이 더욱 적용가능한 범위를 넓히고 있습니다.

그래서, JVM 은 훌륭하며 이미 자바를 사용합니다. 왜 전환할 필요가 있을까요?

그래도, 자바는 자신의 한계를 가지고 있습니다. 다른 플랫폼에서 당연한 것으로 여겨지는 (람다 같은) 기능이 부족합니다. 물론 자바 8에서 개정되고 있습니다. 
타입 시스템은 과동하게 제한적이고 타입 추론은 이상적이지 않습니다.
또한 자바는 data structure literals도 가지고 있지 않아 더 산만합니다.

추가적으로 자바에서의 보통의 개발 피드백 사이클은 너무 깁니다. 애플리케이션과(혹은) 테스트를 수행하기 위해 여러번의 JVM 재시작을 요구합니다 - 하물려 한줄의 코드를 변경하였다 하더라도 말입니다 (HotSwap 이 이 부분을 완화시키기는 합니다)
실험을 시작하기위해 많은 양의 구조적인 필수사항을 요구합니다. 마지막으로, 상호작용 개발환경이 없는것은 치명적입니다.

Lisp 같다는 것은 무엇을 의미하는가?


"Lisp는 언어가 아니라 구축 재료이다." — Alan Kay

Lisp 개발을 한다는 것은 매우 유연하고, 프로그래밍에 데이터 기반 접근을 이용하며, 매크로의 강력함을 통해 뛰어난 적응성을 제공함을 의미합니다. 
Lisp 매크로는 C 매크로에 비해 매우 어려운 것은 중요한 점입니다.
C 매크로는 C 프리프로세서에 의해 처리되며 정의된 매크로는 소스코드에서 발견된 이름을 대치합니다.

반면, Clojure 매크로는 평가되는 시점과 조건을 제어하는 기능을 포함하여 Clojure 코드 자체로 처리됩니다. - 그렇습니다. AST 를 전환시킬 수 있습니다.

실험적인 아름다움


“Lisp 를  몇 주 배우는 중, 나는 다른 언어로 프로그래밍 하는 것이 믿을 수 없을 정도로 제약이 많다는 것을 알았다.” — Paul Graham, Road to Lisp

만약 전통적인 개발 사이클로 개발한다면 (소스 수정 -> 컴파일/구동 -> 수정코드결과 확인/테스트 수행 -> 재수정, 반복) 이러한 강력함이 모두 소용이 없을 것입니다.
소프트웨어 개발자의 매력 중 하나는 새로운 것을 만드는 것에 있습니다. 코드를 짜고 바로 그 결과를 확인하는 것은 놀라운 경험입니다. 
중요한 것은 이렇게 새로 만든 것에 대한 결과를 확인하는 시간주기를 줄이는 것입니다.
Clojure - 사실, 대부분의 Lisp - 는 고급 REPL (Read-Eval-Print-Loop) 환경을 통해 Emacs, Vim, IntellJ 그리고 이클립스와 긴밀하게 연동 가능합니다.

그렇지만, 매일매일의 개발은 무슨 의미일까요?

Clojure 의 개발작업 흐름은 Emacs 에서 REPL 세션을 시작하고 - IntellJ 에도 동일하게 적용 - 작업하는 중에 실행되도록 합니다. 
여러날 혹은 몇주를 REPL 세션에서 작업하는 것은 일반적이지 않습니다.
이것은 에디터에서 코드를 수정하고 바로 간단한 키보드 단축키로 REPL 을 실행하여 결과를 확인하도록 하여 완벽히 JVM 의 구동 시간에 대한 단점을 없애줍니다.

이러한 강력함은 Clojure 에서의 개발을 매우 실험적인 것으로 만들어 줍니다. 탐색에 대한 비용을 최소화하고 REPL을 통해 애플리케이션을 완성하게 됩니다. 
이것은 테스트에도 마찬가지로 적용됩니다. 테스트를 수행하는데 동일한 적은 비용으로 작업할 수 있도록 해 줍니다. 결국 모든 것이 함수로 구성되기 때문입니다.


함수형 프로그래밍과 동시성


"불변성(immutability)을 선택하여 어떻게 되는지 직접 확인하십시요" — Rich Hickey, Clojure 창시자

Clojure 는 함수 프로그래밍에 접근하는 방식이 다른 Lisp 들과는 차이가 있습니다.
다른 모든 언어와 마찬가지로, Clojure 는 고차원 함수를 지원합니다. 이것은 함수가 첫번째 구성요소이자 함수의 인자로 사용될 수 있을 뿐만 아니라 다른 함수로부터 리턴될 수도 있음을 말합니다.

그런, Clojure 데이터는 기본적으로 불변성(immutable) 을 가집니다. 만약 맵, 리스트, 벡터를 생성하였다면, 정의에 의해 불변성(immutable)을 가지며 한번 생성되면 변경될 수 없습니다.

이것은 여러 장점을 가집니다:
  • 불변성(immutable) 데이터구조는 기본적으로 쓰레드에 대해 안전하며, 동시성 소프트웨어 개발을 더욱 간단히 만들어 줍니다.
  • 최소의 노력으로 최대의 효과
  • 데이터를 변경할 가능성이 있는 다른 코드 경로를 걱정할 필요가 없습니다. 발생하지 않기 때문입니다.

추가로 Clojure는 다른 동시성 유틸리티인 참조 타입과 소프트웨어 트랜잭션 가능한 메모리 (STM) 그리고 core.async을 가지며 또한 라이브러리로 CSP (think go-like channels) 구현을 포함합니다.

Clojurescript


Clojure 는 강력한 개발환경을 제공하지만, 웹 애플리케이션을 개발한다면, 여전히 언어로서는 제한적인 JavaScript를 사용하고 있을 것입니다. 
Clojurescript는 브라우저를 타겟으로 하는 Clojure 컴파일러로, Clojure의 강력함을 웹 개발의 프론트앤드로 이끌어 줍니다.  (그러나, Node.js 에서도 실행할 수 있습니다)

많은 회사들이 저희 Atlassian 를 포함하여 Clojurescript를 실무에 적용하고 있습니다. 
여기에서 얻을 수 있는 장점은 우리 코드 알고리즘을 서버와 브라우저 사이에 최소의 노력으로 공유할 수 있는 능력입니다. Clojurescript는 JavaScript를 대체할 수 있는 현재 가장 성숙한 대안이라고 할 수 있습니다.

결론


이것은 매우 불완전한 글이며 여기에서 언급한 장점을 말로 모두 표현하는 것은 솔직히 어렵습니다. 
그래서 Bruce Hauman 의 programs the Flappy Bird game interactively with Clojurescript 비디오를 추천합니다. - 이 글에서 설명한 작업흐름에 좋은 사례입니다.

만약 Clojure 에 더욱 관심이 있다면, Sydney Clojure User Group 도 추천합니다. 
시드니에 계시지 않다면, Clojure 웹사이트의 사용자 그룹 목록에서 가까운 곳의 사용자 그룹을 찾을 수 있습니다.

댓글

이 블로그의 인기 게시물

JIRA의 대시보드를 효과적으로 구성해 보십시요

JIRA와 Confluence를 활용한 협업 사례

JIRA 와 Confluence 그리고 LDAP 연동을 간편히 하실 수 있습니다