30년을 버텨온 자바, 지금도 위대한 9가지 이유
컨텐츠 정보
- 조회 262
본문
자바는 기술 환경의 급격한 변화, 그리고 자바의 위상을 위협하는 수많은 도전에도 지금까지 살아남았다. 자바 기술을 이렇게 위대하게 만드는 요소는 무엇이고, 앞으로는 어떻게 될까?
파괴적 혁신에 집착하는 세계에서 자바는 안정성과 혁신을 모두 아우른다. 자바는 함수형 프로그래밍, 동시성, 클라우드 컴퓨팅, AI 분야의 좋은 아이디어를 신뢰할 수 있고 검증된 하나의 우산 아래에 모으는 궁극적인 혼합 플랫폼이다.
자바는 혼란스러운 진화와 세심한 계획을 결합하고, 기업의 현실과 오픈소스의 이상을 결합한다. 게다가 운도 적당히 따라줬다. 자바가 1996년에 가졌던 위상을 지금까지도 유지할 수 있게 해주는 핵심 요소들을 살펴보자.
1. 자바 커뮤니티 프로세스
자바 성공의 중심은 다름아닌 자바를 좋아하는 개발자와 설계자들이다. 자바 커뮤니티는 활발하고 열정적이며 자바 언어의 변화에 적극적으로 관여한다. 그러나 자바의 특별함은 그 거버넌스 구조에 있다.
자바의 거버넌스는 매끄럽게 움직이는 기계와는 거리가 먼, 상호 경쟁하면서 각자가 자바 커뮤니티 프로세스(JCP)에서 자신의 의견을 관철시키려 노력하는 여러 이해관계와 기업이 뒤섞인 소란스러운 집단이다. JCP의 이 분열적 성격은 비판에도 불구하고 오랜 시간에 걸쳐 자바에 막대한 이점을 제공했다. JCP는 제대로 작동하는 민주주의의 자바 버전이다. 즉, 이 기술을 깊이 아끼는 사람들이 모여 기여하고 갈등을 해소하는 장이다. JCP는 전 세계 개발자 커뮤니티가 가진 각자의 희망과 혼란이 자바의 공식 관리 기구와 만나 결실로 이어지는 중요한 포럼이다.
2. 오픈JDK
필자는 자바 언어가 람다와 클로저를 성공적으로 도입했을 때 느꼈던 놀라움을 아직도 기억한다. 객체지향 프로그래밍 언어에 함수형 요소를 추가하는 것은 당시 상당한 논란을 불러일으킨 과감한 결단이었다. 그러나 그 성과조차도 이후 도입된 가상 스레드(프로젝트 룸(Loom)), 그리고 프리미티브와 객체를 통합하려는 지속적인 노력(프로젝트 발할라(Vahalla))에 비하면 소소하다고 할 정도다.
자바를 개발하는 사람들은 자바라는 전체 그림의 절반일 뿐이다. 나머지 절반은 자바를 사용해서 개발을 하는 사람들이고, 이들은 다양한 자바의 사용례를 반영한다. 소셜 코딩과 오픈소스는 자바만의 특징은 아니지만 자바 생태계의 건강을 유지하는 핵심 구성요소다. 자바스크립트와 마찬가지로 자바 역시 웹이 확산되는 과정에서 코딩 커뮤니티와 함께 발전했다. 이 출발점은 자바의 성격에서 큰 부분을 차지한다. 오픈JDK의 존재를 포함한 자바 커뮤니티의 기민한 대응은 개발자들에게 살아 있는 시스템, 즉 변화하는 세계에서 성공을 위해 지속적으로 육성되고 관리되는 시스템 안에서 작업하고 있다는 확신을 준다.
3. 오픈소스 프레임워크와 툴
자바 성공의 또 다른 주요 원천은 풍부한 오픈소스 프레임워크와 이를 중심으로 구축된 툴이다. 어떤 작업을 상상하든 자바에는 그 작업을 위한 고품질 라이브러리가 하나 이상 존재한다. 마음에 드는 프로젝트가 있다면 오픈소스일 가능성이 높고, 프로젝트에 직접 기여할 수도 있다. 이는 개발자 개인의 학습은 물론 커뮤니티 형성 측면에서도 유익하다.
자바 생태계의 풍부한 프로젝트는 자잘한 예제부터 인터넷의 기반이 되는 구성요소에 이르기까지 광범위하다. 하이버네이트(Hibernate), 제티(Jetty)와 같은 고전적인 도구도 여전히 중요하지만 그동안 환경의 범위가 확장되면서 이제는 클라우드 시대를 정의하는 툴도 이 생태계에 포함된다. 테스트 라이프사이클에 도커를 직접 통합하는 방식으로 통합 테스트를 혁신한 테스트컨테이너(Testcontainers), 초단타 거래 플랫폼부터 비디오 게임에 이르기까지 다양한 시스템을 조용히 뒷받침하는 비동기 네트워킹 엔진 네티(Netty)도 있다.
아마 가장 흥미로운 것은 안정적인 엔터프라이즈 시스템과 아직 야생의 개척지인 LLM 사이의 간극을 잇는 랭체인4j(LangChain4j)와 같은 새로운 AI 통합 툴의 등장일 것이다. 모두 기여자를 환영하는 오픈소스 프로젝트로, 깊이 측면에서 타의 추종을 불허하는 역량을 형성한다.
4. 스프링 프레임워크
자바 생태계에 대한 이야기에서 스프링을 빼놓을 수 없다. 스프링은 오랜 시간 동안 부동의 표준 역할을 해왔고, 다른 모든 자바 기반 프레임워크가 선망하는 대상이다. 지금도 여전히 엔터프라이즈 영역에서 지배적인 위치를 차지하고 있다.
스프링을 사용하면 개발자는 맞춤형 코드를 작성하는 것과 동일한 방식으로 써드파티 코드를 통합할 수 있다. 스프링은 종속성 주입과 제어 반전(IoC)을 통해 내부 구성요소의 표준화를 지원하고 써드파티 프로젝트와 업체 구성요소도 동일한 기준을 충족하도록 보장한다. 이 모든 것은 프로그램의 일관성을 높여준다.
물론 스프링에 대한 타당한 비판도 존재하며 상황에 따라 스프링이 적합하지 않을 수도 있다. 이와 비슷한 방식으로 동작하는 또 다른 툴로 구글 주스(Guice)도 있다. 그러나 스프링은 애플리케이션 구성요소를 프로비저닝하고 조합하는 깔끔하고 일관적인 방법을 처음으로 제공한 프레임워크다. 처음 등장할 당시에도 획기적이었고 지금도 여전히 중요한 역할을 한다. 또한 스프링 부트가 추가되면서 스프링을 도입하고 배우기가 더욱 쉬워졌다.
5. 자바 마이크로프레임워크
스프링 다음에는 클라우드 네이티브 자바 마이크로프레임워크인 쿼커스(Quarkus), 마이크로넛(Micronaut), 헬리돈(Helidon)이 있다. 이들 프레임워크는 1초 미만의 시작 시간과 낮은 메모리 사용량에 초점을 맞추면서 자바를 서버리스 시대로 밀어 올렸다. 이 분야의 치열한 경쟁은 전체 생태계의 발전 속도를 더욱 높이는 결과로 이어졌다.
현재 자바 개발자는 단순히 스택을 물려받는 것이 아니라 현대 클라우드 환경과 잘 맞는 강력한 여러 옵션 사이에서 선택한다. 이 소셜 코딩 환경을 통해 자바는 방대한 기존 솔루션 라이브러리를 유지하면서도 다양한 새로운 언어의 좋은 아이디어를 흡수할 수 있다.
6. 가상 스레드의 기적
스레드는 아주 오래전부터 자바뿐만 아니라 대다수 언어에서 핵심적인 동시성 추상화였다. 과거의 스레드는 운영체제 프로세스에 직접 매핑됐지만 자바는 가상 스레드의 등장에 힘입어 그 모델을 뛰어넘어 발전했다.
자바는 과거 메모리 관리를 JVM으로 옮겼던 것과 마찬가지 방식으로 스레딩도 JVM 안으로 옮겼다. 현재 자바의 기본 동시성 메커니즘인 가상 스레드를 사용하면 고도로 최적화된 풀에 의해 조율되는 가벼운 객체 인스턴스를 얻게 된다. 이런 가상 스레드는 실제 워커 스레드에 지능적으로 분배되며 개발자에게는 보이지 않는다.
효율성 향상은 놀라울 정도다. 개발자가 아무런 부가적인 작업을 하지 않아도 가상 스레드는 서버가 처리할 수 있는 동시 요청 수를 수천 개에서 수백만 개로 늘려줄 수 있다. 이처럼 광범위하게 배포된 플랫폼을 업계 전체가 지켜보는 가운데 근본적인 방식으로 패치하는 데 성공한 것은 소프트웨어 역사를 통틀어 진정으로 위대한 성과 중 하나로 꼽힌다.
7. 데이터 지향 프로그래밍
함수형 프로그래밍에 열광하는 개발 환경에서 자바의 객체 지향성에 대한 비판은 일종의 유행이 됐다. 자바의 관리 주체들은 함수형 프로그래밍의 특성을 자바 언어에 도입하는 방식으로 이에 대응하는 한편 자바는 여전히 객체 지향성이 강한, 즉 모든 것이 사실상 객체인 언어라는 입장도 굳건히 지켜왔다.
어느 패러다임에서나 좋은 코드를 작성할 수 있고, 반대로 형편없는 코드를 작성할 수도 있다. 자바 시스템에서는 언어가 강한 타입을 사용하고 모든 것이 클래스 안에 포함된다는 것을 처음부터 알고 시작한다(한 가지 예외는 아래 마지막 항목을 참고). 이런 설계 결정의 절대성은 복잡성을 없애고 시간이 지나도 변하지 않는 깔끔함을 부여한다. 잘 작성된 자바 프로그램에는 상호작용하는 여러 객체가 만들어내는 기계적 우아함이 있다. 자바 기반 시스템에서 구성요소들은 기계의 기어처럼 맞물려 움직인다.
자바는 원래의 뿌리인 객체 지향 프로그래밍을 버리는 대신 데이터 지향 프로그래밍을 또 하나의 계층으로 받아들이는 방식으로 진화했다. 레코드, 패턴 매칭, 스위치 표현식을 도입해 과거의 장황함 문제를 해결했다. 이제 우리는 데이터를 불변성 운반자로 모델링하고 함수형 언어의 간결함으로 처리할 수 있다. 데이터 지향 구성 요소는 한때 개발자들의 골칫거리였던 상투적 요소 없이도 객체 모델의 우아함을 제공한다.
8. JVM
자바 가상머신은 한때 무거운 추상화 계층이라는 평가를 받았지만 지금은 엔지니어링의 마스터피스로 인정받는다. 데브옵스 컨테이너와 서버리스 아키텍처에서 JVM은 명확하게 정의된 배포 대상을 제공한다. 현대의 자바 가상머신은 경이롭다. 기본 성능이 C에 필적하고, 정교한 자동 메모리 관리를 제공한다.
현재 JVM은 역사상 가장 중요한 변화의 과정에 있다. 필자는 과거 프로젝트 발할라에 대한 글에서 발할라를 자바의 대대적인 리팩터링이라고 설명한 적이 있다. 그 예측이 지금 현실이 됐다. 지난 수십 년 동안 자바 객체는 헤더와 포인터의 형태로 메모리 비용을 지불했는데, 발할라는 값 클래스를 도입해 이 비용을 제거하고 개발자가 클래스처럼 코딩하면서도 int처럼 동작하는 데이터 구조를 만들 수 있게 해준다.
값 클래스는 메모리 레이아웃을 평탄화하고 현대 CPU가 싫어하는 캐시 미스(cache miss)를 없앤다. 또한 모든 자바 타입을 하나의 사고 모델로 통합한다(더 이상 “박싱”이 없음). 프로젝트 발할라는 JVM이 단순한 정적 런타임이 아니라 살아 있는 시스템이고, 이 시스템은 비행 도중에 엔진을 교체할 수 있는 역량까지 갖추고 있음을 입증한다.
9. AI 통합과 오케스트레이션
AI 붐이 처음 일어났을 때 모델 작성은 파이썬이 주도했지만 비즈니스 백엔드는 여전히 자바가 담당했다. 이제 자바는 범용 AI 계층으로 빠르게 부상하며 비즈니스와 AI 기술을 결합하고 있다.
랭체인4j, 스프링 AI와 같은 툴은 자바를 기업용 AI 오케스트레이션 엔진으로 변화시키고 있다. 이런 프레임워크는 개발자가 JVM의 검증된 안정성, 보안, 타입 검사를 LLM과 통합할 수 있게 해준다. 파이썬이 실험용으로 훌륭하다면 자바는 은행 시스템, 고객 데이터베이스 또는 보안 클라우드 인프라에 AI 에이전트를 연결해야 할 때 사용되는 플랫폼이다.
결론
소프트웨어 개발을 구성하는 두 가지 강력한 흐름은 엔터프라이즈와 창의성이다. 코딩에는 창의적 즐거움이라는 정신이 있다. 이는 예를 들어 25년 동안 던전 시뮬레이터를 개발하는 이유를 설명할 수 있는 유일한 방법이다. 자바를 건재하게 만드는 연금술은 창의성과 견고한 비즈니스 사용례의 혼합이다. 지금까지 그래왔듯이 앞으로도 당분간 자바는 융합의 강자로 남을 것이다. 자바는 신뢰할 수 있을 만큼 안정적인 동시에 경쟁에서 앞서 나갈 만큼 과감하기도 하다.
dl-itworldkorea@foundryco.com
관련자료
-
링크
-
이전
-
다음






