[Netty] 네티의 주요특징 - 이벤트 기반 프로그래밍
자바 네트워크 소녀 네티( 정경석 저 / 이희승 감수, 한빛미디어 ) 를 읽고 정리합니다.
📘1부 2장. 네티의 주요특징 - 이벤트 기반 프로그래밍
🔹이벤트 기반 프로그래밍
이벤트 기반 프로그래밍은 사용자 인터페이스가 포함된 프로그램에서 많이 사용된다.
각 이벤트를 먼저 정의해두고 발생한 이벤트에 따라서 코드가 실행되도록 프로그램을 작성하는 것이 이벤트 기반 프로그래밍이다.
앞서 나온 논블로킹 소켓의 Selector를 사용한 IO이벤트 또한 또한 이벤트 기반 프로그램의 한 종류이다.
추상화 수준이란 이벤트를 나눌 때 단위의 나뉨정도를 의미한다.
고수준으로 갈수록 좀 더 세세하게 이벤트를 나눈 것을 의미하며, 저수준일수록 한동작에 대해 많은 이벤트가 발생한다.
사용자 인터페이스가 포함된 애플리케이션은 애플리케이션을 사용하는 사용자 수가 제한되어있으므로 이벤트의 저수준 추상화로 인한 성능 저하는 큰 문제가 되지 않는다. 이벤트의 개수가 많지 않기 때문이다.
하지만 이벤트를 발생시키는 주체가 서버에 연결된 클라이언트들이라면 이 수는 매우 가변적이기 때문에 예측 불가능하다.
이러한 관점에서는 서버에서 사용하는 이벤트 기반 프레임워크의 적절한 추상화 단위가 중요하다.
🔸네트워크 프로그램에서의 이벤트 기반 프로그래밍
이벤트 기반 프로그래밍을 제공하려면, 먼저 이벤트가 발생할 주체를 정의하고 그 주체에서 발생될 이벤트의 종류를 정의해야한다.
네트워크 프로그램에서 이벤트가 발생하는 주체는 소켓이다. 그리고 발생하는 이벤트는 소켓연결, 데이터 송수신으로 나뉜다.
- 서버는 클라이언트 연결을 수락하기 위해 서버 소켓을 생성하고 포트를 서버 소켓에 바인딩한다.
- 클라이언트가 지정된 포트로 연결을 시도하면 서버는 서버 소켓으로부터 클라이언트와 연결된 소켓을 생성한다.
⇒ 이때부터 클라이언트와 서버는 소켓을 사용한 데이터 송수신이 가능해진다.
만약 이벤트가 아닌 동작 기반의 네트워크 프로그램을 작성한다면 다음과 같은 방법을 따른다.
소켓이란 데이터 송수신을 위한 네트워크 추상화 단위인데, 일반적으로 네트워크 프로그램에서 소켓은 IP주소와 포트를 가지고 있으며 양방향 네트워크 통신이 가능한 객체다.
소켓에 데이터를 기록하고 읽으려면, 소켓에 연결된 소켓채널(NIO)또는 스트림(Old Blocking IO)을 사용해야한다.(네티가 제공하는 소켓 채널과 구분하고자 이후에는 스트림으로 기술된다)
클라이언트 애플리케이션이 소켓에 연결된 스트림에 데이터를 기록하면 소켓이 해당 데이터를 인터넷으로 연결된 서버로 전송한다.
|❓만약 소켓이나 연결된 스트림에 문제가 발생하면 어떻게 처리해야할까?
새로운 소켓을 생성하고 데이터를 전송하는 예외처리 코드가 작동되게 해야한다. 각 오류를 처리하기 위한 코드는 데이터 송신과 수신처리에 구현해야한다.
네티는 데이터의 읽기 쓰기를 위한 이벤트 핸들러를 지원하는데 1장에 나온 ChannelInboundHandlerAdapter가 이에해당한다.
네티를 사용한 네트워크 프로그램 구조는 다음과 같다.
데이터를 소켓으로 전송하기 위해서 채널에 직접 기록하는 것이 아니라 데이터 핸들러를 통해서 기록한다.
⇒ 서버 애플리케이션 코드를 클라이언트 애플리케이션에서 재활용하는 장점을 제공한다. 또한 각 이벤트에 따라 로직을 분리할 수 있다.
=> 네티의 이벤트 핸들러는 에러 이벤트도 같이 정의한다. 따라서 특정 이벤트에 대한 로직을 작성할 때 에러 처리에 대한 부담을 덜어준다.