
→ 로그인 기능 구현 초기 코드인데, JWT를 만들어서 Controller로 전달하기 위해
UserResponse.LoginDTO에 담았다.

→ 로그인DTO는 이렇게 생겼는데 accessToken이 필드로 들어가 있다.

→ UserController단 에서
먼저, LoginDTO의 accessToken을 꺼내서 응답헤더에 넣어주었고
LoginDTO는 응답body에 넣어서 그대로 return 해주었다.


그렇게 하니 응답 헤더에도 토큰이 들어가고 응답 바디에도 토큰이 들어간다
→ 컨트롤러에서 JSON 응답으로 보낼 때 accessToken을 제외시키고 싶은데 어떻게 해야할까 ?

→ 이렇게 ResponseDTO에서 @JsonIgnore 어노테이션을 달아주면
해당 필드를 JSON 직렬화 또는 역직렬화 과정에서 무시하게 해준다.
→ 서비스에서 컨트롤러로 넘어갈 때는 값이 전달되지만
클라이언트에게 전달하기 위해 JSON으로 응답 보낼때는 제외되는 것!


→ 응답 헤더로만 토큰이 전달 된 것을 확인할 수 있다 : )
@JsonIgnore
애노테이션은 Jackson 라이브러리에서 제공하는 애노테이션으로, 특정 필드나 메서드를 JSON 직렬화 또는 역직렬화 과정에서 무시하도록 설정하는 데 사용됩니다. 이를 통해 특정 데이터를 클라이언트에 노출시키지 않거나, 역직렬화 시 특정 필드를 무시할 수 있습니다.@JsonIgnore 주요 사용 목적
- JSON 직렬화 과정에서 필드 제외
- 객체를 JSON으로 변환할 때 특정 필드를 포함하고 싶지 않을 때 사용합니다. 예를 들어, 비밀번호와 같은 민감한 정보는 클라이언트에게 노출하지 않도록 설정할 수 있습니다.
- 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
}
위 코드에서는
password
와 email
필드가 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