-
Spring Boot : @JsonFilter와 HATEOAS 함께 사용해보기Spring Boot 🍃 2023. 12. 17. 00:01
시나리오
사용자 목록 및 정보 조회 api 요청에 대한 응답 시
User 도메인 객체의 필드 중에 이름, 가입일, 시퀀스만 노출해야 하고,
HATEOAS를 적용해 보기로 했다. url 변경이 발생해도 클라이언트 사이드 작업에는 영향이 미치지 않기 때문이다.
api 응답시 필드 몇가지는 비노출 하기로 했지만, swagger를 통한 도메인 객체 정보 조회시 모든 필드 정보를 출력해야 한다.
특이사항 정리
- api 응답 시
User 도메인 객체에서 몇 가지 필드(이름, 가입일, 시퀀스)만 출력할 것
- swagger 문서 조회시
User 도메인 객체의 모든 필드 정보 확인 가능
- 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/{id}
/users
Swagger - User 객체 정보 조회
'Spring Boot 🍃' 카테고리의 다른 글
Spring Boot : intelliJ에서 HTTP API 테스트시 POST 요청으로 CSRF 토큰과 Json데이터 보내기 (0) 2023.12.17 Spring Boot : intelliJ에서 HTTP API 테스트시 Security HTTP 기본 인증 Header 설정 및 로그아웃 (0) 2023.12.17 Spring Boot : SpringDoc 문서에 설명 달기 (0) 2023.12.17 Spring Boot : Validation 예외 Advice로 관리하기 (0) 2023.12.17 Spring Boot : ServletUriComponentsBuilder 사용해보기 (0) 2023.12.17 - api 응답 시
User 도메인 객체에서 몇 가지 필드(이름, 가입일, 시퀀스)만 출력할 것