서론
- 네티는 고성능, 네트워킹 애플리케이션 제작을 위한 프레임워크라고 함
- 특징
- 네트워킹 전문가가 아니라도 네티로 네트워킹 애플리케이션을 제작할 수 있다고 함
- 자바 표준 API를 이용하는 것보다 네티를 이용하는게 더 쉽다고 함
- 애플리케이션 논리를 네트워크 레이어로부터 분리할 수 있다고 함
자바의 네트워킹
java.net
- 최초의 자바 네트워킹 API(java.net)은 시스템 소켓 라이브러리(?)가 제공하는 블로킹 함수만 지원했다고 함
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
- 위 코드는 한 번에 한 연결만 처리한다고 함..
그래서 heap, stack 메모리 낭비가 되고
스레드가 많아지면 컨텍스트 스위치에 따른 오버헤드가 문제가 된다고 함..
java.nio
네티 소개
개요
- 수십만 동시 사용자를 지원하는 것은 당연한 수준이 되었다
- 저수준 API를 직접 이용하면 복잡성이 심화되고, 인력도 구하기 어렵다고 함.
그래서 복잡성을 단순한 추상화로 감싸는 객체 지향의 기본 개념을 도입했다고 함
- 높은 처리량, 규모 가변성?, 낮은 비용을 고려해야 한다고 함
비동기식 + 이벤트 기반 네트워킹
-
비동기이면서 이벤트 기반인 시스템은 특수하고 유용한 행동 유형을 보여준다고 함
-> 발생하는 이벤트에 대해 순서에 관계없이 응답할 수 있다??
-
논블로킹 네트워크 연결은 작업 완료를 기다릴 필요가 없게 해준다고 함
비동기 메서드는 더 나아가서 즉시 반환하며, 작업이 완료되면 직접 또는 나중에 이를 통지하는 것!
(그래서 논블로킹이랑 비동기랑 좀 다르다는 거지? 비동기는 작업이 완료되었을 때 통지하는 게 추가된 거 같은데)
결론적으로 논블로킹 입출력?을 이용하면 더 많은 이벤트를 빠르고 경제적으로 처리할 수 있다고 함..
네티의 핵심 컴포넌트
1. Channel
- java.nio.channels.Channel
- 입출력 작업을 위한 연결이라고 함
2. callback
- MDN - callback function
- callback function F1은 다른 function F2에 argument로 전달되어 F2 내에서 실행되는 함수를 의미함
(더 넓게는 어떤 실행가능한 코드에 대한 레퍼런스를 전달하는 것도 의미하는듯)
3. Future
- java.util.concurrent.Future
- 작업이 완료되면 애플리케이션에 알리는 한 방법(JS에서 Promise 같은 역할이라 보면 되겠지)
- java의 Future에는 작업 완료를 수동으로 확인하거나, 완료 전까지 블로킹하는 기능만 있어서
자체 구현인 ChannelFuture를 제공한다고 함
ChannelFutureListener라는 게 있다고 함. 작업이 완료되면 리스너의 콜백 메서드가 호출되서 알림을 준다고 함.
Channel channel = ...;
ChannelFuture future = channel.connect(...);
future.addListener(new ChannelFutureListener()){
@Override
public void operationComplete(ChannelFuture future){
if(future.isSuccess()) { ... }
else {
}
}
4. 이벤트와 핸들러
- 발생한 이벤트를 기준으로 적절한 동작을 트리거할 수 있다고 함..
- 동작
- 로깅
- 데이터 변환?
- 흐름 제어?
- 애플리케이션 논리?
- 이벤트 분류
- 인바운드
- 연결 열기/닫기
- 데이터 읽기?
- 사용자 이벤트
- 오류 이벤트
- 아웃바운드
- 연결 열기/닫기
- 소켓으로 데이터 쓰기, 플러시?
생각들
- 네트워킹 애플리케이션이 뭐지? 네트워크 안 타는 애플리케이션도 있나?
- JVM이 스레드 몇개까지 지원 가능함?
-> 이론적으로는 user address space for stack / thread stack size
thread stack size = 1MB, user address space = 4GB라고 하면
4000개 정도 만들 수 있는건가?
- 이벤트 통지 API가 뭔지 모름
- 비동기, 이벤트 기반이면 순서에 관계없이 응답할 수 있다는게 정확히 무슨 말인지 모르겠음
- callback과 Future가 상호 보완적이라는게 어느 부분이?
- 인바운드 / 아웃바운드 이벤트 개념 어색함