
해당 포스트는 Spring.io의 공식 문서를 포함한 레퍼런스와 코드를 통해 Spring Framework의 구조 / 기술에 대해 확인해보고자 하는 포스트입니다.
데이터 버퍼
데이터 버퍼는 일시적으로 데이터를 저장하거나 전송하는데 사용하는 메모리 공간으로, 주로 입출력 작업이나 데이터 전송 작업에서 데이터를 일시적으로 처리하는데 활용됩니다. 버퍼는 데이터를 임시로 보관해두었다가 필요할 때 한번에 처리하거나 전송할 수 있도록 도와줍니다.
코덱
코덱은 인코더와 디코더의 합성어로 데이터를 압축하거나 해제하는데 사용되는 기술 / 장치를 의미합니다. 코덱은 주로 동영상, 음성과 같은 멀티미디어 데이터에서 사용되며 여러 형식의 데이터를 처리하는데에 사용되는 미디어 데이터의 효율적인 전송과 저장을 위한 핵심 기술입니다.
인코더는 데이터를 압축하여 전송할 경우 대역폭을 절약하고 전송 속도를 향상 시킬 수 있습니다. 디코더는 전송된 데이터를 해동하여 원래의 형태로 복원합니다.
스프링 코어 모듈은 다음과 같이 다양한 바이트 버퍼 API와 함께 작동하는 추상화 세트를 제공합니다.
DataBufferFactory
다음 두 가지 방법 중 하나로 데이터 버퍼를 만드는데 사용됩니다.
팩토리 유형은 기본 클라이언트나 서버에 따라 다릅니다. (WebFlux 어플리케이션은 DataBufferFactory를 만들지 않고 ClientHttpRequest나 ServerHttpResponse를 통해 액세스 합니다)
DataBuffer
java.nio.ByteBuffer와 유사한 기능을 제공하나 추가적인 기능을 제공합니다. (예시)
PooledDataBuffer
바이트 버퍼는 직접적이거나 비직접적일 수 있는데 직접 버퍼의 경우 java 힙 외부에 상주할 수 있으므로 기본 I/O 작업을 위해 복사할 필요가 없습니다. 이로 인해 직접 버퍼는 소켓을 통해 데이터를 수신하고 전송하는데 유용하나 생성 및 해제 비용이 많이 들어 버퍼 풀링이라는 개념이 생겼습니다.
PooledDataBuffer는 바이프 버퍼 풀링에 필수적인 참조 계산에 도움이 되는 DataBuffer의 확장입니다. 기본적으로 PooledDataBuffer가 할당되면 참조 카운트는 1이 되며, retain()을 통해 카운트를 증가시키거나 release()를 통해 카운트를 감소시킬 수 있습니다.
카운트가 0보다 크면 버퍼가 해제되지 않는 것이 보장되며, 카운트가 0이 되면 풀링된 버퍼가 해제될 수 있으며 이는 실제로 버퍼에 예약된 메모리가 메모리 풀로 반환되는 것을 의미합니다.
데이터 버퍼에서 작동하는 다양한 유틸리티 방법을 제공합니다.
Flux<DataBuffer>로 바꾸거나 그 반대로 Publisher<DataBuffer>를 OutputStream이나 NIO Channel로 변환다음과 같은 전략 인터페이스를 제공합니다.
Publisher<T>를 데이터 버퍼 스트림으로 인코딩Publisher<DataBuffer>를 더 높은 수준의 객체 스트림으로 디코딩스프링 코어 모듈은 byte[], ByteBuffer, DataBuffer, Resource 및 String 인코더와 디코더를 제공하며 스프링 웹 모듈은 Jackson JSON, Jackson Smile, JAXB2, 프로토콜 버퍼 및 기타 인코더와 디코더를 추가합니다.
https://docs.spring.io/spring-framework/reference/core/databuffer-codec.html