Spring Boot : @JsonFilter와 HATEOAS 함께 사용해보기

김아무개·2023년 10월 20일
0

Spring Boot 🍃

목록 보기
79/95
post-custom-banner

시나리오

사용자 목록 및 정보 조회 api 요청에 대한 응답 시

User 도메인 객체의 필드 중에 이름, 가입일, 시퀀스만 노출해야 하고,

HATEOAS를 적용해 보기로 했다.
url 변경이 발생해도 클라이언트 사이드 작업에는 영향이 미치지 않기 때문이다.

api 응답시 필드 몇가지는 비노출 하기로 했지만,
swagger를 통한 도메인 객체 정보 조회시 모든 필드 정보를 출력해야 한다.


특이사항 정리

  1. api 응답 시
    User 도메인 객체에서 몇 가지 필드(이름, 가입일, 시퀀스)만 출력할 것

  2. swagger 문서 조회시
    User 도메인 객체의 모든 필드 정보 확인 가능

  3. HATEOAS 적용

User 도메인 객체 정의

@Schema(description = "사용자 상세 정보를 위한 도메인 객체")
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonFilter("UserInfo")
public class User {

    private Integer id;

    @Schema(description = "이름")
    @Size(min = 2, message = "2글자 이상 입력해주세요.")
    private String name;

    @Schema(description = "등록일")
    @Past
    private LocalDateTime joinDate;

    @Schema(description = "비밀번호")
    private String password;

    @Schema(description = "주민번호")
    private String ssn;
}

Controller 작성

보고 배운 곳 : https://www.inflearn.com/questions/37993/hateoas-질문

@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
public class UserController {
    private final UserDaoService service;

    @GetMapping
    public MappingJacksonValue retrieveAllUsers() {
        List<User> users = service.findAll();

        val controller = methodOn(this.getClass());
        CollectionModel<User> model = CollectionModel.of(users);
        model.add(linkTo(controller.retrieveAllUsers()).withSelfRel());
        model.add(linkTo(controller).slash("_id").withRel("info-user"));

        return getMappingJacksonValue(model);
    }

    @GetMapping("/{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));
        }

        val controller = methodOn(this.getClass());
        EntityModel<User> model = EntityModel.of(user);
        model.add(linkTo(controller.retrieveUser(id)).withSelfRel());
        model.add(linkTo(controller.retrieveAllUsers()).withRel("all-users"));

        return getMappingJacksonValue(model);
    }

    private MappingJacksonValue getMappingJacksonValue(Object data) {
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id", "name", "joinDate");
        FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);

        MappingJacksonValue mapping = new MappingJacksonValue(data);
        mapping.setFilters(filters);
        return mapping;
    }
}

실행 !

API 요청에 대한 응답 확인

/users /users/{id}


Swagger - User 객체 정보 조회

profile
Hello velog! 
post-custom-banner

0개의 댓글