티스토리 뷰

출처 : eglowc.tistory.com/28

@JsonProperty 를 이용한 접근 제어 - 응답값에 포함하지 않기

`spring framework`에서 `dto`나 `domain`객체를 이용한 `JSON`의 직렬화/역직렬화(serialize/deserialize)를 할때, 응답 객체에 특정 필드를 추가하고 싶지 않은 경우가 있습니다. 그런 경우에 사용하는 애노테이

eglowc.tistory.com

ISSUE 1

작업하던 프로젝트에서 JPA를 사용하면서 dto를 걷어내고 오직 domain객체만을 이용해서 데이터를 처리하려고 했습니다. 그러던 중 User 도메인에있는 password 필드가 응답값에 포함되는 문제가 발생하였고, 이 문제를 해결하기 위해 @JsonIgnore 애노테이션을 사용하였습니다.

@JsonIgnore // 무시 @NotBlank @Size(min = 9, max = 50) private String password;

위 처럼 @JsonIgnore 애노테이션을 사용함으로써 더이상 응답결과에 password필드는 포함되지 않도록 되었습니다만 또 다른 문제에 봉착하게 됩니다.

ISSUE 2

요청 데이터 본문의 유효성을 검증하기 위해 @Valid를 이용한 검증 프로세스를 적용하였는데, @JsonIgnore라는 녀석이 Desirialize까지 무시하게 되고 요청 본문에 함께 전달된 password필드를 읽어들이지 못하면서 유효성 에러가 발생하였습니다. 원래 dto를 이용해서 사용자 추가를 위한 경우와 응답을 위한 경우를 나눠서 각각의 dto객체를 사용하는 경우엔 딱히 발생할 문제가 아니었지만 하나의 domain을 사용하면서 직면한 문제입니다. 이런 경우에는 @JsonProperty를 이용해서 Access타입을 지정해주면 쉽게 해결할 수 있습니다.

// @JsonIgnore instead of @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @NotBlank @Size(min = 9, max = 50) private String password;

@JsonProperty애노테이션을 사용하면서 access = JsonProperty.Access.WRITE_ONLY값을 설정하면 해당 필드는 오직 쓰려는 경우(deserialize)에만 접근이 허용됩니다. 사용자를 생성하기 위한 요청 본문을 처리할 때는 사용되고, 응답결과를 생성할 때는 해당 필드는 제외되서 응답 본문에 표시되지 않게 됩니다.

이 외에도 다음과 같은 접근제어가 가능합니다.

  • AUTO
  • READ_ONLY
  • WRITE_ONLY
  • READ_WRITE

의미가 너무 명확해서 별다른 설명은 필요없을 것 같습니다. 이 외에도 별도로 getter/setter 메서드를 제어하는 등의 여러가지 방법이 있겠지만 @JsonProperty애노테이션을 사용하는 이유는 lombok라이브러리를 사용하고 있기 때문입니다. 만약 lombok을 사용하고 있다면 제 생각엔 @JsonProperty를 사용하는게 제일 간편할 것 같다는 생각이 듭니다.



출처: https://eglowc.tistory.com/28 [han]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함