"자바는 더 함수형으로 업그레이드돼야 한다"

한국스프링사용자그룹 설립자 이일민 씨

컴퓨팅입력 :2017/09/08 15:48

“자바(Java)는 22년된 언어로서 위기 때마다 생태계 구성원들이 위기를 극복하는 변화를 시도해 계속 성공했다. 지금 새로운 위기를 맞은 자바는 함수형 언어 스타일로 업그레이드된 자바의 기본으로 돌아가야 한다.”

한국스프링사용자그룹(KSUG) 설립자인 개발자 이일민(영어명 토비 리) 씨의 말이다. 그는 최근 열린 오라클 코드 컨퍼런스에서 기자와 만나 자바 생태계의 발전 과정과 새 버전 공개를 앞둔 자바9의 가능성을 설명하며 이같이 밝혔다.

오는 21일 자바 스탠더드에디션(SE) 9 버전이 공개될 예정이다. 자바SE 9은 두차례 출시 연기란 진통 끝에 나오게 된다. 자바9은 여러 최신 개발언어 기술의 공세 속에서 엔터프라이즈 시장의 터줏대감 지위를 유지해야 하는 과제를 안고 있다.

이일민 개발자

최근 수년 간 ‘자바는 죽었다’는 평이 심심치 않게 나온다. 시대에 뒤처진 기술이고, 최신 IT트렌드를 감당하기에 적합하지 않다는 비판이 자바 진영 내외부에서 계속 제기되고 있다. 이에 대해 이일민 씨는 명확한 반대 입장을 보였다.

그는 “자바는 그동안 4번 정도의 위기를 겪었고, 그때마다 자바 생태계 구성원들이 위기를 극복하는 변화를 시도해 계속 성공하며 지금까지 왔다”며 “자바가 위기를 극복해온 방식은 자바와 객체지향의 기본으로 돌아간다는 것”이라고 말했다.

그에 따르면, 자바의 첫번째 위기는 기술을 과도하게 사용하는 오버엔지니어링 시기였다. 이때는 객체지향언어란 특성을 넘어 특정 집단에서 만들어낸 기술을 익혀야 했다. 서블릿, 엔터프라이즈자바빈(EJB) 같은 기술로 코드가 복잡해졌고, WAS 종류가 40여개에 달했다.

이에 EJB 없는 경량 컨테이너와 객체 지향 기본에 충실한 개발 기술이 나오게 됐다. 벤더가 만든 무거운 기술 대신 더 쉬운 방법으로 좋은 코드를 만들자는 자바의 출발점으로 돌아가자는 합의였다. 스프링 프레임워크가 이런 과정에서 탄생했다.

2차 위기는 마이크로소프트의 닷넷과 경쟁이었다. 닷넷이 최신 기법을 앞세워 자바보다 더 가벼운 코드 작성을 가능하게 했던 것이다. 언어 문법상 특별한 변화를 주지 않았던 자바 진영에서 기존 버전과 호환성을 깨고 완전히 새로운 자바를 만들자는 주장도 나왔다. 반면, 금융, 항공, 원자력 등에서도 쓰이는 자바를 구버전과 호환성을 깨뜨리는 것이 과연 옳은가란 반대 입장도 강했다.

이에 자바 생태계는 언어의 발전과 함께 코드 호환성도 지킨다는 결론에 도달한다. 변화 요구를 전부 수용하지 않고 발전에 약간의 희생을 하는 차원에서 새롭게 발전시키며 기존 버전과 호환성을 지켰다. 자바 5.0의 제네릭스. Enum, 애노테이션, 오토박싱 등이 나오게 됐다. 자바는 이때 바이트 코드 수준의 호환성을 포기하지 않았다. 자바2로 개발한 라이브러리를 자바5에서 그대로 쓸 수 있었다. 이일민씨는 “자바는 재컴파일도 아니라 바이트 코드 차원에서 그대로 호환된다는 신뢰를 지킴으로써 미션크리티컬 시장에서 신뢰성을 갖게 됐다”고 설명했다.

3차 위기는 간결한 코드와 관례로 무장한 언어의 습격이었다. 2006~2007년 사이 루비온레일스 열풍이 불던 시기다. 루비온레일스는 이전에 일일이 설정하고 코드에 명시했던 사항을 관례로 만들어 간단하게 쓸 수 있게 해 폭발적 인기를 끌었다. 그는 “자바 개발로 게시판 만들면 반나절 걸리고, 루비면 15분만에 만드는 비교 영상이 나오고, 자바 대신 루비로 엔터프라이즈 개발을 해준다고 선언하는 회사까지 나왔다”며 “이때가 자바의 가장 큰 위기였고 많은 자바 개발자가 루비온레일스로 변신하려 했다”고 말했다.

자바는 이때 루비온레일스에서 제시한 트렌드를 받아들였다. 애노테이션 기반의 메타프로그래밍과 영리한 디폴트로 무장한 관례를 적극 도입했다. 하나의 애노테이션으로 수많은 기능을 작동시키는 자바가 나왔다.

자바 공식 마스코트 캐릭터 듀크(duke)

4차 위기는 2010년 이후 함수형 프로그래밍과 비동기 논블로킹 개발의 도전이었다. 클라우드 컴퓨팅의 유행으로 대규모 시스템을 분산 아키텍처로 구성하는데 함수형 프로그래밍과 비동기 작동 코드가 적합하다는 입장이 지지를 얻었다. 스칼라, 노드JS 등이 인기 언어로 부상했다. 이떄 나온 자바8은 순수한 함수형 언어는 아니었지만, 자바스크립트나 C#의 함수형 언어 특성을 접목하는 것으로 변신했다. 노드JS의 비동기 논블로킹 방식도 도입했다. 이를 통해 간결하게 코드를 작성하고, 여러 CPU를 병렬로 분산해 하나의 연산을 수행하도록 할 수 있게 됐다.

그는 현재의 자바에 대해 ‘관례의 범람’이라고 진단했다. 어떻게 코드를 조금 작성하고, 디폴트와 관례를 많이 부여해서 빠르게 개발할 것인가에 너무 깊이 들어갔다는 것이다. 애노테이션의 한계와 부작용이 지적됐다.

그는 “애노테이션은 컴파일러에 의해 검증 가능한 타입이 아니고, 데이터로 어떤 기능을 담는다는 걸 명시하지 않는 코드라 작성 후 동작 환경에 따라 해석하고 작동되는 방식이 내부에서 결정된다”며 “개발자는 코드에서 답을 알아낼 수 없게 되고, 수많은 관례를 공부하고 참고해야 한다”고 설명했다.

그는 “이는 쉽고 빠르게 테스트 코드를 작성하기 어렵게 하고, 커스터마이징을 어렵게 한다”며 “런타임에서 마법처럼 동작하는 애노테이션과 리플렉션을 제거해 코드에 명확히 모든 기능을 담고, 코드를 간결하게 작성 가능하게 해야 한다”고 강조했다. 불변 객체, 함수 조합을 이용하고, 리액트나 RX자바 같은 리액티브 프로그래밍을 메인 개발에 쓸 수 있도록 하는 게 자바9에 채택됐다.

자바9은 언어 차원에서 변화는 없다. 그러나 이일민씨는 자바9의 큰 변화로 Flow API 추가를 꼽았다.

비 자바 언어 개발시 상호 표준을 규정한 리액티브스트림스가 있다. 자바9의 Flow API는 리액티브스트림스 표준을 아예 자바 안에 포함시킨 것이다. 자바 역사상 가장 빨리 자바에 수용된 외부 오픈소스 라이브러리다.

그는 “자바9의 Flow api는 수많은 기술의 브릿지 역할을 담당하게 된다”며 “호환성 이 떨어지면 여러 기술을 혼재해 쓸 수 없는데, 이기종 기술을 서로 호환가능하게 표준 인터페이스를 제공한다는 의미”라고 설명했다.

그는 “자바 언어에 들어간 표준 API로 리액티브 방식을 간단하게 자바에 결합할 수 있게 된다”며 “개인적으로 자바가 10년정도는 젊어진 것 아닌가 생각되며, 새 기술이 쏟아져 나올 길을 여는 중요한 계기라고 본다”고 강조했다.

자바9 출시와 같은 날 스프링프레임워크5도 함께 공개된다. 자바9에 채택된 여러 변화를 적극 지원한다. 스프링5는 자바8 버전을 최저 요구 버전으로 한다. 함수형 언어의 특성을 본격적으로 사용해야 한다는 것으로 프레임워크와 관례 중심의 개발 방식에서 벗어날 수 있게 한다.

자바9은 주도회사인 오라클의 계획 단계에서 모듈 시스템 기능을 핵심으로 삼았다. 오라클 주도로 개발된 자바 플랫폼 모듈 시스템(JPMS)은 JCP 투표에서 반대에 부딪쳐 자바9에서 제외될 뻔 했다. IBM과 레드햇 등의 반대 측에서 자바의 하위 호환성을 헤친다고 주장해 세차례나 투표가 진행됐다. 자바9의 두차례 출시 연기를 일으킨 원인이었다.

오라클은 기존 버전과 호환성 문제를 개선해야한다는 커뮤니티 요구를 수용했고, 개선된 모듈 기능이 자바9에 포함되게 됐다. 이는 자바 진영이 얼마나 하위 호환성을 중요하게 여기고 있는지 보여주는 또다른 사례다.

관련기사

그는 “자바가 호환성을 버리고, 닷넷이나 스칼라처럼 빨리 변화하면 얼마나 좋겠냐 생각하기도 한다”며 “그래도 생태계의 합의를 거치고 피드백을 받아 단점을 줄이면서 새 버전 내놓는 것과, 갑자기 새 버전에서 기존 걸 폐기한다고 하는 것과 비교할 때 뭐가 더 좋을까는 깊이 생각해 볼 문제다”고 말했다.

그는 “각자의 장단점이 있지만, 오래 개발하면서 느끼는 건 개발자에게 안정감 주는 기술이 더 낫다는 것”이라며 “구 버전에서 제공하는 라이브러리가 아무 작업 없이 내 프로젝트에서 완벽하게 동작할 때 느끼는 짜릿한 희열이 있다”고 강조했다.