JSON : Java-Script Object Notation 자바 스크립트 객체 문법으로 구조화된 데이터 교환 방식
여기서 자바스크립트 객체 문법은 key, value구조로 되어 있다.
직렬화 : 메모리를 디스크에 저장하거나 네트워크 통신을 하기위한 형식으로 변환 예) 객체 → JSON
역직렬화 : 그반대 예) JSON → 객체
한마디로 외부 시스템이 이해할 수 있는 형태로 메모리의 데이터를 변환하는 것
Spring은 기본적으로 Jackson 라이브러리를 가지고 있으며, 내부의 ObjectMapper 라는 클래스를 활용해서 기본적인 동작을 제공한다.
ObjectMapper은 리플렉션을 통해서 직렬화를 구현하며, 아래의 절차를 따라 필드를 json으로 뽑아낸다.
따라서 getter를 사용할때 주의가 필요하다.
받아온 json을 아래의 절차에 거처 객체로 만든다.
@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);
}
}
}
이런 형태로 직접 필드를 매핑해서 사용할 수 있다.
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