반응형
*_외부 io 에 관한 async *_에서 처리가 안되면 에러를 회신한다.
https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx
https://grip.news/archives/1304
https://www.youtube.com/watch?v=ReZGUG0f2Zs
목차
- NIO 소개
- 파일과 디렉토리
- 버퍼(Buffer)
- 파일 채널(FileChannel)
- TCP 동기(블로킹) 채널
- TCP 넌블로킹 채널
- UDP 채널
- 비동기 파일 채널
- TCP 비동기 채널
NIO 소개
- NIO(New Input/Output)
- 기존
java.io.API
와 다른 새로운 입출력 API를 말한다. - 자바 4에 처음 추가 되어 자바 7부터 네트워크 지원이 강화된
NIO2.API
가 추가되었다. - 관련 패키지
NIO 패키지 | 포함된 내용 |
---|---|
java.nio |
다양한 버퍼 클래스 |
java.nio.channels |
파일 채널, TCP 채널, UDP 채널 등의 클래스 |
java.nio.channels.spi |
java.nio.channels 패키지를 위한 서비스 제공자 클래스 |
java.nio.charset |
문자셋, 인코더, 디코더 api |
java.nio.charset.spi |
java.nio.channels.spi 패키지를 위한 서비스 제공자 클래스 |
java.nio.file |
파일 및 파일 시스템에 접근하기 위한 클래스 |
java.nio.file.attribute |
파일 및 파일 시스템의 속성에 접근하기 위한 클래스 |
java.nio.file.spi |
java.nio.file 패키지를 위한 서비스 제공자 클래스 |
IO 와 NIO 차이점
구분 | IO | NIO |
---|---|---|
입출력 방식 | 스트링 방식( 단방향 데이터) | 채널 방식(양방향) |
버퍼 방식 | 넌버퍼(non-buffer) | 버퍼(buffer) |
동기/비동기 방식 | 동기 방식 | 동기, 비동기 모두 지원 |
블로킹, 논블로킹 방식 | 블로킹 방식 | 블로킹, 논블로킹 방식 모두 지원 |
스트림 vs 채널
- IO 스트림: 입력스트림과 출력 스트림으로 구분되어 별도 생성됨.( 단방향 )
- NIO 채널: 양방량으로 입력과 출력이 가능해 하나만 생성한다.
논버퍼/버퍼
IO 스트림 - 논버퍼(non buffer)
- IO 에서는 1바이트씩 읽고 출력하기 때문에 느리다.
- 보조 스트림인
BufferInputStream
,BufferOutputStream
을 사용해 버퍼를 제공할 수 있다. - 스트림으로부터 입력된 전체 데이터를 별도로 저장하지 않으면 입력 데이터의 위치를 이동해 자유롭게 이용할 수 없다.
NIO 채널 - 버퍼
- 기본적으로 버퍼를 사용해서 입출력하기 입출력 성능이 좋다.
- 읽은 데이터를 무조건 버퍼(Buffer: 메모리 저장소)에 저장하기 때문에 버퍼 내에서 데이터 위치를 이동해 가면서 필요한 부분만 읽고 쓸 수 있다.
블로킹 vs 논블로킹
IO 스트림 - 블로킹
- 입력 스트림의
read()
메소드를 호출하면, 데이터가 입력되기 전까지 스레드는 블로킹(대기상태)이 된다. - 출력 스트림의
write()
메소드를 호출하면 데이터가 출력되기 전까지 스레드는 블로킹 된다. - 스레드가 블로킹되면 다른일을 할 수 없고,
interrupt
를 해서 블로킹을 빠져나올 수 없다. - 블로킹을 빠져나오는 유일한 방법은 스트림을 닫는 것이다.
- 입력 스트림의
NIO 채널 - 블로킹, 논블로킹
- IO 블로킹과의 차이점은 NIO 블로키은 스레드를 interrupt 함으로써 빠져나올 수 있다.
- NIO는 논블로킹을 지원하는데, 입출력 작업시 스레드가 블로킹되지 않는다.
IO 와 NIO 의 선택
IO 선택
- 연결 클라이언트의 수가 적다.
- 전송되는 데이터가 대용량이면서
- 순차적으로 처리될 필요성이 있는 경우 사용한다.
NIO 선택
- 연결 클라이언트 수가 많다.
- 전송되는 데이터 용량이 적다
- 입출력 작업처리가 빨리 끝난다.
반응형
'스프링, 자바' 카테고리의 다른 글
Lambda, Stream : wip (0) | 2021.01.24 |
---|---|
자바의 직렬화(Java Serialization) (0) | 2021.01.24 |
jsp 와 세션 (0) | 2021.01.19 |
jsp 와 쿠키 (0) | 2021.01.19 |
jsp 소스 코드의 동작 과정 (0) | 2021.01.19 |