[JAVA] IO와 NIO의 차이점

FE.1·2024년 4월 11일
3
post-thumbnail

자바 NIO (New Input/Output)


java.nio는 데이터, 파일의 읽고 쓰기가 향상된 기능을 제공함으로써 전통적인 IO의 성능 문제를 개선하기 위한 패키지이다.

자바 IO와 NIO 차이

구분IONIO
입출력 방식스트림 방식채널 방식
버퍼 방식넌버퍼버퍼
비동기 방식지원X지원O
블로킹/넌블로킹블로킹 방식만 지원둘 다 지원

1. 입출력 방식

  • IO는 스트림(Stream)

    • IO의 입출력 방식은 스트림 방식이다. 스트림은 데이터를 읽거나 출력하기 위한 입력 스트림, 출력 스트림을 별도로 생성해야 한다.
    • 단방향으로 전송된다.
  • NIO는 채널(Channel)

    • 스트림과 달리, 하나의 채널로 입력과 출력이 양방향으로 가능하기 때문에 별도로 입력과 출력을 위한 채널을 만들 필요가 없다.

2. 버퍼 방식

  • IO는 넌버퍼(Non-Buffer)

    • 1Byte씩 읽고 출력하기 때문에 대체로 느리다.
    • 복수 개의 바이트를 한꺼번에 담을 수 있도록 버퍼 기능을 제공하는 BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter와 같은 보조 스트림을 별도로 사용하기도 한다.
    • 스트림으로부터 입력된 전체 데이터를 별도로 저장하지 않는다면, 입력 데이터의 위치를 이동해가면서 자유롭게 이용할 수 없다.
  • NIO는 버퍼(Buffer)

    • 기본적으로 버퍼를 사용해서 입출력하면 성능이 좋다.
    • 채널은 읽은 데이터를 무조건 버퍼(메모리 저장소)에 저장하기 때문에 버퍼 내에서 데이터 위치를 이동해 필요한 부분만 읽고 쓸 수 있다.

3. 동기/비동기 방식

  • IO는 동기

    • IO의 API를 호출하게 되면 그 API가 작업을 다 끝내야 다음 코드로 실행이 가능하다.
  • NIO는 동기/비동기 모두 지원

    • 둘다 지원하기 때문에 NIO의 API를 호출하고 나서 다른 작업이 가능하다.

4. 블로킹/넌블로킹 방식

  • IO는 블로킹 방식

    • 입력 스트림의 read()를 호출하면 데이터가 입력되기 전까지 스레드는 블로킹(대기상태)된다.
    • 출력 스트림의 write()를 호출하면 데이터가 출력되기 전까지 스레드는 블로킹된다.
    • 스레드가 블로킹되면 다른 일을 할 수 없고, Interrupt해서 블로킹을 빠져나올 수도 없다.
    • 블로킹을 빠져나오는 유일한 방법은 스트림을 닫는 것이다.
  • NIO는 블로킹/넌블로킹 모두 지원

    • IO 블로킹과의 차이점은 NIO 블로킹은 스레드를 interrupt로 빠져 나올 수 있다.
    • NIO는 넌블로킹은 입출력 작업 준비가 완료된 채널만 선택해서 스레드가 처리하기 때문에 작업 스레드가 블로킹되지 않는다.
    • NIO의 넌블로킹의 핵심 객체는 멀티플렉서(multiplexor)인 셀렉터(Selector)이다. 셀렉터는 복수 개의 채널 중에서 준비완료된 채널을 선택하는 방법을 제공한다.

결론


  • NIOIO보다 성능이 훨씬 좋지만 상황에 따라 IO는 더 좋은 성능을 보일 수도 있다.
  • 대게 일반적으로 아래와 같은 사항들을 고려하며 선택한다.
    • IO를 고려한다면, 연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있을 경우 선택하기
    • NIO를 고려한다면, 연결 클라이언트 수가 많고 전송되는 데이터 용량이 적으면서 입출력 작업 처리가 빨리 끝나는 경우 선택하기

참고

profile
공부하자!

0개의 댓글