MINA 소개

OpenSource/Common 2012. 9. 20. 01:06


Apache MINA(Multipurpose Infrastruction for Network Applications)는 자바 네트워크 어플리케이션 서버를 개발할 때 필요한  I/O나 세션, 스레딩 등의 low-level 기능을 기본적으로 제공하여 개발자가 비즈니스 로직에 좀더 집중해서 개발을 할 수 있도록 도와주는 framework이다. 정말 코딩 몇 줄로 간단한 서버를 만들 수 있다.
나도 예전에 모바일 게임 리소스다운로드 서버를 개발하면서 처음 접하게 되어 이후로 랭킹서버, Mini웹서버, SMS 서버Simulator 등을 개발할 때 MINA를 사용해 왔다. 이 참에 간단하게나마 MINA 에 대해 정리를 좀 해 보고자 한다.(내용이 다소 허술할 수 있으니 절대적 참고(?)는 삼가해 주시길 ㅡㅡ;;)

MINA에 대해 얘기하기 전에 MINA의 근간이 되는 Java의 NIO(Nonblocking IO)에 대해 잠깐 정리하고 넘어가자.(정말 잠깐..)
MINA가 네트워크 서버로서 좋은 성능을 보이는 이유가 여러가지가 있겠으나 그 중 하나가 바로 이 NIO 사용이다.
NIO는 JDK1.4 부터 지원되는 패키지인데, 기존 소켓 연결방식의 경우, 서버가 스레드 방식으로 소켓처리 할 때, 
binding 후 accept -> read request -> send response 의 부분에서 blocking 될 수 있는 구조적 문제를 가지고 있고, 연결 하나당 하나의 스레드가 생성되기 때문에 다중접속에 대해 처리의 한계(스레드 과부하)가 있었다.
그러나 NIO 방식의 경우, Reactor패턴 기반으로 구현되었기 때문에 하나의 스레드(Selector)에서 다중의 클라이언트 요청(channels)을 이벤트 기반(event-driven)으로 처리할 수 있다. 이렇게 함으로써 기존처럼 연결 개수만큼의 스레드를 생성하지 않아도 되고, 하나의 Selector가 여러 이벤트 를 처리할 수 있기 때문에 서버의 부하가 상당히 줄어 들게 된다.

간단하게 NIO의 구성요소를 표현해 보면 아래와 같다.
NIO의 핵심은 
* Reactor 역할을 하는 Selector.
* 다양한 클라이언트의 요청을 서비스하는 Channel.
* 그리고, Selector가 Channel의 요청들을 이벤트에 따라 처리해 주기 위한 바로 그 이벤트인SelectionKey.
이렇게 3가지이다.
그리고, 데이터 처리를 위해 Buffer 클래스를 사용하는데, primitive 타입을 사용할 수 있도록 여러 Buffer가 제공이 되지만,
유일하게 다른 유형과의 읽기 및 쓰기가 지원되는 ByteBuffer를 이용하여 채널에서의 Read/Write를 수행한다.
아래 소개할 MINA 역시 ByteBuffer를 통해 데이터를 controll 하고 있다.
뭐, 일단 NIO에 대한 개념은 여기서 마무리..(사실 MINA의 핵심이기도 하지만, 이 부분을 몰라도 서버를 개발하는데는 큰 영향은 없다. ㅡㅡ;)
좀더 자세한 것은 맨아래 [참고]사이트에서 샘플코드 등으로 확인해 보면 된다..

그럼, 이제부터 MINA에 대해 한번 살펴 보자.
내가 MINA를 처음 접한건 2006년 여름쯤으로 기억한다. 그 때 버전은 0.8.0 !
그 당시 모바일 3D 게임을 협력업체가 개발했었는데, 맵이나 기타 게임 데이터들의 용량이 커서 스테이지마다 데이터를 다운로드 해야 하는 상황이 발생했다. 이를 위해 게임 리소스들을 내려주는 리소스 다운로드 서버를 급히 개발해야 하는 상황이었다. 그 때, 알게 된 것이 바로 MINA!!
프레임워크에서 이미 I/O, Session, Thread 관리 등을 제공을 해 주니 나로썬 다운로드 관련 로직에만 신경을 써서 개발을 하면 됐었다. 물론, 초반엔 이해 부족으로 인해 MINA의 아버지(?) 이희승씨(놀랍게도 한국분이셨다. 처음엔 한국분인지 몰라서 영어로 띄엄띄엄 질문했었다는..)에게 정말 많은 도움도 받았었다. (헛.. 그 때를 생각하니 감회가 새로와져서리 옆길로 새 버렸다.)
암튼.. MINA는 이 후에 1.0.x 로 꾸준히 버전업 되다가 JDK1.5가 나오면서 1.0.x (1.4용) 와 1.1.x (1.5용을 위한 porting용) 으로 나눠지게 된다.
1.0.x 와 1.1.x 는 JDK버전에 따른 차이 말고는 거의 같다고 보면 된다. 현재 각각 1.0.10 과 1.1.7 이 최신인 듯 하다.

그리고, MINA 가 2.0.x 가 나오는데, 2.0.x는 기존 1.x와 다른 부분들이 있는데, 자세한건 아래 참고사이트를 보면 되고 대략 살펴 보면,
* 패키징 / 명명법 :
- 모든 클래스와 메소드명은 camel notation을 엄격히 따름.
- 모든 NIO transport 클래스는 'Nio'라는 Prefix를 갖는다.
- 기존 Filter 클래스들을 다양한 subpackage로 이동.
* Buffer
- MINA에서 사용했던 ByteBuffer의 이름 변경 -> IoBuffer
 -> 사실 요건 잘 된거 같음. 나도 사용할 때 NIO 패키지에 있는 ByteBuffer하고 헷갈렸다는..
- DirectBuffer pooling 이 삭제됨.
 -> DirectBuffer pooling은 이전에는 MINA의 큰 장점 중에 하나였으나, 근래의 JVM에서는 성능이나 안정성에 문제가 발생하여 direct대신 heap을 기본적으로 사용하도록 함. heap을 사용하게 되면서 pooling은 자연스레 필요 없어짐.
 
* 스레드모델(ThreadModel) 삭제 및 ThreadPoolFilter 제공 등등이 있다.
사실 2.x부터 사용한다고 하면 이런 차이점/변화들은 그닥 와 닿지(?) 않을 수 있다.
 
There are currently three branches in MINA:
JavaDocSource CodeDescription
1.0.xmain,testThe officially recommended production-ready branch. Please use this branch unless you are an experienced MINA user.
1.1.xmain,testJava 5 port of 1.0 without any new feature addition. Please use this branch if you run your applications on Java 5.
2.0.xmain,testThe bleeding-edge branch with a lot of work going on. If you are interested in MINA development or brave enough to try new API and features, this is yours.


MINA의 컨셉은 아래 그림을 보면 대략 이해할 수 있다.
[출처]
MINA in real life (ApacheCon EU 2009) by Emmanuel Lécharny

중간에 MINA core가 있고, 개발자는 Application(Business) layer의 Handler부분을 집중적으로 구현하면 된다.
물론, 구현하고자 하는 서버에 따라 다양한 Filter(암호화, 압축, IP블럭 등)나 Codec 등을 만들어 추가할 수도 있다.

 
MINA 내에서의 데이터 처리 흐름은 아래와 같다.

[출처]
MINA in real life (ApacheCon EU 2009) by Emmanuel Lécharny

사실 MINA 를 이루고 있는 layer(part)별로 좀더 자세하게 study 하는 것만으로도 네트워크 서버 구현을 위한 스킬을 상당히 올릴 수 있다고 생각한다. 하지만~!!! 그렇게 하기엔 내가 너무 게으른 관계로.. core 부분은 MINA에게 맡기고 여기선 MINA를 이용하여 다양한 서버를 개발하는데 필요한 팁정도만 다루는게 좋을 듯 싶다.(역시나 깊지 못한 지식의 한계를 드러내는.. 흑 ㅜㅜ)

그럼, 다음번에는 MINA를 이용한 서버 어플리케이션 개발 내용을 한번 얘기해 볼까 한다.(내가 개발했던 방식 위주로.. ^^v )

[참고] 
Merlin으로 자바 플랫폼에 nonblocking 입출력 가능 :http://www.ibm.com/developerworks/kr/library/j-javaio/index.html



===================================================================================


  • 이 강좌의 저작권은 mckdh.net에게 있고 아래 저작자표시-비영리-변경금지 의 Creative Commons License 약관을 따라야 합니다.

  • 이 강좌는 위키로 제작되어 문서의 추가, 수정, 삭제가 용이하기 때문에 지속적으로 문서가 진화될 예정입니다.

  • 저의 개인적인 분석이기 때문에 내용이 틀릴수도 있는데, 그럼에도 올리는 이유는 아파치 미나(Apache MINA) 관련 자바 개발자들과 교류하기 위해서 입니다.

Contents

1 아파치 미나(Apache MINA) 이해하기
1.1 아파치 미나(Apache MINA) 전체 구성도
1.2 아파치 미나(Apache MINA) 활용 규칙
1.3 아파치 미나(Apache MINA) 참고 예제 설명
1.4 아파치 미나(Apache MINA) 중요 사이트
1.5 아파치 미나(Apache MINA) 관련 문서 링크
2 아파치 미나(Apache MINA) 활용 경량 통신서버 개발 후기
2.1 구현 기술
2.2 아파치 미나(Apache MINA)
2.3 스프링 프레임워크(Spring Framework)
2.4 JMX(JavaManagement Extensions)
2.5 남은 작업
2.6 위키 문서 개정 예정
2.7 아파치 미나(Apache MINA) 활용 경량 통신서버 개발 후기


1 아파치 미나(Apache MINA) 이해하기 #


1.1 아파치 미나(Apache MINA) 전체 구성도 #

사용자 삽입 이미지

  • 위의 별첨 구성도 확인 (클릭하여 크게 보세요.)

  • 아파치 미나(Apache MINA)는 프레임워크이기 때문에 그림의 아파치 미나(Apache MINA) 구조를 이해하는게 절대적으로 중요하다.

  • 임의로 영역을 4가지로 나눴다. (정식 사상이 아니고 임의로 나눈것임)

  • Network Service 영역에서 서버와 클라이언트의 네트워크 흐름이 이루어지는데, 그 과정에 IoHandler가 각 세션별 이벤트를 제어하고 각 통신간의 모든 정보는 IoSession 객체에 담겨서 관리되며,

  • Service Logic Filter 영역에서 서버와 클라이언트 통신간의 이벤트를 Interceptor하여 입맛에 맞는 프로토콜 단위, 유틸리티 단위별 로직을 제작 및 추가할수 있으며

  • Network Service 영역, Service Logic Filter들의 주요 클래스/인터페이스들은 MINA Common API들의 주요 클래스/인터페이스를 상속, 구현하여 처리하고 있고,

  • 이런 모든 아파치 미나(Apache MINA)의 클래스 관리, 프로퍼티 관리, 모니터링 등은 Spring Framework에서 편리하게 관리 될 수 있다.

  • 자세한 구성/흐름은 아래 아파치 미나(Apache MINA) 관련 문서 참고

1.2 아파치 미나(Apache MINA) 활용 규칙 #


  • 아파치 미나(Apache MINA) 구조를 이해했다면 우리가 다뤄야 되는 영역은 크게 1, 2, 3, 4 영역이다. 1, 2, 3, 4 영역만 우리 입맛에 맞게 개발하고 나머지는 아파치 미나가 알아서 처리하게끔 놔두면 된다고 이해하였다. 우리는 핵심 부분만 집중해서 로직 개발만 하면 되기 때문에 아파치 미나가 (훌륭한) 프레임워크라고 생각하였다.

  • 1. SPRING Framework 영역 :
    스프링을 이용하는 목적은 클래스에서 객체를 생성하지 않고 설정파일에서 객체를 생성하여 쓰고자 하는 클래스에 주입함으로서 동적으로 주요 클래스를 객체지향적으로 관리하고 환경 설정을 별도로 편리하게 관리하게 하기 위함이다. 주요 클래스와 서버 IP:Port등의 동적인 설정들을 1.을 이용하여 관리한다.
    그리고 JMX를 이용한 모니터링 기능도 Spring 연동을 통해 개발할 수 있다.

  • 2. 프로토콜 필터 :
    추가/확장되어야 될 '중요한 기반 로직'은 프로토콜 필터에 추가한다.

  • 3. 일반 IO 필터 :
    추가/확장되어야 될 '주변 유틸리티 로직'은 일반 IO 필터에 추가한다.

  • 4. 통신 제어 영역 :
    주요 통신 서버별 로직은 IoHandler를 이용하여 개발한다.

1.3 아파치 미나(Apache MINA) 참고 예제 설명 #


  • 아파치 미나(Apache MINA)는 문서가 부족하기 때문에 예제를 최대한 이용하여 분석해야 한다.

org.apache.mina.example.chat

  • 채팅 서버의 특징은 메시지를 받아서 등록된 클라이언트에게 동시 전파한다는 것이 주요 특징

  • 스프링 사용법이 나와 있다. SpringMain.java 참고

  • JMX를 이용하는 설정이 있고 그냥 일반 실행 설정이 있다.

  • 일반 실행일 경우 severContext.xml로부터 가져다 쓴다.

org.apache.mina.example.chat.client

  • 스윙을 사용했음을 참고할것

  • 단 스윙 때문에 오히려 로직 분석은 불편하다.

  • 서버와 연동하여 다른 클라이언트의 메시지도 화면에 뿌려준다.

org.apache.mina.example.echoserver

  • 가장 기본이 되는 네트워크 프로그래밍의 예제를 아파치 미나로 구현한 것으로, 기본적인 네트워크 프로그래밍을 이해한다면 쉽게 이해할 수 있다.

org.apache.mina.example.httpserver.codec

  • 작은 HTTP서버, 여기의 request, response 프로토콜 코덱 로직을 이해한다면 아파치 미나를 이용하여 쓸모있는 HTTP서버도 만들수 있겠다.

  • 프로토콜 레이어의 프로토콜 코덱을 활용하는 방법을 알 수 있다.

org.apache.mina.example.httpserver.stream

  • 웹에서 접근시 response 처리방법을 알려준다. 단순히 html만 리턴함

org.apache.mina.example.netcat

  • 클라이언트 전용 예제

org.apache.mina.example.proxy

  • 클라이언트 <-> 프록시 <-> 서버 구조의 예제

  • 클라이언트와의 연결을 제어하는 IoHandler 하나, 서버와의 연결을 제어하는 IoHandler 하나가 별도로 존재하는데, 클라이언트, 서버의 각 세션 객체가 서로간에 밀접하게 연결(attach)되어, 위의 클라이언트, 프록시, 서버간의 통신 흐름을 원할하게 처리하게 된다.

  • 내가 아파치 미나(Apache MINA)를 이용하여 개발한 서버가 프록시 서버를 참고로 개발하였다.

org.apache.mina.example.reverser

  • 클라이언트가 메시지를 전송하면 거꾸로 리턴하는 서버

  • 서버에서 로직을 어디서 어떻게 처리해야 되는지 아이디어를 제공하는 서버

org.apache.mina.example.sumup

  • 인자에 숫자를 넣으면 그것을 서버에서 계산해주는 서버이다.

  • 서버 로직을 코덱/필터로 분리해 내는 아이디어를 제공

  • USE_CUSTOM_CODEC 스위치 변수로 유동적으로 코덱을 쓸수 있게 한 아이디어에 주목

org.apache.mina.example.tennis

  • 굳이 네트워크 부하를 일으키지 않고도 테스트 할수 있는 아이디어를 제공해 준다.

1.4 아파치 미나(Apache MINA) 중요 사이트 #


아파치 미나(Apache MINA) 창시자 이희승님 블로그 : http://www.gleamynode.net

아파치 미나(Apache MINA) 메인 홈페이지 : http://mina.apache.org/index.html

1.5 아파치 미나(Apache MINA) 관련 문서 링크 #


아파치 미나(Apache MINA)메인홈페이지 : http://mina.apache.org/index.html


파워포인트 소개 : http://www.gleamynode.net/JCO2007.ppt


2 아파치 미나(Apache MINA) 활용 경량 통신서버 개발 후기 #


2.1 구현 기술 #


네트워크 프레임워크 : 아파치 미나(Apache MINA) (자바 네트워크 오픈소스 프레임워크)

프로그램 관리 차원의 프레임워크 : 스프링 프레임워크(Spring Framework)

네트워크 현황 모니터링 : JMX(Java Management Extension)

2.2 아파치 미나(Apache MINA) #


어셈블러 수준의 고난이도 테크닉을 요구하면서, 해당 플랫폼에 종속적인 네트워크 프로그래밍을, 유지보수와 재사용성 높은 객체지향 수준으로 끌어올려 바람직한 개발 환경 개선 하에 네트워크 프로그래밍 개발을 가능하게 하는 아파치 오픈 소스 중의 하나,

비동기 통신을 지원하는 자바 NIO와 고급 스레드 기법을 써서, 고성능의 안정된 네트워크 통신을 지원한다.

2.3 스프링 프레임워크(Spring Framework) #


대규모(Enterprise) 개발환경에서 요구되는 DB작업, 트랜잭션, 리모팅 객체 연결, 웹 서비스 등의 다양한 개발 요구사항을 지원하기 위해 개발된 프레임워크로 현재 자바 진영의 선택 가능한 기술이 아니라 필수 활용 기술로 채택되고 있으며,

통신서버에는

- 스프링(Spring Framework)의 IoC기능(객체지향 개발을 유도/지원하는 기능)

- 스프링(Spring Framework)의 설정관리 기능

- 스프링(Spring Framework)의 JMX 연동 기능

을 활용하였다.

2.4 JMX(JavaManagement Extensions) #

실행중인 자바 어플리케이션을 외부에서 모니터링하고 관리하는 기능을 제공한다.

자바VM, 서버정보, 기타 별도 제작하여 장착/장탈 가능한 모니터링 정보등의 구현 가능한 모니터링 모듈을 JMX기반으로 구현할 수 있다.

이것이 자바 진영의 모니터링 구현 표준이기 때문에 별도로 개발하거나 별도의 솔루션을 구입하는 대신 얻을 수 있는 효과가 크다.

- 별도의 컨설팅 필요 없이 방대한 자바 진영의 참고 자료 확보

- 공짜로 발전된 자바 표준 기술 획득

2.5 남은 작업 #


삽질을 줄이자, 아파치 미나(Apache MINA) API 독파

JMX 각종 통계 수치 이해 하여 튜닝에 활용

아파치 미나(Apache MINA) 스레드 기법을 통한 튜닝 기법 연구

장착, 장탈 가능한 아파치 미나(Apache MINA)의 필터 적용 연구
(보안 모듈 필터 등)

JMX연구 하여 자체 제작한 JMX 모듈을 붙이자.

스프링의 다양한 유틸리티 활용기법 연구 (나중 서버 개발)

위키 문서등을 통해 습득한 아파치 미나(Apache MINA)와 스프링의 지식 공유

(오픈소스 공유의 혜택을 보고 있으면 똑같이 공유해야 한다.)

2.6 위키 문서 개정 예정 #


  • 스프링 연동하여 IoC 설정, 프로퍼티 설정, JMX 설정 방법

  • 아파치 미나(Apache MINA)로 개발하면서 얻은 팁들

2.7 아파치 미나(Apache MINA) 활용 경량 통신서버 개발 후기 #


  • 아파치 미나(Apache MINA) 문서가 거의 영어로 되어 있는데 내가 영어가 부족하여 저 구성도 하나 완성하는데도 몇주 소요됨

  • 아파치 미나(Apache MINA) 기본적인 흐름 이해하는데 예제들이 절대적으로 도움이 되었다. 에코 서버 예제 -> 체팅 서버 예제 -> HTTP 서버 예제 -> 프록시 서버 예제 등으로 분석하면 도움이 될 것이다.

  • 아파치 미나(Apache MINA) 는 특정 로직 영역만 개발자가 다루고 나머지는 아파치 미나(Apache MINA)가 알아서 처리해주기 때문에 프레임워크 다운 훌륭한 기능을 수행한다고 보았다.

  • 그러나 참고 자료가 부족 하거나 영어로 되어 있는것과(영어는 당연히 알아야 되지만~) 창시자가 한국인임에도 불구하고 관련 커뮤니티가 외국에 비해 부족한 것이 아쉬웠고, 미흡한 문서나마 급하게 올리는 이유도 이것에 있다.

  • 아파치 미나(Apache MINA) 창시자 이희승님은 질문 메일을 보내면 매우 친절하게 답변해 주었다. 단 메일 내용이 최대한 예의를 갖추고 겸손해야 할 것 같다.

  • 질문 메일 작성법에 대하여 http://blog.gleamynode.net/2007/03/i-wont-be-that-kind-anymore.html 참고

  • 아파치 미나(Apache MINA)로 무엇인가 만들면서 내가 네트워크 프로그래밍에 대해 조금은 안다고 생각하기도 했는데, 아파치 미나(Apache MINA)의 복잡한 내부 구성을 보고 네트워크 프로그래밍에 대해 한참 부족하다고 바꿔 생각하게 되었다. 아파치 미나(Apache MINA) 를 '가져다 쓰는 것'과 '직접 만든 것'과의 실력차이는 하늘과 땅차이 였다. 그래서 다시 말하길, 초보 개발자도 아파치 미나(Apache MINA) 가져다 쓰는 방법만 알면 고성능의 서버를 개발할수 있기 때문에 아파치 미나(Apache MINA)가 훌륭하다는 것이다.

  • 특히 개인적으로 NIO를 공부하면서 버퍼까지는 이해되겠는데 채널, 셀렉터 부터는 한번에 이해하기 어려웠다. 이런 어려운 NIO를 아파치 미나(Apache MINA)는 깊게 신경쓸 필요 없이 구현해 주니 훌륭한 프레임워크 라고 생각하며,

    한국인이 창시하여 그 훌륭함을 인정받아 아파치 정식 프로젝트로 올라갔기 때문에 우리나라 자바 개발자 위상을 한단계 높여준 아파치 미나(Apache MINA)가 자바 개발자들한테 널리 전파되고 교류되었으면 하는 바램에 미흡한 문서나마 올리게 되었다.


출처 - http://mckdh.net/130






'OpenSource > Common' 카테고리의 다른 글

OSGi - “Getting started with OSGi”의 번역  (0) 2012.10.08
루씬(Lucene) 개요 및 원리  (2) 2012.09.24
redis - redis 소개  (0) 2012.09.14
FOSS(Free and Open Source Software)  (0) 2012.04.28
부드러운 종신 독재자  (0) 2012.04.08
Posted by linuxism
,