'미나'에 해당되는 글 2건

  1. 2009.05.28 | MINA 기반의 어플리케이션 구조
  2. 2009.05.21 | MINA 2.0 에코서버 만들기

MINA 기반의 어플리케이션 구조

개발 이야기/MINA | 2009. 5. 28. 18:01
Posted by 시반

MINA 기반의 어플리케이션 구조

개요                                                                                                            

MINA 기반의 어플리케이션의 구조에 대하여 많은 분들이 질문해오셨습니다. 기사를 통해 MINA 기반 어플리케이션이 어떤 아키텍처를 가지고 있는지 살펴보도록 하겠습니다.MINA 관련된 프레젠테이션 자료에서 발췌했습니다.

조감도 :

 

좀더 상세하게 알아볼까요?

 

이미지는 Apache MINA 이용하여 Network Application 빨리 개발하기(JavaOne 2008) 라는 이희승님의 발표자료에서 가져왔습니다.

크게 보면, MINA 기반의 어플리케이션은 3개의 레이어로 구분되어 집니다

·         I/O Service - 실제 I/O 수행하는 부분

·         I/O Filter Chain - 필터/변환, 바이트를 원하는 데이터 구조로 변환(역으로도 가능)

·         I/O Handler실제 비즈니스 로직이 들어가게 되는 부분

그럼 이제 어떻게 MINA 기반의 어플리케이션을 개발하는지 살펴 볼까요

1.    Create I/O service기본으로 제공하는 서비스 (*Acceptor)  또는 스스로 만든 I/O  서비스 중에서 선택합니다

2.    Create Filter Chain요청/응답간의 변환을 처리하기 위해 필터를 지정합니다. 필터는 기본으로 제공하는 필터 사용자 필터 중에서 선택합니다

3.    Create I/O Handler각기 다른 메시지들을 핸들링 하기 위한 비즈니스 로직을 작성합니다.
MINA
어플리케이션을 만드는 것은쉽죠~? ##########2*

 

ps. 마찬가지로 미나 레퍼런스를 번역한 글입니다.

원문은 http://mina.apache.org/mina-based-application-architecture.html 에서 확인할 수 있습니다.

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 2.0 에코서버 만들기  (0) 2009.05.21
 

MINA 2.0 에코서버 만들기

개발 이야기/MINA | 2009. 5. 21. 11:17
Posted by 시반

이번에 소개하고자 하는것은 이희승씨가 커미터로 계셨다는 

MINA(A Multi-purpose Infrastructure for Network Applications)입니다.

간단하게 말하면 자바의 네트워크 애플리케이션을 위한 프레임워크입니다.
필터를 사용한 뛰어난 확장성과 프로토콜 코덱과 비즈니스 로직을 분리하여 유지보수와 재사용성을 높인것이 특징인데요.
한글레퍼런스나 튜토리얼을 기대했는데 역시 아파치 재단이랄까?

이희승씨를 믿고 있건만 영어의 압박이 저를 힘들게 하네요...-_- a.

하지만 사용법은 그다지 어렵지 않은 듯 보입니다.간단하게 예제 프로그램을 따라 만들어 보았습니다.

MINA v2.0 Quick Guild를 참고하였으며. 현재 버젼은 M5까지 나와있습니다 기존의 문제점을 개선한 MINA3을 준비중이라고 하네요.
일단 예제를 위해서는 MINA코어뿐만 아니라 SLF4J Log4J도 필요로 하고 있구요.
SLF4J의 경우에는 1.5.6 버젼까지 나와있는 상태인데 사용하는 Log4J버젼에 따라 선택하면 됩니다.

slf4j-api-1.5.6.jar파일과 slf4j-logj12-1.5.6.jar을 사용합니다. log4j가 1.2버젼이라서.....
기타 JDK6.0, Eclipse3.4 환경에서 테스트합니다.

 
MinaTimeServer

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
 
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
public class MinaTimeServer
{
   
private static final int PORT = 9123;
 
   
public static void main(String[] args) throws IOException
   
{
       
IoAcceptor acceptor = new NioSocketAcceptor();

        acceptor
.getFilterChain().addLast( "logger", new LoggingFilter() );
        acceptor
.getFilterChain().addLast("codec", new ProtocolCodecFilter(
                                           
new TextLineCodecFactory(Charset.forName("UTF-8"))));
 
        acceptor
.setHandler(new TimeServerHandler());
 
        acceptor
.getSessionConfig().setReadBufferSize(2048);
        acceptor
.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
 
        acceptor
.bind(new InetSocketAddress(PORT));
   
}
}


Non-Blocking IO로 만듭니다. 클라이언트의 연결 및 실시간 요청을 처리할 리스너를 등록합니다.

IoAcceptor 인터페이스로 구현된 acceptor 객체에 하나이상의 필터들을 등록할 수 있는데 이것을 FilterChain이라 합니다.

이 필터체인이라는 것에 addLast를 통해 필터들을 등록합니다.

위와 같이 로깅을 하거나 인코딩 코덱을 만들어 사용할 수 있습니다.
핸들러를 추가하고 버퍼와 유휴시간을 정의한 후에 PORT를 설정하여 Bind합니다.

TimeServerHandler

import java.util.Date;
 
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
 
public class TimeServerHandler extends IoHandlerAdapter
{

   
@Override
   
public void exceptionCaught(IoSession session, Throwable cause)
       
throws Exception
   
{
        cause
.printStackTrace();
   
}

   
@Override
   
public void messageReceived(IoSession session, Object message)
       
throws Exception
   
{
       
String str = message.toString();
 
       
if(str.trim().equalsIgnoreCase("quit"))
       
{
            session
.close(true);
           
return;
       
}
 
       
Date date = new Date();
        session
.write(date.toString() + "\r");
       
System.out.println("Message written...");
   
}

   
@Override
   
public void sessionIdle(IoSession session, IdleStatus status)
       
throws Exception
   
{
       
System.out.println("IDLE " + session.getIdleCount(status));
   
}
}


이녀석이 실제로 통신에 사용되는 핸들러입니다. 메시지를 받을때 마다 messageReceived이 호출됩니다.
쓰레드를 이용하고 있으며, 콜백형식으로 작동하는 것을 알 수 있습니다.

sessionIdle을 사용하면 Main에서 정의한 유휴시간마다 호출됩니다.

앞서 10초로 설정해 두었으니 10초동안 유휴상태로 있다면 그때마다 이 함수가 호출됩니다.

getIdleCount를 이용해 얼마나 유휴상태에 있는지를 확인하도록 합니다. 서버를 완성했으니 실행해 볼까요.

c:>telnet localhost 9123

 


quit를 입력하면 종료되고 그 이외의 문자를 입력하면 시간이 출력되는 것을 알 수 있습니다.

한글을 입력시 MalformedInputException이 나면서 동작안하는 경우가 있는데

인코딩타입을 UTF-8로 바꾸어주면됩니다.

번역한 튜토리얼은 첨부파일로 첨부합니다. 최대한 매끄러게 번역을 하려고 했는데. 앞서 이야기했지만 영어가 딸려놔서리..

오역이나 이상한 것들은 기냥 구박마시고 조용히 알려주세요..*^^*

 

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 기반의 어플리케이션 구조  (0) 2009.05.28
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)