Filtering
👉 중요한 데이터를 클라이언트에게 바로 노출하지 않기 위해 사용
annotation을 활용한 Filtering
@Data
@AllArgsConstructor
public class User {
private Integer id;
@Size(min=2, message = "Name은 2글자 이상 입력해 주세요.")
private String name; // 과거 데이터 제약 조건
@Past
private Date joinDate; // 중요한 데이터
@JsonIgnore
private String password;
@JsonIgnore
private String ssn;
}
@Data
@AllArgsConstructor
@JsonIgnoreProperties(value={"password","ssn"}) //클래스 블록에 추가
public class User {
private Integer id;
@Size(min=2, message = "Name은 2글자 이상 입력해 주세요.")
private String name;
@Past
private Date joinDate;
private String password;
private String ssn;
}
@JsonFilter() 이용 👉 admin 개별 사용자 조회
// User Class
@Data
@AllArgsConstructor
@JsonFilter("UserInfo")
// Controller, Service 클래스에서 사용
// Filter ID를 문자열로 지정하며, 이 어노테이션 사용 시에는 무조건
// FilterProvider와 해당 ID를 처리하는 필터를 제공해야 함
public class User {
private Integer id;
@Size(min=2, message = "Name은 2글자 이상 입력해 주세요.")
private String name;
@Past
private Date joinDate;
private String password;
private String ssn;
}
// AdminUserController Class
// 개별 사용자 조회
@GetMapping("admin/users/{id}")
public MappingJacksonValue retrieveUser(@PathVariable int id){
User user = service.findOne(id);
if(user==null){
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
// SimpleBeanPropertyFilter : 지정된 필드들만 JSON 변환하고, 알 수 없는 필드는 무시
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id","name","joinDate","ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);
MappingJacksonValue mapping = new MappingJacksonValue(user);
mapping.setFilters(filters);
return mapping;
}