스프링 응답 json 순서를 보장해보자

비구름·2025년 1월 19일

Spring

목록 보기
3/10

문제 상황

응답 통일과 예외 처리를 위한 코드를 작성하면서 예외 처리에 대한 내용을 정리하고 있었습니다.

위와 같이 코드를 작성하였고 저는 isSuccess, code, message, result와 같은 순서로 출력이 되기를 원했습니다.

하지만 다음과 같이 code, message, result, success의 순서로 지정되어 나타나는 것을 확인할 수 있었습니다.

이를 통해 가독성이 낮아지며 이는 다른 실수가 생길 확률을 높여 별로 좋은 모습은 아니라고 생각합니다.

해결책

해결책 1 - getter의 순서 지정

package practice.project.todo_list.global.response;

import lombok.Getter;

//@Getter
public class SuccessResponseDto<T> extends BaseResponseDto {

    private final T result;

    private SuccessResponseDto(T result) {
        super(true, "200", "Success!!");
        this.result = result;
    }

    private SuccessResponseDto() {
        super(true, "200", "Success!!");
        this.result = null;
    }

    public boolean getSuccess() {
        return this.success;
    }

    public String getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }

    public T getResult() {
        return result;
    }
}

다음과 같이 getter를 순서에 맞게 적어주면 놀랍게도 해결이 가능하다.

개인적인 평가

  • 메서드의 순서로 결과의 순서가 뒤바뀌는 것은 실수가 나오기 쉽고 이러한 방법은 크게 좋아보이지 않습니다.
  • Lombok의 getter를 사용하지 못해 직접 모든 것을 구현해야하여 불편합니다.

해결책 2 - Jackson 어노테이션 사용

package practice.project.todo_list.global.response;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Getter;

@Getter
@JsonPropertyOrder({"success", "code", "message", "result"})
public class SuccessResponseDto<T> extends BaseResponseDto {

    private final T result;

    private SuccessResponseDto(T result) {
        super(true, "200", "Success!!");
        this.result = result;
    }

    private SuccessResponseDto() {
        super(true, "200", "Success!!");
        this.result = null;
    }

    public static <T> SuccessResponseDto<T> success(T result) {
        return new SuccessResponseDto<>(result);
    }

    public static <T> SuccessResponseDto<T> success() {
        return new SuccessResponseDto<>();
    }
}

JsonPropertyOrder어노테이션을 사용하여 간단하게 순서를 정해보았습니다. 결과는 아주 잘 나왔습니다.

개인적인 평가

  • 어노테이션 하나로 간단하게 순서를 지정할 수 있어 좋은 것 같습니다.
  • Lombok의 getter 어노테이션을 이용하여 간단하게 개발을 할 수 있습니다.
  • 하지만 순서를 직접 작성하여 넣는다는 것은 아직 아쉬움이 있습니다.

결과

profile
기본부터 정리해나가는 기록용 블로그

0개의 댓글