스프링

노출하고싶지 않은 Json값

winwin-k9 2023. 4. 13. 00:52

프로젝트를 하면서 백엔드 서버 작업을 하고, api를 제공을 해야했다.
json의 공통된 스펙을 가져가면 응답을 지정하기에 편리하고 생산성이 향상된다고 생각했고 이를 시도 하려고 했다.

"message": "응답메시지",
"data": data

message에 응답에 대한 메시지를 넣고 , data에 이에 해당하는 데이터를 넣어서 응답을 하려고 했다.

@AllArgsConstructor
public class BaseResponse<T>{
    private ResponseMessage message;
    private T data;

    public BaseResponse(ResponseMessage message) {
        this.message = message;
    }

    public static <T> BaseResponse success(ResponseMessage message, T data) {
        return new BaseResponse(DATA_SUCCESSFULLY_PROCESSED);
    }
}

post나 put요청시에 전체 데이터에 대한 정보를 보여주기 보다는, 데이터가 잘 넘어갔다는 메시지만 띄워주려고 했지만,
문제점은 data가 들어가지 않았을때에도 data가 null값으로 Body에 찍히기 때문에 보기 좋지 않았다.

이를 코드단에서 상속이나 다른 방법으로 해결하려고 했지만 더 복잡해지고 유지보수하는데 더 시간이 들 것 같아서 다른 방법을 사용하였다.

@AllArgsConstructor
public class BaseResponse<T>{
    private ResponseMessage message;
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private T data;

    public BaseResponse(ResponseMessage message) {
        this.message = message;
    }

    public static <T> BaseResponse success(T data) {
        return new BaseResponse(DATA_SUCCESSFULLY_PROCESSED);
    }
}

@JsonInclude(JsonInclude.Include.NON_EMPTY) 해당 어노테이션을 이용하면 해당 Key값이 null이면 Body에 그 값이 보이지 않는다.
이렇게 간단한 어노테이션으로 Json스펙을 자유자재로 변화시킬 수 있다.

728x90