본문 바로가기
etc/Netty

Netty의 주요 특징 - 비동기, 이벤트 기반

by 돈코츠라멘 2019. 8. 30.

Netty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로써 유지보수를 고려한 고성능 프로토콜 서버와 클라이언트를 빠르게 개발할 수 있다.

Netty 홈페이지에는 Netty를 위와 같이 정의한다. 나는 각 용어의 개념과 의미를 구분 짓는 것에 약하므로(ㅠㅠ) Netty를 이해하기 위해 몇몇 키워드들에 대해 정리해보았다.


Keyword 1. 비동기

동기 vs 블로킹, 비동기 VS 논블로킹

비동기를 떠올리면 자연스럽게 동기, 블로킹, 논블로킹이라는 단어들도 함께 떠오른다. 대충 동기와 블로킹이 호출한 후 다른 일을 하지 못하고 대기한다는 점에서 비슷하고, 비동기와 논블로킹이 호출한 후 다른 일을 수행할 수 있다는 점에서 비슷한건 알지만 정확한 차이가 뭔지는 정확하게 설명하기 어렵다. 여기저기에서 긁어모은 정의들은 아래와 같다.

동기와 비동기

문맥에 따라서 다양한 의미로 사용되지만, 여기서의 동기와 비동기는 함수 또는 서비스(예를 들어 웹 서비스 또는 MVC 모델의 컨트롤러)의 호출 방식을 뜻한다.

  • 동기식 호출은 특정 서비스를 호출하면 완료될 때 까지 그 응답을 기다리는 방식이다. 함수의 결과를 호출한 쪽에서 처리하므로 쉬운 디버깅과, 직관적인 흐름 추적이 가능하다는 장점이 있다.
  • 비동기식 호출은 서비스를 호출한 후 즉시 응답을 받고, 다른 작업을 하다가 처리가 완료되었는지 확인하여 결과를 받는 방식이다. 즉, 함수의 결과를 호출한 쪽에서 처리하지 않는다. 동기식 호출은 서비스가 종료될 때까지 호출자가 마냥 기다려야 하므로 컴퓨팅 자원을 비효율적으로 사용할 수밖에 없지만, 비동기식 호출은 요청 결과를 기다리는 시간에 다른 작업을 수행할 수 있으므로 효율적으로 자원을 사용할 수 있다.

블로킹과 논블로킹

  • 소켓의 동작 방식은 블로킹(Blocking) 모드와 논블로킹(Non-Blocking) 모드로 나뉜다. 블로킹은 요청한 작업이 성공하거나 에러가 발생하기 전까지는 응답을 돌려주지 않는 것을 말하며 논블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려주는 것을 말한다. 이때 요청의 응답값에 의해서 에러나 성공 여부를 판단한다.

여기까지 읽어봐도 그 차이점이 많이 와닿지 않았다. 그러던 중 어떤 포스팅의 도움을 많이 받았다. 정리하자면 동기와 비동기, 블로킹과 논블로킹은 관심사가 다르다.
동기와 비동기는 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사로 함수의 작업 완료를 호출'한' 함수가 신경쓰면 동기, 함수의 작업 완료를 호출'된' 함수가 신경쓰면 비동기이다. 블로킹과 논블로킹은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사로 바로 리턴하지 않으면 블로킹, 바로 리턴하면 논블로킹이다.


Keyword 2. 이벤트 기반 프로그래밍

이벤트 기반 프로그래밍(Event-based programming, EDP: Event-driven programming)은 프로그래밍 패러다임 중 하나로 프로그램의 흐름이 특정 이벤트에 따라 결정되는 것을 말한다. 이벤트 기반 프로그래밍은 전통적으로 사용자 인터페이스가 포함된 프로그램에 많이 사용된다. 예를 들어 마우스 클릭에 반응하는 코드가 이에 해당된다. 이와 같이 이벤트 기반 프로그래밍은 각 이벤트를 먼저 정의해두고 발생한 이벤트에 따라서 코드가 실행되도록 프로그램을 작성한다.

추상화 수준

이벤트의 추상화 수준이란 이벤트를 나눌 때 작은 단위로 나누었는지 큰 단위로 나누었는지의 정도를 말한다. 이벤트의 추상화가 너무 고수준이면 세부적인 제어가 힘들어지고, 반대로 매우 저수준으로 추상화하면 한 동작에 대해서 너무 많은 이벤트가 발생하여 애플리케이션 성능에 악영향을 미치게 된다. 서버에 연결될 클라이언트의 수는 매우 가변적이며 예측 불가능하므로 이벤트 기반 프레임워크의 적절한 추상화 단위는 매우 중요하다.

이벤트 기반 네트워크 프로그래밍

소켓에 데이터를 기록하고 읽으려면 소켓 채널(NIO) 또는 스트림을 사용한다. 클라이언트 애플리케이션이 소켓에 연결된 스트림에 데이터를 기록하면 소켓이 해당 데이터를 인터넷으로 연결된 서버로 전송한다. 이때 소켓에 문제가 발생하거나 연결된 스트림에 문제가 발생하면 새로운 소켓을 생성하고 데이터를 전송하는 예외 처리 코드가 작동되어야 할 것이다. 언제 어떠한 문제가 발생할 지 모르기 때문에 수신 대기 상황에서의 오류, 연결 시도 중 오류 등 다양한 상황에 대한 예외처리를 만들어야 한다. 이는 코드의 중복을 만들게 된다. 여기서 데이터 송수신을 이벤트 기반으로 바꾸면 이 문제를 해결할 수 있다. 네티는 데이터를 소켓으로 전송하기 위해서 채널에 직접 기록하는 것이 아니라 데이터 핸들러를 통해서 기록한다. 이로 인해 이벤트에 따라서 로직을 분리하는 장점과 코드를 재사용할 수 있다는 장점이 생긴다. 또한 네티의 이벤트 핸들러로 에러 이벤트도 정의할 수 있다.

 


Reference

  1. 자바 네트워크 소녀 Netty - 2.네티의 주요 특징
  2. https://tech.peoplefund.co.kr/2017/08/02/non-blocking-asynchronous-concurrency.html
  3. https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

'etc > Netty' 카테고리의 다른 글

Netty Server에 SSL(https) 연결 적용하기  (4) 2019.10.03

댓글