Netty를 이용하면 간단하고 편리하게 client/server를 만들 수 있다.

아래는 그림은 Channel, Pipleline, Context, Handler 의 관계를 나타내는 그림이다.



 


Netty는 이벤트 Intercepting Filter pattern의 구조를 가진다. 무슨말이냐 하면, 사용자가 접속하거나, 읽어나, 쓰거나, 나가거나 하는 등의 이벤드를 발생시키고,  Handler에서 이벤트를 받아 처리하면된다.


새로운 client가 서버에 접속하면, 채널과 이를 위한 파이프라인이 생성된다. 뭐 채널이 생성되는건 다른 소켓통신에서도 마찬가지니 설명안해도 알 것이다.

client당 채널과 파이프라인이 있다고 생각하면된다. 그리고 채널을 통해 bind, read, write, close 등을 실행했을때 이벤트가 발생하는 것이다.

파이프 라인은 앞서 말한 핸들러들을 가지고 있는 리스트이다. 파이프라인에는 업스트림, 다운 스트림 개념이 있는데 이는 문서 찾아서 보는게 나을 것이고, 간단하게 설명하면, 접속, 읽기 쓰기 등 이벤트가 발생하면 파이프라인을 통해 이벤트가 전달된다. 그리고 등록된 핸들러들이 순서대로 이벤트를 캐치해 처리한다.(업스트림은  read 등 과거의 일이 발생, 다운스트림은 write 같은 앞으로 미래에 할 일) 


파이프 라인은 여러개의 핸들러를 가질 수 있고, 파이프라인과 각각의 핸들러 관계 정보 등을 가지고 있는 Context들이 있다. 아 이때 중요한 사항은  client당 파이프라인이 생성된다고 했는데, 새 파이프라인이 생성되고 거기에 등록된 핸들러를 추가해 준다. 그런데 핸들러 추가는 얕은 복사이다. 한마디로 모든 client가 같은 핸들러 인스턴스를 공유하는 것이다. 그러므로 핸들러 인스턴스 내의 필드를 사용 시 주의 해야 한다. 만약 쉘로우 카피되는 것이 싫다면,  ChannelPipelineFactory를 구현한 클래스를 생성하고  getPipeline()메소드를 오버라이드해서 해결할 수 있다(익명클래스로 인스턴스 추가. 자세한 내용은 문서 참고).


같은 핸들러 인스턴스를 같은 파이프라인에 중복해서 등록할 수 있다(뭐 사용 이유를 잘 모르겠지만..).


이 외에도 다양한 내용들이 있지만, 위의 내용이 netty 프레임워크의 대략적인 흐름이다. 

한마디로 우리는 핸들러에서 이벤트를 처리할 때만 잘해주면 된다는 것이다.(접속자 수에 따른 스레드 생성 같은 복잡한 작업을 할 필요가 없다는 것이다. 충분히 성능 검증이 되었기 때문에 믿고 쓸 수 있다.)


무슨 말인지 모르겠다면, 일단 netty  다큐먼트(a4 20페이지 정도니 금방 읽는다.)를 쭉 읽어보고, 다시 보면 이해가 될 것이다.


'Java' 카테고리의 다른 글

Java, Number Regular-Expression  (0) 2014.09.27
Netty(java nio 통신 프레임워크) 대략적인 흐름  (0) 2014.04.15