[Spring Framework - Core] 7. Data Buffers and Codecs

mrcocoball·2023년 12월 3일

Spring Framework

목록 보기
8/20

해당 포스트는 Spring.io의 공식 문서를 포함한 레퍼런스와 코드를 통해 Spring Framework의 구조 / 기술에 대해 확인해보고자 하는 포스트입니다.

1. 데이터 버퍼 / 코덱

(1) 개요

데이터 버퍼
데이터 버퍼는 일시적으로 데이터를 저장하거나 전송하는데 사용하는 메모리 공간으로, 주로 입출력 작업이나 데이터 전송 작업에서 데이터를 일시적으로 처리하는데 활용됩니다. 버퍼는 데이터를 임시로 보관해두었다가 필요할 때 한번에 처리하거나 전송할 수 있도록 도와줍니다.

코덱
코덱은 인코더와 디코더의 합성어로 데이터를 압축하거나 해제하는데 사용되는 기술 / 장치를 의미합니다. 코덱은 주로 동영상, 음성과 같은 멀티미디어 데이터에서 사용되며 여러 형식의 데이터를 처리하는데에 사용되는 미디어 데이터의 효율적인 전송과 저장을 위한 핵심 기술입니다.

인코더는 데이터를 압축하여 전송할 경우 대역폭을 절약하고 전송 속도를 향상 시킬 수 있습니다. 디코더는 전송된 데이터를 해동하여 원래의 형태로 복원합니다.

(2) Spring Framework에서의 데이터 버퍼 / 코덱 기술

스프링 코어 모듈은 다음과 같이 다양한 바이트 버퍼 API와 함께 작동하는 추상화 세트를 제공합니다.

  • DataBufferFactory : 데이터 버퍼 생성을 추상화
  • DataBuffer : 풀링될 수 있는 바이트 버퍼를 나타냄
  • DataBufferUtils : 데이터 버퍼에 대한 유틸리티 방법을 제공
  • Codec : 데이터 버퍼 스트림을 더 높은 수준의 개체로 디코딩하거나 인코딩

2. DataBufferFactory / DataBuffer

DataBufferFactory
다음 두 가지 방법 중 하나로 데이터 버퍼를 만드는데 사용됩니다.

  • 새로운 데이터 버퍼를 할당하고 선택적으로 용량을 미리 지정 (용량을 미리 알고 있을 때 효율적)
  • 기존 byte[] 또는 java.nio.ByteBuffer 래핑 (새로운 할당을 수행하지 않고 기존 데이터를 활용)

팩토리 유형은 기본 클라이언트나 서버에 따라 다릅니다. (WebFlux 어플리케이션은 DataBufferFactory를 만들지 않고 ClientHttpRequest나 ServerHttpResponse를 통해 액세스 합니다)

DataBuffer
java.nio.ByteBuffer와 유사한 기능을 제공하나 추가적인 기능을 제공합니다. (예시)

  • flip() : 독립적인 위치로 읽고 쓰기 때문에 읽기와 쓰기를 번갈아가며 호출할 필요가 없음
  • java.lang.StringBuilder와 마찬가지로 필요에 따라 용량이 확장됨
  • PooledDataBuffer를 통한 풀링된 버퍼 및 참조를 카운팅
  • 버퍼를 java.nio.ByteBuffer나 InputStream, OutputStream으로 바라봄
  • 주어진 바이트에 대한 인덱스 또는 마지막 인덱스를 결정

PooledDataBuffer
바이트 버퍼는 직접적이거나 비직접적일 수 있는데 직접 버퍼의 경우 java 힙 외부에 상주할 수 있으므로 기본 I/O 작업을 위해 복사할 필요가 없습니다. 이로 인해 직접 버퍼는 소켓을 통해 데이터를 수신하고 전송하는데 유용하나 생성 및 해제 비용이 많이 들어 버퍼 풀링이라는 개념이 생겼습니다.

PooledDataBuffer는 바이프 버퍼 풀링에 필수적인 참조 계산에 도움이 되는 DataBuffer의 확장입니다. 기본적으로 PooledDataBuffer가 할당되면 참조 카운트는 1이 되며, retain()을 통해 카운트를 증가시키거나 release()를 통해 카운트를 감소시킬 수 있습니다.

카운트가 0보다 크면 버퍼가 해제되지 않는 것이 보장되며, 카운트가 0이 되면 풀링된 버퍼가 해제될 수 있으며 이는 실제로 버퍼에 예약된 메모리가 메모리 풀로 반환되는 것을 의미합니다.

3. DataBufferUtils

데이터 버퍼에서 작동하는 다양한 유틸리티 방법을 제공합니다.

  • 기본 바이트 버퍼 API에서 지원하는 경우 복합 버퍼를 통해 복사가 전혀 없는 단일 버퍼에 데이터 버퍼 스트림을 결합
  • InputStream 또는 NIO Channel을 Flux<DataBuffer>로 바꾸거나 그 반대로 Publisher<DataBuffer>를 OutputStream이나 NIO Channel로 변환
  • DataBuffer 버퍼가 PooledDataBuffer의 인스턴스인 경우 이를 retain하거나 release
  • 특정 바이트 수까지 바이트 스트림을 건너뛰거나 가져옴

4. Codec

다음과 같은 전략 인터페이스를 제공합니다.

  • Encoder : Publisher<T>를 데이터 버퍼 스트림으로 인코딩
  • Decoder : Publisher<DataBuffer>를 더 높은 수준의 객체 스트림으로 디코딩

스프링 코어 모듈은 byte[], ByteBuffer, DataBuffer, Resource 및 String 인코더와 디코더를 제공하며 스프링 웹 모듈은 Jackson JSON, Jackson Smile, JAXB2, 프로토콜 버퍼 및 기타 인코더와 디코더를 추가합니다.

Appendix. 출처

https://docs.spring.io/spring-framework/reference/core/databuffer-codec.html

profile
Backend Developer

0개의 댓글