본문 바로가기
프로그래밍/Netty Codec 이해하기

Netty Pipeline 및 Codec 활용(3)

by Flow.X 2022. 1. 10.
728x90

 

손님이 와서 주문을 하는데 주문이 끝날때는 카드를 내밀어야 한다. 주문이 끝나기도 전에 카드를 내밀면 무조건 결제하고, 추가주문을

받는다는 원칙을 세웠다고 하자. 

 

그럼 고객은 항상 주문이 완료되면 카드를 내밀것이다. 그걸 캐치해서 다음 단계로 진행시키고, 이후 다시 주문받고 하면 되겠다.

ChannelHandler 중 Netty 샘플에서 가장많이 쓰는것이 아래 두개이다

 

LineBasedFrameDecoder : 라인단위로 가져와서 처리
LengthFieldBasedFrameDecoder :  앞에다가 내가 보낼 사이즈는 얼마야 라고 먼저 보내고 이야기를 하는것 

그 중 LineBasedFrameDecoder 를 써보자

우선 설명을 보면 받은 ByteBuf를  \n, \r\n으로 나눈다고 한다 

LineBasedFrameDecoder 설명

함수에 커서를 두고 cmd + . (맥기준) 을 누르면 아래와 같이 설명이 나온다.

여기서 설명을 보면 최대길이를 지정하라고 되어 있네.. 

LineBasedFrameDecoder 함수파라미터

CodeSample에 추가한 모습이다.

이제는 이렇게 흘러간다

LoggingHandler ▶ LineBasedFrameDecoder ▶ StringDecoder ▶ CodeSamplerHandler ▶ StringEncoder

b.childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        // 손님 들어왔을때 대응메뉴얼
        logger.info("손님 문열고 들어옵니다..");
        ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
        ch.pipeline().addLast(new LineBasedFrameDecoder(10));
        ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
        ch.pipeline().addLast(new CodecSampleHandler());

        ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
    }
});

실행해보자. 깔끔하게 짤렷다.

추가 안했을때 모습을 다시보자. 뒤에 뭔가가 붙어있다. 

LineBasedFramdeDecoder 삭제 시

앞에서 maxlength를 10으로 했는데 만약 오버하면 어떻게 될까?

아래처럼 오류가 나고, 다음 코드는 아에 수행이 안된다.

기본적으로 손님이 왔을때 진상이면 거부도 할수 있겠구나 싶다.

LineBasedFrameDecoder maxlength 오류

 

728x90