ByteBuffer는 단점이 많다. 내부 구조를 이해해야 하고, Immutable하지도 않고, Thread-safe하지도 않다. 이런 자료형을 주고받는 코드를 작성하면 실수를 유발할 수 있다. 그것도 아주 치명적이고 찾기도 어려운..
그런데 도대체 무슨 장점이 있어서 KmsClient는 이런 자료형을 반환하도록 설계했을까?
ByteBuffer를 사용하는 이유는 다음과 같다:
자료형 변환
ByteBuffer를 사용하면 byte 배열을 다른 자료형으로 변환할 수 있다. ByteBuffer에서 제공하는 get()
메서드를 사용해서 원하는 자료형으로 데이터를 읽을 수 있다.
Direct Memory Access
ByteBuffer는 JVM의 메모리 공간이 아닌 직접적인 메모리에 접근할 수 있는 Direct Buffer를 제공한다. 이는 NIO(non-blocking I/O) 기반의 네트워크 프로그래밍에서 빠른 입출력을 위해 많이 사용된다.
Byte Order
ByteBuffer를 사용하면 Big-endian이나 Little-endian 같은 바이트 순서를 지정할 수 있다. 이는 네트워크 프로토콜 같은 특정한 데이터 형식과 호환되는 바이트 순서를 사용해야 할 때 유용하다.
Thread-Safe 사용법
ByteBuffer는 기본적으로 Thread-Safe하지 않지만, slice()
, asReadOnlyBuffer()
, duplicate()
같은 메서드를 사용해서 새로운 ByteBuffer 인스턴스를 생성하면, 다중 스레드 환경에서도 안전하게 사용할 수 있다. 이 경우 원본 버퍼의 상태를 공유하는 대신, 독립적인 버퍼를 사용하게 된다.
position
position은 현재 ByteBuffer에서 읽거나 쓰기가 시작될 위치를 나타낸다. 즉, ByteBuffer에서 읽거나 쓰기를 할 때는 position 값부터 시작된다.
limit
limit는 ByteBuffer에서 읽거나 쓸 수 있는 데이터의 한계치를 나타낸다. limit 값은 ByteBuffer를 생성할 때 지정되며, 데이터를 쓸 때는 limit 값까지만 쓸 수 있다. 또한, 데이터를 읽을 때도 limit 값까지만 읽을 수 있다.
mark
mark는 ByteBuffer에서 position 값을 저장하는 역할을 한다. mark()
메서드를 호출하면 현재의 position 값을 mark 값으로 설정할 수 있고, reset()
메서드를 호출하면 mark 값으로 position 값을 변경할 수 있다.