@Operation(summary = "북마크 토글", description = "북마크 존재시 -> 삭제 / 없을시 -> 생성")
@PostMapping
public ResponseEntity<ApiResponse<Void>> togleBookmark(
@Valid @RequestBody BookmarkRequest.BookmarkRequestCreate reqDto,
@AuthenticationPrincipal AuthUser authUser
){
ApiResponse<Void> apiResponse = bookmarkService.togleBookmark(reqDto,authUser);
return ApiResponse.of(apiResponse);
}
// DTO exception custom
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> dtoException(MethodArgumentNotValidException e) {
FieldError fe = e.getBindingResult().getFieldError();
ApiResponse<Void> apiResponse = new ApiResponse<>(HttpStatus.BAD_REQUEST.value(), fe.getDefaultMessage(),null);
return ApiResponse.of(apiResponse);
}
RequestParam 같은경우 DTO를 사용하지않고, 인자값으로 하나하나 받다보니 다른 방식을 취해줘야한다
기존 컨트롤러위에 @Validated 어노테이션을 추가해준다
@Operation(summary = "자신의 모든 북마크들 가져오기", description = "자신의 북마크 다건 조회 API")
@GetMapping
public ResponseEntity<ApiResponse<Page<BookmarkResponse>>> getAllBookmarks(
@Max(value = 10, message = "페이지 최댓값이 10페이지를 넘을 수 없습니다") @RequestParam(defaultValue = "0", required = false) int page,
@RequestParam(defaultValue = "10", required = false) int size,
@RequestParam(defaultValue = "desc", required = false) String sort,
@RequestParam(required = false) BookmarkTargetType target,
@AuthenticationPrincipal AuthUser authUser
){
Sort.Direction direction = Sort.Direction.fromString(sort);
Pageable pageable = PageRequest.of(page, size, direction,"createdAt");
ApiResponse<Page<BookmarkResponse>> apiResponse = bookmarkService.getAllBookmarksByUser(pageable, authUser, target);
return ApiResponse.of(apiResponse);
}
@RequestParam에 직접 Validate를 체크하는 어노테이션을 추가해준다
GlbalException에 아래의 코드를 추가해준다
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<ApiResponse<Void>> handleConstraintViolation(ConstraintViolationException e) {
String errorMessage = e.getConstraintViolations().stream()
.map(violation -> violation.getMessage())
.findFirst()
.orElse("Invalid input");
ApiResponse<Void> apiResponse = new ApiResponse<>(HttpStatus.BAD_REQUEST.value(), errorMessage, null);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(apiResponse);
}
ApiResponse는 내가 만든 반환타입이니 적당히 수정해주길바란다 !
그렇다면 Postman으로 11페이지를 요청해보자


@Operation(summary = "자신의 모든 북마크들 가져오기", description = "자신의 북마크 다건 조회 API")
@GetMapping
public ResponseEntity<ApiResponse<Page<BookmarkResponse>>> getAllBookmarks(
@Max(value = 10, message = "페이지 최댓값이 10페이지를 넘을 수 없습니다") @RequestParam(defaultValue = "0", required = false) int page,
@RequestParam(defaultValue = "10", required = false) int size,
@RequestParam(defaultValue = "desc", required = false) String sort,
@RequestParam(required = false) BookmarkTargetType target,
@AuthenticationPrincipal AuthUser authUser
){
Sort.Direction direction = Sort.Direction.fromString(sort);
Pageable pageable = PageRequest.of(page, size, direction,"createdAt");
ApiResponse<Page<BookmarkResponse>> apiResponse = bookmarkService.getAllBookmarksByUser(pageable, authUser, target);
return ApiResponse.of(apiResponse);
}
/**
* 로그인 되있는 자신의 북마크들 목록 확인
*/
@Operation(summary = "자신의 모든 북마크들 가져오기", description = "자신의 북마크 다건 조회 API")
@GetMapping
public ResponseEntity<ApiResponse<Page<BookmarkResponse>>> getAllBookmarks(
@ModelAttribute BookmarkRequestSearch request,
@AuthenticationPrincipal AuthUser authUser
){
Sort.Direction direction = Sort.Direction.fromString(request.getSort());
Pageable pageable = PageRequest.of(request.getPage(), request.getSize(), direction,"createdAt");
ApiResponse<Page<BookmarkResponse>> apiResponse = bookmarkService.getAllBookmarksByUser(pageable, authUser, request.getTarget());
return ApiResponse.of(apiResponse);
}