본문 바로가기

공부/Spring Boot를 이용한 RESTful Web Services 정리

[Spring Boot] Response 필드 제어하기 (Filterling)

  • 어떤 특정 데이터를 외부에 안보이게 하고 싶다면, 어떻게 해야할까? ex) 비밀번호라던지..

특정 JSON 비노출 처리하기

 

(1) @JsonIgnore 예제

@Data //getter,setter 사용
@AllArgsConstructor
public class User {
    private Integer id;

    @Size(min=2,message="Name은 두가지 이상 전달해 주세요") //최소 길이 2개 이상
    private String name;

    @Past //미래 데이터를 쓸수가 없다는 제약조건
    private String joinDate;

    @JsonIgnore
    private String password;

    @JsonIgnore
    private String ssn;
}

노출 되지 않는 passwoord와 ssn

 

 

- password와, ssn 객체에 @JsonIgnore을 선언해본다.

- 결과로, 특정 도메인의 값이 노출 되지 않았다.

 

(2) @JsonIgnoreProperties 예제

package com.example.restfulwebservice.User;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;

import javax.validation.constraints.Past;
import javax.validation.constraints.Size;


@Data 
@AllArgsConstructor
@JsonIgnoreProperties(value = {"password"})
public class User {
    private Integer id;

    @Size(min=2,message="Name은 두가지 이상 전달해 주세요") 
    private String name;

    @Past 
    private String joinDate;

    private String password;

    private String ssn;
}

password 비노출

 

- @JsonIgnoreProperties에서 특정 프로퍼티 값을 배열 형태로 지정해주면 비노출 처리 가능하다.

 

 

(3) @JsonFilter 예제

@Data 
@AllArgsConstructor
@JsonFilter("UserInfo")
public class User {
    private Integer id;

    @Size(min=2,message="Name은 두가지 이상 전달해 주세요") //최소 길이 2개 이상
    private String name;

    @Past 
    private String joinDate;

    private String password;

    private String ssn;
}

 

- 도메인 클래스에 @JsonFilter("필터명") 을 선언 해준다.

 

 

package com.example.restfulwebservice.User;

import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/admin")
public class AdminUserController {

    @Autowired
    private UserDaoService service;


    @GetMapping("/users/{id}")
    public MappingJacksonValue retreiveAllUsers(@PathVariable int id) {
        User user = service.findOne(id);
        if(user == null){
            throw  new UserNotFoundException(String.format("ID[%s] not found",id));
        }

        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;
    }


}

필터로 지정해 준 값만 나옴

 

- Controller에서 Json을 필터링 할 수 있다.

- SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept()로 필터링할 프로퍼티들을 선언한다.

- FilterProvider를 사용해 Userinfo로 선언한 필터를 할당한다.

- Spring MVC MappingJackonValue를 사용해 user 객체와 filter 객체를 맵핑 후 리턴해준다.

- 필터로 지정해 준 값만 노출된다.

 

 

 

Reference


인프런 강의 -  Spring Boot를 이용한 RESTful Web Services 개발

 

300x250