CS/프로그래밍 패러다임

동기/비동기 관점에서 바라본 Java IO vs Java NIO

조금씩 차근차근 2025. 3. 9. 21:00

동기 및 비동기 방식의 관점에서 Java IO와 Java NIO를 살펴보면, 두 기술은 입출력 처리 방식과 구조적인 접근에서 본질적인 차이를 보인다. Java IO는 전통적인 스트림 기반 방식으로 설계되었으며, 모든 입출력 작업이 완료될 때까지 호출 스레드가 대기하는 블로킹 방식을 채택한다. 반면 Java NIO는 이벤트 기반논블로킹 방식을 통해 다수의 연결을 효율적으로 처리할 수 있도록 설계되었다.

Java IO

  • 구성요소
    • InputStream / OutputStream: 데이터를 읽거나 쓰기 위한 기본 구성 요소로, 내부에 성능 최적화를 위해 버퍼(예: BufferedInputStream, BufferedOutputStream)를 사용할 수 있다.
  • 사용 방식
    • 블로킹 방식: 입출력 요청 시 데이터가 준비될 때까지 호출 스레드가 멈추게 된다. 이로 인해 단일 스레드 환경이나 단순한 입출력 작업에서는 구현이 용이하지만, 다중 연결을 처리하는 경우 스레드 자원의 효율성이 떨어질 수 있다.

Java NIO

  • 구성 요소
    • 버퍼: 실제 데이터를 담는 공간으로, 데이터를 채널을 통해 읽거나 쓸 때 사용한다. 버퍼의 flip() 메소드를 통해 읽기와 쓰기 모드를 전환할 수 있다.
    • 채널: 스트림과 달리 입출력을 위한 양방향 추상화 계층으로, 데이터를 효율적으로 전송할 수 있도록 지원한다.
    • 셀렉터: 여러 채널의 I/O 상태(연결, 읽기, 쓰기 등)를 동시에 감시하며, 이벤트가 발생할 때 해당 채널에 적절한 작업을 할당한다.
  • 사용 방식
    • 이벤트 기반 및 논블로킹 방식: 셀렉터를 이용하여 다수의 채널 상태를 동시에 모니터링하고, 데이터가 준비되면 즉시 처리를 시작한다. 이 과정에서 스레드가 불필요하게 대기하지 않으므로 고성능 네트워크 환경에서 특히 유리하다.
    • 블로킹 모드 지원: 필요에 따라 NIO 역시 블로킹 방식으로 사용할 수 있으나, 주된 강점은 비동기 처리에 있다.

nio를 이용한 소켓 통신 예제

Java IO는 간단한 입출력 작업이나 단일 연결 처리에 적합하다. 그러나 동시에 다수의 클라이언트나 고빈도 입출력 요청이 발생하는 환경에서는 Java NIO의 논블로킹 및 이벤트 기반 모델이 더욱 효율적이다. 이와 같이 두 방식은 각각의 특성과 장점을 고려하여 상황에 맞는 적절한 선택이 요구되며, 개발자는 애플리케이션의 요구사항에 따라 명확하게 판단해야 한다.

'CS > 프로그래밍 패러다임' 카테고리의 다른 글

스프링 + 비동기 프로그래밍  (0) 2025.03.09
"프로그래밍 패러다임" 이란?  (0) 2025.03.09