Skip to content

Serialization

  • Published on
    JDK 26(2026년 3월 17일 GA)은 JEP 500 "Prepare to Make Final Mean Final"을 통해, 딥 리플렉션으로 final 필드를 재할당하는 코드에 런타임 경고를 띄우기 시작했습니다. JDK 5 이후로 setAccessible(true) 다음의 Field.set()은 final 필드를 마음대로 바꿀 수 있었고, Gson 같은 역직렬화 라이브러리와 필드 주입 DI가 그 위에 통째로 올라가 있습니다. 지금 기본값은 warn이라 동작은 그대로지만, 장래 릴리스에서 deny가 기본이 되면 IllegalAccessException으로 바뀝니다. 이 글은 JEP 500이 정확히 무엇을 바꿨는지(Field::set에 붙은 새 조건 두 개, 새 플래그 두 개), Gson·Spring Security·Trino·Lucene의 실제 이슈에서 무엇이 걸렸는지, deny와 JFR 이벤트로 범인을 찾는 방법, 그리고 sun.reflect.ReflectionFactory가 Serializable 클래스에만 통하는 반쪽짜리 탈출구인 이유를 정리합니다. 성능 이득은 JEP가 "잠재적으로 더 빠르다"고만 말할 뿐 수치를 내놓지 않았고, JDK 27은 이미 기능 동결 상태에서 관련 JEP가 없다는 점 — 즉 지금 당장 터지는 불은 아니라는 점도 같이 짚습니다.
  • Published on
    2026년 7월 13일 protobuf.dev에 Edition 2026 발표가 올라왔고, 나흘 앞선 7월 9일에 이미 v36.0-rc1이 나와 있었습니다. Edition 2026은 새 문법을 하나도 추가하지 않는 대신 기본값 세 개를 조입니다 — 이름 충돌 금지(STYLE2026), 심볼 가시성 STRICT, 그리고 protoc 사상 처음으로 스키마 크기 한계를 강제하는 enforce_proto_limits(메시지당 필드 1500개, 메시지당 oneof 1000개, oneof당 필드 1200개, enum당 값 1700개)입니다. 이 글은 발표문이 아니라 v36.0-rc1의 실제 소스(descriptor.proto, descriptor.h, code_generator.h)를 읽고 확인한 내용을 정리합니다 — 구현이 발표문보다 더 정교한 지점, 발표문에는 아예 빠져 있는 기능, 파일 단위로는 끌 수 없는 옵트아웃, 그리고 아직 RC라는 사실까지. 와이어 포맷은 바뀌지 않고, 기존 proto2/proto3/Edition 2023·2024 파일은 아무 영향도 받지 않습니다.
  • Published on
    JSON보다 10배 빠르고 5배 작은 바이너리 포맷들. Protocol Buffers의 varint부터 FlatBuffers의 zero-copy, Avro의 schema evolution까지 — 6가지 직렬화 포맷의 내부 구조와 실전 선택을 720줄로 완전 분석한다.