Json 관련 어노테이션으로 Json데이터 형식 조정하기

minjjai·2022년 11월 15일
0

개요

이번 멋북스 프로젝트 중 ebook reader앱은 리엑트로 구성된 프론트 코드에 백엔드를 REST api로 개발하여 정보를 전달하는 것이 요구사항이었다.

요구사항정의서의 json형식으로 된 데이터 형식에 맞춰야 프론트의 코드가 동작한다.

백엔드 프로젝트에서 api를 구성하고 postman을 이용해 반환되는 데이터의 형태를 보았다.
예를 들면 회원의 정보같은 경우, 비밀번호를 그대로 보여주기도 하고, 요구사항의 데이터 key이름과 백엔드에서 반환하는 데이터 key의 값이 일치하지 않아 프론트가 동작하지 않았었다.

이러한 문제를 해결하기 위해 json관련 어노테이션을 찾아보고 사용했다.

당시에는 생각이 나지 않았지만....
엔티티에 json관련 어노테이션을 쓰지 않고, 응답(반환)용 dto를 요구사항에 맞게 만들어 반환시키는 방법이 가장 좋은 것 같다.

Json관련 어노테이션

@JsonProperty("...")

엔티티의 컬럼이 예를 들어 아래와 같다고 하자.

private long id;

json형식으로 변환하여 반환하면 아래와 같이 반환될 것이다.

{
	"id": 1
}

하지만 만약 요구사항에서 "userId": 1 이렇게 id가 아닌 userId로 반환해야 한다면? 이럴 때 @JsonProperty를 쓰면 된다.

@JsonProperty("userId")
private long id;

이렇게 어노테이션을 추가해주면 아래와 같은 json데이터가 반환된다.

{
	"userId": 1
}

@JsonIgnore

class Member {
	private long id;
    
    private String username;
    
    private String password;
    
    private int age;
}

이와 같이 member라는 엔티티를 json 형식으로 반환하면 password같은 경우 보안상 좋지 않을 수도 있다. 그리고 만약 age는 반환할 필요가 없는, 프론트에서 필요하지 않은 정보라고 했을 때, 아래와 같이 어노테이션을 붙여주면 json형식으로 데이터를 반환시 password와 age는 포함하지 않게 된다.

class Member {
	private long id;
    
    private String username;
    
    @JsonIgnore
    private String password;
    
    @JsonIgnore
    private int age;
}

@JsonIgnoreProperties({"..", "..", ....})

다음과 같이 적용해주면 json형식으로 데이터 반환시 id와 username만 반환한다.

@JsonIgnoreProperties({"age", "password"})
class Member {
	private long id;
    
    private String username;
    
    private String password;
    
    private int age;
}

@JsonIncludeProperties({"..", ".."..})

@JsonIgnoreProperties와 원리는 같다. ignore와 include의 차이를 생각하면 된다.

@JsonIncludeProperties({"id", "username"})
class Member {
	private long id;
    
    private String username;
    
    private String password;
    
    private int age;
}

이외에도 json관련 어노테이션은 정말 많다.
이 글에서는 내가 프로젝트에서 사용하고 공부했던 것들만 기록해 보았다.

profile
BackEnd Developer

0개의 댓글