본문으로 건너뛰기

Netty 바이트 버퍼

  • Pure Java에서 Buffer와 그 하위 클래스들을 제공함에도 불구하고 네티에서는 자체적인 바이트 버퍼 API를 사용

네티 바이트 버퍼​

특징​

  1. 별도의 읽기 인덱스와 쓰기 인덱스
  2. flip 메서드 없이 읽기 쓰기 가능
  3. 가변 바이트 버퍼
  4. 프레임워크 레벨의 바이트 버퍼 풀 제공
  5. 복합 버퍼
  6. Java ByteBuffer와 호환됨
  7. 자료형에 따른 클래스를 제공하지 않고 별도의 method로 제공

생성​

  • 생성을 위해 ByteBufAllocator 인터페이스 사용 (구현체는 PooledByteBufAllocator)
  • Pooled의 경우 ByteBufAllocator.DEFAULT.heapBuffer(), ByteBufAllocator.DEFAULT.directBuffer() 호출로 생성
  • Unpooled의 경우 Unpooled.buffer(), Unpooled.directBuffer() 호출로 생성

종류

PooledUnpooled
Direct BufferPooledDirectByteBufUnpooledDirectByteBuf
Heap BufferPooledHeapByteBufUnpooledHeapByteBuf

사용​

읽기 쓰기

  • write{Type}
  • read{Type}

크기 조절

  • capacity : 현재 저장된 바이트 크기보다 작게 조절하면 뒷부분이 잘림

부호 없는 값 읽기

  • getUnsigned{Type}

Endian 바꾸기

  • order : 패러미터가 없으면 현재 Endian 반환. ByteOrder 클래스의 상수값 사용

Java ByteBuffer 바꾸기

  • nioBuffer : 내부 buffer 배열이 공유됨

풀링​

  • 각 ByteBuf는 각자의 reference counting을 가지고 있어 객체의 재활용이 가능하며 GC 횟수 감소
  • 보통 Direct Allocating, Deallocating 비용이 비싸기 때문에 사용됨
  • retain : 자체적인 reference counting 증가
  • release : 자체적인 reference counting 감소. 만약에 count가 0이라면 객체를 할당 해제하거나 pool로 되돌려줌. 이 작업은 객체에 마지막으로 접근한 지점에서 수행
  • ChannelPipeline 내부에서 사용되는 ByteBuf는 몇가지 특징을 더 가지고 있음
    • inbound handler에서 사용되는 ByteBuf는 자동으로 release 하지 않음. 직접 수행해야함
    • outbound handler에서 사용되는 ByteBuf는 write 한 이후에 자동적으로 release 수행함.