티스토리 뷰

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:
JavaDoc Source Code Description
1.0.x main,test The officially recommended production-ready branch. Please use this branch unless you are an experienced MINA user.
1.1.x main,test Java 5 port of 1.0 without any new feature addition. Please use this branch if you run your applications on Java 5.
2.0.x main,test The 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


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함