사용자 목록 및 정보 조회 api 요청에 대한 응답 시
User 도메인 객체의 필드 중에 이름, 가입일, 시퀀스만 노출해야 하고,
HATEOAS를 적용해 보기로 했다.
url 변경이 발생해도 클라이언트 사이드 작업에는 영향이 미치지 않기 때문이다.
api 응답시 필드 몇가지는 비노출 하기로 했지만,
swagger를 통한 도메인 객체 정보 조회시 모든 필드 정보를 출력해야 한다.
@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;
}
보고 배운 곳 : 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;
}
}