본문 바로가기

카테고리 없음

진화하는 아파치 미나(Apache MINA) 위키 강좌

  • 이 강좌의 저작권은 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)가 자바 개발자들한테 널리 전파되고 교류되었으면 하는 바램에 미흡한 문서나마 올리게 되었다.