Tag Archives: JCO

뒤늦은 JCO 컨퍼런스 참여 후기

조금 늦었지만 코엑스에서 열린 제10회 JCO 컨퍼런스의 후기를 적어보겠습니다.

사실 전 행사에 참여하지 않았습니다. 엄청나게 기대를 하였던 컨퍼런스 였지만 왠지 우울한 비화가 있었습니다.

사전 접수가 시작한 당일 접수를 할려고 보니 아이디가 이메일 인증을 해야 한다고 나오더군요.

그러니깐 정확히 제가 이전에 가입을 한 상태였고, 로그인까지 가능하지만 이메일 인증이 안되어 참가 접수가 안되는 상태였습니다.

이메일 재발송을 하였지만 아무리 해도 메일이 오지 않더군요. 몇번의 시도끝에 일단 포기…

다음 날에 다시 시도하였습니다. 여전히 메일이 오지 않더군요. 이때까지만 해도 JCO의 인증서버가 일시적인 문제가 있는 것일것이라 생각했습니다.

다음날에 재도전 하였습니다. 여전히 안되더군요. 그때까지는 사전등록을 통해 듣고 싶은 세션을 선택하는 것이고 그것이 인원 제한이 있다는걸 모르고 있었습니다.

3일이 넘도록 안되니 이상하다는 생각에 제 상황을 화면을 캡춰하며 증거자료를 만들어 두고 게시판에 질문을 올리려고 했는데 마찬가지로 로그인만 되었지 글조차 쓸 수 없는 상태이더군요.

여차저차하다, 지푸라기라도 잡는 심정으로 계정을 하나 더 가입했습니다. 그리고 이메일 인증을 하니 제대로 오더군요.

원래 있던 계정의 이메일 주소가 잘못된것은 아닙니다. 하지만 기존의 계정을 메일이 오지 않더군요.

아무튼 새로운 계정을 정상적으로 인증을 거치고 신청 화면을 보고 그때 깨달았습니다. 대부분이 마감이더군요.

듣고 싶은 강좌는 이미 꽉차있고요. 일단은 선택의 여지가 없어서 선택이 가능한것만 쭉 선택해 놓았지만 JCO 컨퍼런스의 참여 열정이 조금은 꺾인 기분이었습니다.

당일이 되어, 정말 주최측에는 죄송하고 또 죄송한 일입니다만 그냥 가는것을 포기하게 되었습니다.

하지만 아침부터 SUN에서 썬테크블로거에게 선물 준다고;;;; 오라는 문자가 오길래 그냥 듣고 싶은 강좌는 못들어도 분위기라도 접해보고 오자는 생각에 가게 되었습니다.

도착해서 SUN 부스에 가서 연필꽃이(?)를 받고 MS의 팝콘 부스에 기웃거리다가, 돌아왔습니다.

나중에 알았지만 사람이 꽤 없었다고 하는군요. 그럴줄 알았으면 그냥 듣고 싶은 부스에 들어가서 들을껄 하는 생각이 듭니다.

왜 들여다 볼 생각까지 못했는지 모르겠네요.

확실히 이번에 줄을 선다거나 하는 문제점을 개선하시는데에 수많은 노력을 기울이신점 이해하고 노력에 격려를 보내고 싶습니다.

하지만 단지 정보력이 빠른사람에게 선점의 기회가 돌아간다는 단점이 있을것도 같군요.

그리고 참여 신청한 사람들이 참여하지 않을 경우에 그 세션 때문에 JCO전체의 참여를 포기하게 되는 사람들도 생길 수 있고요(사실 제 변명입니다;;;)

확실히 올해의 새로운 방식은 듣는 사람의 편의를 높이는 대신에 전체 참여율이 떨어지게 되는 방식이지 않을까 싶네요.

자기가 듣고 싶은 세션을 못듣게 된다는걸 미리 알고서 안오는 사람들 VS 듣고 싶은게 있어서 왔는데 못듣게 되었을경우에 다른 세션이라도 참여할 사람들

같은 상황이 생길꺼 같습니다. 앞으로도 좋은 행사 많이 마련해 주시고, 다음번에는 빠른 처리 능력으로 제대로 참여해 보도록 하겠습니다.

Apache MINA 2.0 에코서버 만들어 보기

사용자 삽입 이미지

제작년인가 JCO 컨퍼런스에서 이희승님의 발표 이후에 잊을 수 없던 프로젝트가 있었습니다.

바로 MINA(A Multi-purpose Infrastructure for Network Applications)인데요.

간단하게 말하면 자바의 네트워크 애플리케이션을 위한 프레임워크입니다.

필터를 사용한 뛰어난 확장성과 프로토콜 코덱과 비즈니스 로직을 분리하여 유지보수와 재사용성을 높인것이 특징입니다.

더군다나 커미터가 이희승님이라는 것이 중요한 점입니다. 한글로 질문해도 답변해 주시겠죠? -_-a

간단하게 예제 프로그램을 따라 만들어 보았습니다. [이곳]을 참고하였습니다.

현재 MINA2가 M3까지 나왔더군요. 예제를 위해서는 MINA코어뿐만 아니라 SLF4JLog4J가 필요합니다.

SLF4J의 경우에는 slf4j-api.jar파일과 slf4j-logj12.jar가 필요합니다. 13버젼용도 있지만 아직 알파버젼이니 12로 하기로 하였습니다.

그리고 log4j 1.2버젼의 jar로 세팅합니다.

MinaTimeServer
[code]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));
    }
}[/code]
Non-Blocking IO로 만듭니다. FilterChain이라는것에 필터를 추가합니다.

addLast라는 것을 보니 내가 원하는 순서대로 필터를 등록할 수 있는 모양입니다.

위와 같이 로깅을 하거나 인코딩 코덱을 만들어 사용할 수 있습니다.

핸들러를 추가하고 버퍼와 유휴시간을 정의한 후에 PORT를 설정하여 Bind합니다.

TimeServerHandler
[code]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\n”);
        System.out.println(“Message written…”);
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
        throws Exception
    {
        System.out.println(“IDLE ” + session.getIdleCount(status));
    }
}[/code]
이녀석이 실제로 통신에 사용되는 핸들러입니다. 메시지를 받을때 마다 messageReceived이 호출됩니다.

쓰레드 방식의 모델이라 보기 힘든 구조네요, 콜백형식으로 작동하는 것을 알 수 있습니다.

다음에는 객체를 Serial로 주고 받을 수 있는지 해봐야겠습니다.

sessionIdle은 Main에서 정의한 유휴시간마다 호출되는 녀석입니다. 10초로 설정해 두었으니 10초동안 유휴상태로 있다면 그때마다 이 메서드가 호출됩니다.

getIdleCount를 이용해 카운트도 알 수 있군요. 서버를 완성했으니 실행해 볼까요.

사용자 삽입 이미지


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