[java] 비동기 IO와 동기 IO의 차이점
개요
IO (입출력) 작업은 프로그램에서 매우 중요한 부분입니다. 데이터를 읽고 쓰는 동안 프로그램의 실행이 멈추게 되는 경우, 효율성과 성능에 영향을 미칠 수 있습니다. 이러한 이유로 비동기 IO와 동기 IO라는 두 가지 접근 방식이 개발되었습니다.
동기 IO
동기 IO는 데이터를 읽거나 쓰는 동안 프로그램의 실행을 일시 중지합니다. IO 작업이 완료되기 전까지 다른 작업을 수행할 수 없으며, 작업이 완료되면 결과를 반환합니다. 이러한 특징으로 인해 동기 IO는 단순하고 이해하기 쉽습니다.
다음은 동기 IO의 예시입니다.
InputStream input = new FileInputStream("file.txt");
byte[] data = new byte[1024];
int bytesRead = input.read(data);
input.close();
위의 예시에서 input.read(data)
메서드는 데이터를 읽을 때까지 블로킹되며, 읽은 데이터의 길이를 반환합니다.
동기 IO의 가장 큰 단점은 IO 작업이 끝날 때까지 다른 작업을 수행하지 못하고 기다려야 한다는 것입니다. 이는 대규모 시스템에서 많은 사용자를 동시에 처리해야 할 때 성능 문제를 일으킬 수 있습니다.
비동기 IO
비동기 IO는 데이터를 읽거나 쓰는 동안 프로그램의 실행을 멈추지 않고 다른 작업을 수행할 수 있도록 합니다. 비동기 IO 작업은 백그라운드에서 처리되며, 작업이 완료되면 이벤트나 콜백을 통해 결과를 반환합니다. 이러한 특징으로 인해 비동기 IO는 대규모 시스템에서 성능과 확장성을 향상시킬 수 있습니다.
다음은 비동기 IO의 예시입니다.
AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
// 데이터를 성공적으로 읽은 후에 수행할 작업
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// IO 작업 실패 시 수행할 작업
}
});
비동기 IO의 핵심은 작업이 완료되는 시점에 콜백 함수가 호출되며, 이를 통해 결과를 처리하게 됩니다.
요약
- 동기 IO는 작업이 완료될 때까지 다른 작업을 수행할 수 없으며, 결과를 반환합니다.
- 비동기 IO는 작업이 완료되는 동안 다른 작업을 수행할 수 있으며, 결과는 콜백을 통해 처리됩니다.
- 비동기 IO는 대규모 시스템에서 성능과 확장성을 향상시킬 수 있습니다.
참고 자료
-
[Java NIO.2 Oracle Documentation](https://docs.oracle.com/javase/8/docs/api/java/nio/channels/package-summary.html) -
[Understanding Async IO Medium](https://medium.com/google-developer-experts/understanding-async-io-cff6dc8c1e8f)