REST API 반환시 커스터마이징해서 응답하는 법을 알아보겠습니다.
만약, 필드의 이름을 그대로 내보내는 것이 아니라 다른 이름으로 내보내고 싶다면?
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로 설정한 내용으로 변경되었습니다.
모든 필드를 응답하지 않고 특정 필드만 응답
필터링에는 두 가지 유형이 있습니다.
예를들어 3개의 필드가 있는 빈이 있습니다.
이중에 field2 는 비밀번호 필드입니다. REST API와 관계없이 항상 field2를 차단하거나 필더링해야하는데 이것을 정적 필터링이라고 합니다.
{
"field1":"value1",
"field2":"value2",
"field3":"value3"
}
지금부터 정적필터링에 대해 알아보겠습니다.
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 + '\'' +
'}';
}
}
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를 클래스단에 붙여서 사용하는 것입니다.
@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를 사용해서 field1과 field2를 제거하고 응답을 해보았습니다.
@JsonIgnore를사용한 것과 차이는 없습니다.
위에서 알아보았듯이 정적필터링을 하는 방법이 두 가지가 있습니다만, 선호하는 방법은 @JsonIgnore를 사용하는 것입니다.
@JsonIgnore의 경우 추후 필드 이름을 변경하더라도 실제로 다른 곳에서 변경할 필요가 없기 때문입니다.