IT

Netty 코덱

코딩하는 너구리 2021. 1. 5. 22:06
반응형

 

 

 

 

코덱(codec)이란?

네트워크에서는 데이터를 단순한 원시 바이트의 연속으로 취급하지만 애플리케이션에서는 이러한 바이트를 의미 있는 정보 구조로 만들어야 한다.

애플리케이션 데이터와 네트워크 포맷 간의 변환을 수행하는 컴포넌트를 각각 인코더디코더라고 하며, 두 기능을 모두 가진 단일 컴포넌트를 코덱이라고 한다.

인코더는 메시지를 전송하기에 적합한 형식으로 변환하며,

디코더는 네트워크 스트림을 다시 프로그램의 메시지 포맷으로 변환한다.

인코더아웃바운드 데이터를 처리하며

디코더는 인바운드 데이터를 처리한다.


 

 

 

디코더

네티의 디코더 클래스는 고유한 두 사용 사례를 지원한다.

 

  • 바이트 스트림을 메시지로 디코딩 : ByteToMessageDecoderReplayingDecoder
  • 메시지를 다른 메시지 유형으로 디코딩 : MessageToMessageDecoder

 

디코더는 인바운드 데이터를 다른 포맷으로 변환하는 일을 하므로 네티의 디코더는 자연스럽게 ChannelInboundHandler를 구현한다.

 

 

 

디코더는 언제 이용할까?

인바운드 데이터를 ChannelPipeline 내의 다음 ChannelInboundHandler를 위해 변환할 때 이용한다.

 

 

 

ByteToMessageDecoder

바이트 스트림을 메시지로 디코딩하는 작업은 매우 일반적이므로 네티는 이 작업을 위한 기본 클래스인 ByteToMessageDecoder를 제공한다.

 

원격 피어가 완성된 메시지를 한번에 보낼지는 알 수 없으므로,

인바운드 데이터가 처리할 만큼 모일 때까지 버퍼에 저장한다.

 

decode(CHannelHandlerContext ctx, ByteBuf in, List out) 메서드는

ByteBuf읽을 바이트가 없을 때까지 반복하고

List가 비어 있지 않은 경우 그 내용을 파이프라인의 다음 핸들러로 전달한다.

 

 

 

인바운드 ByteBuf에서 4바이트씩 읽고, 이를 int로 디코딩한 후 List로 추가한다.

List에 추가할 항목이 더 이상 없는 경우 그 내용을 담아 ChannelInboundHandler로 전달한다.

 

public class ToIntegerDecoder extends ByteToMessageDecoder {
    @Override
    public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        if(in.readableBytes() >= 4) {
            out.add(in.readInt());
        }
    }
}

 

 

 

 

MessageToMessageDecoder

decode(CHannelHandlerContext ctx, I msg, List out)

I는 msg 인수의 형식, Object는 디코딩 후 추가될 List이다.

 

 

public class IntegerToStringDecoder extends MessageToMessageDecoder<Integer> {
    @Override
    public void decode(ChannelHandlerContext ctx, Integer msg, List<Object> out) throws Exception {
    out.add(String.valueOf(msg));
    }
}

 

 

 

 

인코더

인코더는 ChannelOutboundHandler를 구현하고 아웃바운드 데이터를 한 포맷에서 다른 포맷으로 변환하며, 디코더의 반대 기능을 수행한다.

 

  • 메시지를 바이트로 인코딩
  • 메시지를 메시지로 인코딩

 

public class ShortToByteEncoder extendss MessageToByteEncoder<Short> {
    @Override
    public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out) throws Exception {
        out.writeShort(msg);    // Short를 ByteBuf에 기록
    }
}

 

 

 

 

출처 : 네티인 액션

https://book.naver.com/bookdb/book_detail.nhn?bid=10462610

 

네티 인 액션

네티는 복잡한 네트워킹, 멀티스레드, 동시성을 관리하는 자바 기반 네트워킹 프레임워크로서, 반복적인 저수준 코드를 내부로 감춤으로써 비즈니스 논리를 분리하고 쉽게 재사용할 수 있게 해

book.naver.com

 

 

 

반응형