[Project] 2차 프로젝트 - ResponseDTO의 특정 필드 JSON 응답에서 제외시키기

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - ResponseDTO의 특정 필드 JSON 응답에서 제외시키기
notion image
 
→ 로그인 기능 구현 초기 코드인데, JWT를 만들어서 Controller로 전달하기 위해
UserResponse.LoginDTO에 담았다.
 
notion image
 
→ 로그인DTO는 이렇게 생겼는데 accessToken이 필드로 들어가 있다.
 
notion image
→ UserController단 에서
먼저, LoginDTO의 accessToken을 꺼내서 응답헤더에 넣어주었고
LoginDTO는 응답body에 넣어서 그대로 return 해주었다.
 
notion image
notion image
그렇게 하니 응답 헤더에도 토큰이 들어가고 응답 바디에도 토큰이 들어간다
 
→ 컨트롤러에서 JSON 응답으로 보낼 때 accessToken을 제외시키고 싶은데 어떻게 해야할까 ?
 
notion image
 
→ 이렇게 ResponseDTO에서 @JsonIgnore 어노테이션을 달아주면
해당 필드를 JSON 직렬화 또는 역직렬화 과정에서 무시하게 해준다.
 
→ 서비스에서 컨트롤러로 넘어갈 때는 값이 전달되지만
클라이언트에게 전달하기 위해 JSON으로 응답 보낼때는 제외되는 것!
 
notion image
notion image
 
→ 응답 헤더로만 토큰이 전달 된 것을 확인할 수 있다 : )
 
 
💡
@JsonIgnore 애노테이션은 Jackson 라이브러리에서 제공하는 애노테이션으로, 특정 필드나 메서드를 JSON 직렬화 또는 역직렬화 과정에서 무시하도록 설정하는 데 사용됩니다. 이를 통해 특정 데이터를 클라이언트에 노출시키지 않거나, 역직렬화 시 특정 필드를 무시할 수 있습니다.

@JsonIgnore 주요 사용 목적

  1. JSON 직렬화 과정에서 필드 제외
      • 객체를 JSON으로 변환할 때 특정 필드를 포함하고 싶지 않을 때 사용합니다. 예를 들어, 비밀번호와 같은 민감한 정보는 클라이언트에게 노출하지 않도록 설정할 수 있습니다.
  1. JSON 역직렬화 과정에서 필드 제외
      • 클라이언트로부터 JSON 데이터를 받을 때 특정 필드는 무시하고 싶을 때 사용합니다. 예를 들어, 클라이언트가 값을 변경할 수 없게 하기 위해, 역직렬화 시 특정 필드의 값은 무시할 수 있습니다.

사용 방법

1. 필드에 적용

필드에 @JsonIgnore를 붙이면 그 필드는 JSON 응답에서 제외됩니다. 직렬화 시 해당 필드는 JSON에 포함되지 않으며, 역직렬화 시에도 무시됩니다.
java 코드 복사 import com.fasterxml.jackson.annotation.JsonIgnore; public class User { private String username; @JsonIgnore private String password; // 비밀번호 필드를 제외 // getters and setters }
위의 예시에서 password 필드에 @JsonIgnore를 붙였기 때문에, 객체를 JSON으로 변환할 때 password 필드는 JSON 응답에 포함되지 않습니다.

2. 메서드에 적용

@JsonIgnore를 getter 메서드에 붙이면 해당 필드가 JSON으로 변환될 때 제외됩니다.
java 코드 복사 import com.fasterxml.jackson.annotation.JsonIgnore; public class User { private String username; private String password; @JsonIgnore public String getPassword() { // getter에 @JsonIgnore 적용 return password; } // getters and setters }

3. 역직렬화에서 무시

클라이언트로부터 데이터를 받을 때도 @JsonIgnore는 적용됩니다. 역직렬화 시에도 해당 필드는 무시되며, 데이터가 전달되더라도 해당 필드의 값은 변경되지 않습니다.
java 코드 복사 import com.fasterxml.jackson.annotation.JsonIgnore; public class User { private String username; @JsonIgnore // 이 필드는 역직렬화 시 무시됨 private String password; // getters and setters }
위의 코드에서 클라이언트가 password 값을 JSON으로 보내도, 해당 값은 무시되고 기존 객체의 값에 영향을 주지 않습니다.

@JsonIgnore 관련 추가 애노테이션

  • @JsonIgnoreProperties: 클래스 단위에서 특정 필드들을 무시할 때 사용합니다. 여러 필드를 한 번에 무시하고 싶을 때 유용합니다.
    • java 코드 복사 @JsonIgnoreProperties({"password", "email"}) public class User { private String username; private String password; private String email; // getters and setters }
      위 코드에서는 passwordemail 필드가 JSON 변환에서 무시됩니다.
  • @JsonIgnoreType: 특정 타입 전체를 무시하고 싶을 때 사용합니다. 이 타입에 속하는 모든 객체가 직렬화 과정에서 무시됩니다.
    • java 코드 복사 @JsonIgnoreType public class SensitiveData { // 이 클래스는 직렬화/역직렬화 과정에서 완전히 무시됨 }

사용 시 주의사항

  • @JsonIgnore를 사용하면 해당 필드나 메서드는 직렬화와 역직렬화 모두에서 제외됩니다. 만약 직렬화에서만 제외하고, 역직렬화에서는 사용하고 싶다면, 대신 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 같은 애노테이션을 고려할 수 있습니다.
    • java 코드 복사 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password;
      이 경우, password는 클라이언트로부터 값을 받을 수 있지만, JSON 응답에서는 제외됩니다.

정리

@JsonIgnore는 주로 객체를 JSON으로 변환할 때 보안상의 이유로 특정 데이터를 숨기거나, 역직렬화 시 불필요한 데이터를 무시하기 위해 사용됩니다. 상황에 따라 적절하게 사용하면 데이터 노출을 방지하고, 역직렬화 시 불필요한 처리를 줄일 수 있습니다.
Share article

keepgoing