@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
내부에는 이렇게 지정되어 있다.
@Target : 이 어노테이션이 적용될 수 있는 대상을 지정한다.
- ANNOTATION_TYPE : 다른 어노테이션에서 사용가능. 즉 다른 어노테이션에서 @JsonProperty를 사용가능한 것.
- FIELD : 클래스의 필드(멤버 변수)에 이 어노테이션을 사용할 수 있다.
- METHOD: 클래스의 메서드에서 사용가능.
- PARAMETER : 메서드의 파라미터에 이 어노테이션을 사용할 수 있다.
@Retention : 어노테이션이 유지되는 기간
- SOURCE : 컴파일 단계에서만 유지. 컴파일 후 제거된다. 코드 분석 도구에서 사용한다.
- CLASS : 컴파일된 클래스 파일에 포함되나 런타임시 사용불가
- RUNTIME : 런타임 시에도 리플렉셔 통해 접근된다.
직렬화
프로그램의 객체나 데이터를 저장매체에 저장하거나 네트워크로 전송할 수 있도록 바이트 형태로 변환하는 과정이다.
왜 바이트 형태로 변환해야 할까?
자바의 입출력은 스트림이라는 데이터 통로를 통해 이동하는데, 이 스트림을 통하려면 바이트 배로 변환해야 되서 그렇다.
이 변환하는 과정을 직렬화라고 하는 것.
역직렬화
바이트 형태로 전달받은 데이터를 원래의 객체나 데이터 구조로 복원하는 과정을 말한다.
Json 직렬화
타플랫폼 간 통신이나 API에서 사용하기 위해서 데이터를 JSON 형식으로 변환하는 것.
형식 | 이진 데이터 (Binary Data) | 텍스트 기반 JSON 포맷 |
목적 | Java 객체를 저장하거나 전송 | 플랫폼 간 데이터 교환 |
플랫폼 호환성 | 이진 데이터 (Binary Data) | 텍스트 기반 JSON 포맷 |
목적 | Java 객체를 저장하거나 전송 | 플랫폼 간 데이터 교환 |
플랫폼 호환성 | Java 플랫폼에 종속적 | 플랫폼 및 언어 독립적 |
가독성 | 사람이 읽을 수 없음 | 사람이 쉽게 읽고 이해 가능 |
유연성 | Java 클래스 구조와 강하게 결합됨 | 언어 독립적이며 다양한 시스템과 호환 가능 |
주요 사용 사례 | 파일 저장, Java 객체 전송 소켓, TCP/IP 통 |
RESTful API, 데이터 교환, 로깅 |
Jackson 라이브러리
역직렬화 지원을 위해서는 setter나 getter 둘중 하나와 기본 생성자가 필수.
기본 생성자가 없이 매개변수가 있는 생성자라면 @JsonProperty가 꼭 있어야 에러 안난다고 한다.
private 필드를 가지는 불변 객체는 직렬화/역직렬화 최소 조건으로 기본 생성자와 getter를 가지고 있어야 한다.
- 역직렬화는 리플렉션으로 기본 생성자를 만들고, getter 혹 setter로 값을 채우는 과정을 거치므로.
- 직렬화는 getter를 통해 객체의 필드값을 읽는 과정을 거쳐서.
- 직렬화, 역직렬화시에는 기본규칙 get+ ..., set + ...으로 메서드를 찾기 때문에 setter,getter의 명칭을 막짓지 말고 기본 규칙 준수해서 만들어야 한다.
@JsonProperty
역직렬화시 : @JsonProperty에 있는 값과 입력으로 들어온 json 문자열을 매핑해서 객체에 매핑
직렬화시 : 필드 명을 @JsonProperty의 명칭으로 대체한다.
왜 쓸까?
요청으로 들어오거나 외부로 요청을 보낼때 필드명이 서로 다를 수 있기 때문에 그렇다.
access
직렬화 및 역직렬화중 속성에 접근하는 방법을 지정하는 속성.
1. AUTO : 읽기 및 쓰기를 자동으로 결정
2. READ_ONLY : 직렬화할때만 속성읽을 수 있고, 역직렬화시에는 쓸 수 없는 설정
3. READ_WRITE : 직렬화 역직렬화 둘다 접근 가능 속성
4. WRITE_ONLY : 역직렬화일때만 설정되고 직렬화 시에는 포함안되는 설정
JsonProperty.Access.READ_WRITE | {"username": "john_doe"} | username = "john_doe" |
JsonProperty.Access.READ_ONLY | {"username": "john_doe"} | username = null |
JsonProperty.Access.WRITE_ONLY | {} | username = "john_doe" |
JsonProperty.Access.AUTO | {"username": "john_doe"} | username = "john_doe" |
코틀린에서
val은 자동으로 getter만 생성해준다.
https://mingyum119.tistory.com/308?utm_source=chatgpt.com
[Spring] 직렬화 (Serialization)와 역직렬화 (Deserialization) 의 정의 및 스프링에서 사용하는 방법
스프링을 사용해서 개발을 진행하는 과정에서 객체를 반환했을 뿐인데 JSON으로 자동으로 변환되는 것을 경험하였다. 이를 자바의 기능인 직렬화라고 주워들었는데, 직렬화가 정확히 어떤 것인
mingyum119.tistory.com
Jackson 라이브러리 (Spring MVC에서 Json데이터와 vo는 서로 어떻게 변환될까?)
목차스프링MVC 혹은 부트 프레임워크로 개발을 하다보면 api를 개발하거나 호출하는 경우가 많다. api를 호출하기 위해 우리는 주로 json 형식의 데이터를 함께 전송하곤 하는데, 과연 json 데이터가
jihyunhillcs.tistory.com
'D' 카테고리의 다른 글
프론트엔드 콜백 지옥과 promise (1) | 2025.01.27 |
---|---|
라이브러리 의존 (0) | 2025.01.26 |
코틀린 JPA PostgreSql json 입력 이슈 (0) | 2025.01.07 |
제로 쓰러스트 추가하기 + 인터셉터에서 RequestBody 조회 (0) | 2025.01.01 |
yml과 환경에 따라 yml파일 분기 되는 이유 (0) | 2024.12.03 |