10장. Java 서버
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
이 장에서는 Java 서버 기술에 관한 주제를 살펴봅니다. 이러한 기술의 핵심은 모두 클라이언트와 서버 간에 HTTP를 통해 데이터를 전송하는 방법에 관한 것입니다. 따라서 이 장에서는 다양한 스레드 모델, 비동기 응답, 비동기 요청, JSON 데이터의 효율적인 처리 등 일반적인 서버 기술에 공통적인 주제에 중점을 두고 있습니다.
서버 확장은 대부분 스레드의 효과적인 사용과 관련이 있으며, 이를 위해서는 이벤트 중심의 비차단 I/O가 필요합니다. Apache Tomcat, IBM WebSphere Application Server, Oracle WebLogic Server와 같은 전통적인 Java/Jakarta EE 서버는 꽤 오랫동안 이를 위해 Java NIO API를 사용해 왔습니다. Netty 및 Eclipse Vert.x와 같은 최신 서버 프레임워크는 Java NIO API의 복잡성을 분리하여 더 작은 크기의 서버를 구축하기 위한 사용하기 쉬운 빌딩 블록을 제공하며, 이러한 프레임워크(모두 Netty 프레임워크 사용)를 기반으로 구축된 Spring WebFlux 및 Helidon과 같은 서버는 확장 가능한 Java 서버를 제공합니다.
이러한 최신 프레임워크는 리액티브 프로그래밍을 기반으로 하는 프로그래밍 모델을 제공합니다. 반응형 프로그래밍의 핵심은 이벤트 기반 패러다임을 사용하여 비동기 데이터 스트림을 처리하는 것입니다. 반응형 프로그래밍과 비동기 프로그래밍은 이벤트를 바라보는 다른 방식이지만, 우리의 목적상 반응형 프로그래밍과 비동기 프로그래밍 모두 동일한 성능상의 이점, 즉 프로그램을 많은 연결 또는 데이터 소스로 확장할 수 있는 기능(특히 I/O 확장)을 제공합니다.
Java NIO 개요
논블로킹 I/O의 작동 방식에 익숙하다면 다음 섹션으로 건너뛰셔도 됩니다. 그렇지 않다면 이 장의 기초가 되는 논블로킹의 작동 방식과 중요성에 대한 간략한 개요를 살펴보시기 바랍니다.
초기 버전의 Java에서는 모든 I/O가 차단되었습니다. 소켓에서 데이터를 읽으려고 시도한 스레드는 적어도 일부 데이터를 사용할 수 있거나 읽기 시간이 초과될 때까지 대기(차단)했습니다. 더 중요한 것은 소켓에서 읽기를 시도하지 않고는 소켓에서 데이터를 사용할 수 있는지 여부를 알 수 있는 방법이 없다는 것입니다. 따라서 클라이언트 연결을 통해 데이터를 처리하려는 스레드는 데이터 읽기 요청을 하고, 데이터를 사용할 수 있을 때까지 차단하고, 요청을 처리하고 응답을 다시 보낸 다음 소켓의 읽기 차단으로 돌아가야 합니다. 이는 그림 10-1에 설명된 상황으로 이어집니다.