본문 바로가기

Spring Framework/Spring Framework

[Spring] Note3. @JsonProperty

반응형

@JsonProperty는 Entity를 Json형태로 직렬화하는 경우 속성의 이름을 설정할 수 있도록 도와주는 어노테이션이다. 

이를 통해 백엔드와 프론트엔드간 엔터티 필드명 불일치를 해결할 수 있다. 

예시로 아래와 같은 Board Entity 파일이 백엔드에 정의되어 있다고 가정해 보자. 

public class Board extends BaseTimeEntity {

    ...
    @Column(name = "post_view", nullable = false)
    private Integer postView = 0;

    @Column(name = "pinned", nullable = false)
    private Boolean pinned = false;

    @Column(length = 255)
    private String filename;
    ...
    
}

 

이를 Json으로 직렬화하면 아래와 같이 변환될 것이다. 

{"post_view":0, "pinned": false, "filename": ""}

 

하지만 만약 프론트단에서 Board 엔터티에 대한 인터페이스를 아래와 같이 정의했다면

views 필드에 대한 필드명 불일치 문제가 발생한다. 

작은 프로젝트라면 큰 문제가 되지 않겠지만, 어느정도 규모가 있는 프로젝트에서 views와 관련된 모든 코드를 고치는 것은 사이드 이펙트가 굉장히 커진다. 

export interface Board {
  ...
  views: number;
  pinned: boolean;
  filename?: string | null;
  ...
}

 

따라서 이 필드와 관련 코드를 모두 수정하는 대신 @JsonProperty 어노테이션으로 필드명 위에 "직렬화 시 속성의 이름을 명시"해주면 별도로 코드를 수정하지 않아도 된다. 

public class Board extends BaseTimeEntity {

    ...
    @JsonProperty("views") // <-- 
    @Column(name = "post_view", nullable = false)
    private Integer postView = 0;
    
    @Column(name = "pinned", nullable = false)
    private Boolean pinned = false;

    @Column(length = 255)
    private String filename;
    ...
    
}
{"view":0, "pinned": false, "filename": ""} 
// JsonProperty 어노테이션에 따라서 post_view가 아닌 view로 직렬화
반응형