자바 네트워크 소녀 Netty" 공부하면서 정리한 내용입니다.
버퍼는 데이터를 저장하는 저장소로써 자바에서는 Buffer라는 추상클래스와 그 하위클래스를 제공하여, 저장된 데이터를 다양한 형식으로 읽고 쓰도록 메서드를 제공해준다.
Netty에서는 자체적으로 바이트버퍼를 제공한다.
1. 자바의 바이트 버퍼
바이트 버퍼는 배열 상태를 관리하기 위해 3가지 속성을 가진다.
1. capacity: 버퍼에 저장할 수 있는 데이터로 한번 정하면 변경 불가능.
2. position: 읽기 또는 쓰기 작업 중인 위치(index)
3. limit : 읽고 쓸 수 있는 버퍼 공간의 최대치(capacity보다 크게 설정할 수 없음)
자바의 바이트버퍼는 읽기와 쓰기를 분리하여 생각해야 한다.(읽기 전용 인덱스, 쓰기 전용 인덱스 제공 x)
읽기 작업을 할 경우 쓰기 작업 이후에 flip 메서드로 작업 위치(position)를 변경해서 사용해야 한다.
2. Netty의 바이트 버퍼
Netty의 바이트 버퍼는 자바의 바이트 버퍼에 비해 더 빠른 성능을 제공한다.
a. 네트의 바이트 버퍼 특징
- 별도의 읽기 인덱스와 쓰기 인덱스
- flip 메서드 없이 읽기 쓰기 가능
- 가변 바이트 버퍼
- 바이트 버퍼 풀
- 복합 버퍼
- 자바의 바이트 버퍼와의 상호 변환
b. 종류와 생성 방법
풀링함(생성 방법) | 풀링 안함(생성방법) | |
힙 버퍼 | PooledHeapByteBuf (ByteBufAllocator.DEFAULT.heapBuffer()) |
UnpooledHeapByteBuf (Unpooled.buffer()) |
다이렉트 버퍼 | PooledDirectByteBuf (ByteBufAllocator.DEFAULT.directBuffer()) |
UnpooledDirectByteBuf (Unpooled.directBuffer()) |
힙 버퍼: JVM 힙 영역에 할당되는 것으로 GC에 의해 메모리 해제(작은 데이터 또는 자주 변경될 때 적합
다이렉트 버퍼: 운영체제의 네이티브 메모리에 할당되는 것으로 명시적으로 메모리를 해제(대량 데이터에 적합)
Pooled: 미리 일정량의 바이트 버퍼를 할당하여 풀에 넣어두고 재사용
Unpooled: 필요할 때 마다 버퍼 생성
c. 읽기 쓰기
- 쓰기: write[타입](); ex. writeInt(), writeShort() 등 ...
- 읽기: read[타입](): ex. readInt(), readShort() 등 ..
d. 엔디안 변환
네티의 바이트 버퍼도 자바의 바이트 버퍼와 마찬가지로 기본적으로 빅엔디안을 사용한다. 네티는 설정을 통해 리틀엔디안으로 변환할 수 있다.
buffer.order(ByteOrder.LITTLE_ENDIAN)
* 엔디안은 바이트 데이터를 저장하고 표현하는 방식
빅엔디안: 가장 큰 주소의 바이트에서 낮은 주소의 바이트로 데이터 저장
리틀엔디안: 가장 작은 주소의 바이트 주소에서 큰 주소의 바이트로 데이터 저장
e. 자바 바이트 버퍼와 상호 변환
ByteBuf buffer = Unpooled.Buffer(11); // 11 바이트의 네티 바이트 버퍼 객체 생성
ByteBuffer nioBuffer = buffer.nioBuffer(); // 자바의 바이트 버퍼 객체 생성
nioBuffer()메서드를 통해 자바의 바이트 버퍼 객체를 생성하면 네티의 바이트 버퍼의 내부 배열과 공유하여 사용한다.
'Programming > etc' 카테고리의 다른 글
[Netty] Netty 단위 테스트 작성하기 (0) | 2024.01.17 |
---|---|
[Netty] 이벤트 모델 (0) | 2024.01.15 |
[Netty] 채널 파이프라인과 코덱 (0) | 2024.01.12 |
[Netty] Netty의 Bootstrap(부트스트랩) (0) | 2024.01.12 |
[Netty] 네트워크 프레임워크 Netty란? (1) | 2024.01.11 |