JSON Serialization

Solf·2025년 7월 2일

WEB

목록 보기
7/11

정의

JSON : Java-Script Object Notation 자바 스크립트 객체 문법으로 구조화된 데이터 교환 방식

여기서 자바스크립트 객체 문법은 key, value구조로 되어 있다.

직렬화 : 메모리를 디스크에 저장하거나 네트워크 통신을 하기위한 형식으로 변환 예) 객체 → JSON
역직렬화 : 그반대 예) JSON → 객체

한마디로 외부 시스템이 이해할 수 있는 형태로 메모리의 데이터를 변환하는 것

Spring Boot에서의 JSON을 다루는 방법

Spring은 기본적으로 Jackson 라이브러리를 가지고 있으며, 내부의 ObjectMapper 라는 클래스를 활용해서 기본적인 동작을 제공한다.

직렬화의 경우

ObjectMapper은 리플렉션을 통해서 직렬화를 구현하며, 아래의 절차를 따라 필드를 json으로 뽑아낸다.

  1. public 필드
  2. getter 메서드

따라서 getter를 사용할때 주의가 필요하다.

역직렬화의 경우

받아온 json을 아래의 절차에 거처 객체로 만든다.

  1. 기본생성자로 객체를 생성한다.
  2. 필드값을 찾아서 값을 바인딩 해준다.

커스터마이징하고 싶다면?

@JsonComponent
public class MyJsonComponent {

	public static class Serializer extends JsonSerializer<MyObject> {

		@Override
		public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
			jgen.writeStartObject();
			jgen.writeStringField("name", value.getName());
			jgen.writeNumberField("age", value.getAge());
			jgen.writeEndObject();
		}

	}

	public static class Deserializer extends JsonDeserializer<MyObject> {

		@Override
		public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
			ObjectCodec codec = jsonParser.getCodec();
			JsonNode tree = codec.readTree(jsonParser);
			String name = tree.get("name").textValue();
			int age = tree.get("age").intValue();
			return new MyObject(name, age);
		}

	}

}

이런 형태로 직접 필드를 매핑해서 사용할 수 있다.

Spring이 기본 제공하는 직렬화 라이브러리

  • Gson (이건 구글에서 만든건데 JSON 처리만 가능하고 성능이 좋은게 포인트.)
  • Jackson (가장 대중적으로 쓰는 라이브러리)
  • JSON-B

비슷한 개념

Encoding <-> Decoding

Encoding : 문자 -> 바이트 (문자를 특정 규칙에 맞춰 바이트로 변환하는 것)
Decoding : 바이트 -> 문자
차이점은 직렬화는 객체를 변환하는 것이며 인코딩은 문자를 의미한다.

좋은 레퍼런스

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A7%81%EB%A0%AC%ED%99%94Serializable-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0
https://mangkyu.tistory.com/223
https://docs.spring.io/spring-boot/reference/features/json.html

profile
CS/Software Engineer

0개의 댓글