REST API 정적 필터링 구현

Soo·2024년 3월 28일

REST API 반환시 커스터마이징해서 응답하는 법을 알아보겠습니다.

만약, 필드의 이름을 그대로 내보내는 것이 아니라 다른 이름으로 내보내고 싶다면?

User

  • @JsonProperty: JSON 프로퍼티의 이름을 변경할 수 있습니다.
package study.rest.webservices.restfulwebservices.user;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.Size;

import java.time.LocalDate;

public class User {

    private Integer id;

    @Size(min = 2, message = "이름은 최소 2글자 이상이어야 합니다.")
    @JsonProperty("user_name")
    private String name;

    @Past(message = "생일의 날짜는 과거여야 합니다.")
    @JsonProperty("birth_date")
    private LocalDate birthDate;

    public User(Integer id, String name, LocalDate birthDate) {
        this.id = id;
        this.name = name;
        this.birthDate = birthDate;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", birthDate=" + birthDate +
                '}';
    }
}

응답 프로퍼티가 @JsonProperty로 설정한 내용으로 변경되었습니다.

필터링

모든 필드를 응답하지 않고 특정 필드만 응답

필터링에는 두 가지 유형이 있습니다.

  1. 정적 필터링
  2. 동적 필터링

예를들어 3개의 필드가 있는 빈이 있습니다.

이중에 field2 는 비밀번호 필드입니다. REST API와 관계없이 항상 field2를 차단하거나 필더링해야하는데 이것을 정적 필터링이라고 합니다.

{
	"field1":"value1",
	"field2":"value2",
	"field3":"value3"
}

지금부터 정적필터링에 대해 알아보겠습니다.

SomeBean

  • 3개의 필드를 가집니다.
  • field2가 비밀번호라고 가정하고 @JsonIgnore을 사용해서 응답에서 제외시키겠습니다.
package study.rest.webservices.restfulwebservices.filtering;

import com.fasterxml.jackson.annotation.JsonIgnore;

public class SomeBean {
    private String field1;
    
    @JsonIgnore
    private String field2;
    private String field3;

    public SomeBean(String field1, String field2, String field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }

    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }

    public String getField3() {
        return field3;
    }

    @Override
    public String toString() {
        return "SomeBean{" +
                "field1='" + field1 + '\'' +
                ", field2='" + field2 + '\'' +
                ", field3='" + field3 + '\'' +
                '}';
    }
}

FilteringController

  • package study.rest.webservices.restfulwebservices.filtering
package study.rest.webservices.restfulwebservices.filtering;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FilteringController {

    @GetMapping("/filtering")
    public SomeBean filtering() {
        return new SomeBean("value1", "value2", "value3");
    }

}

보시는 것처럼 field2를 제외하고 응답이 출력되었습니다.

응답이 리스트인 경우에도 가능합니다. 바로 알아보겠습니다.

여전히 field2에 대한 응답은 안보입니다.

그리고 @JsonIgnore 이외에 프로퍼티를 필터링하는 한 가지 옵션이 더 존재합니다.

@JsonIgnoreProperties를 클래스단에 붙여서 사용하는 것입니다.

SomeBean

  • @JsonIgnoreProperties("field1") 추가
package study.rest.webservices.restfulwebservices.filtering;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties("field1")
public class SomeBean {
    private String field1;

    @JsonIgnore
    private String field2;
    private String field3;

    public SomeBean(String field1, String field2, String field3) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }

    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }

    public String getField3() {
        return field3;
    }

    @Override
    public String toString() {
        return "SomeBean{" +
                "field1='" + field1 + '\'' +
                ", field2='" + field2 + '\'' +
                ", field3='" + field3 + '\'' +
                '}';
    }
}

보시는 것처럼 @JsonIgnore를 붙인field2@JsonIgnoreProperties를 붙인 field1이 응답에서 제외되었습니다.

이번에는 field2에 붙어있던 @JsonIgnore를 제거하고 filed1,field2모두 @JsonIgnoreProperties를 사용해보겠습니다.

@JsonIgnoreProperties를 사용해서 field1field2를 제거하고 응답을 해보았습니다.
@JsonIgnore를사용한 것과 차이는 없습니다.

위에서 알아보았듯이 정적필터링을 하는 방법이 두 가지가 있습니다만, 선호하는 방법은 @JsonIgnore를 사용하는 것입니다.

@JsonIgnore의 경우 추후 필드 이름을 변경하더라도 실제로 다른 곳에서 변경할 필요가 없기 때문입니다.

0개의 댓글