[자바/스프링] 코덱

HTTP를 통해 전송되는 데이터의 직렬화(serialization) 및 역직렬화(deserialization)를 위한 코덱(codec)은 요청 및 응답 데이터를 특정 형태로 처리한다. HTTP 통신을 통해 바이트 배열, JSON, XML, YAML, 프로토콜 버퍼 등 다양한 형태의 데이터를 주고 받을 수 있기 때문에 요청 및 응답 데이터를 원하는 형태로 처리하는 것이 필요하다. 역직렬화를 디코딩(decoding), 직렬화를 인코딩(encoding)으로 표현하기도 하며 이는 더 범용적인 용어로 사용된다.

Serializable을 통한 자바 직렬화는 입출력 데이터의 타입을 변경할 필요 없어 개발의 편의성을 제공하고 높은 타입 호환성을 제공하며, 엄격한 타입 조건을 통해 데이터(객체) 상태 또는 속성을 안정적으로 그대로 유지하는 장점을 제공한다. 그러나 클래스 정의가 변경될 경우 버전 관리를 위한 serialVersionUID 값을 별도로 관리해야 하고 속성의 타입이 변경될 경우 역직렬화 시 데이터의 누락이 발생 가능한 단점이 있다. 또한 신뢰할 수 없는 데이터의 역직렬화는 시스템 상 보안적으로 위험하다. 자바 직렬화의 가장 큰 제약 사항은 자바 플랫폼 간 통신에 대해서만 적용할 수 있다는 점이다. 특히 서로 독립적인 여러 플리글랏(polyglot) 서비스가 통신하는 마이크로서비스 아키텍처 기반의 시스템에서는 자바 직렬화 기능을 사용하는 것 보다 플랫폼에 관계 없이 사용할 수 있는 바이트 배열, JSON, XML, YAML, 프로토콜 버퍼 등의 공통 규약의 데이터 형식을 통한 통신이 적합할 수 있다. 주어진 상황과 요구사항에 따라 장단점을 고려하여 적절한 서비스 간 통신이 이루어지도록 해야 한다.

스프링은 바이트 배열 데이터를 객체로 역직렬화하고 객체를 바이트 배열 데이터로 직렬화하는 코덱을 제공함으로써 기존 자바가 제공하는 객체 직렬화를 위한 Serializable을 대체한다.


참고

Comments