API 설계
Client -> Server
Server -> Client
Pagination controller-service-repository 적용
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("sortBy") String sortBy,
@RequestParam("isAsc") boolean isAsc,
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
public Page<Product> getProducts(Long userId, int page, int size, String sortBy, boolean isAsc) {
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
return productRepository.findAllByUserId(userId, pageable);
}
Page<Product> findAllByUserId(Long userId, Pageable pageable);
Pagination 검증을 위한 데이터 삽입
폴더 테이블 설계
JPA 연관관계를 이용한 폴더 테이블 설계
List<Folder> folders = user.getFolders();
User user = folder.getUser();
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;
request.setAttribute("LoginFailMessage", "아이디 또는 비밀번호가 일치하지 않습니다.");
request.getRequestDispatcher("/user/login?error").forward(request,response);
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
if(exception instanceof BadCredentialsException) {
String errorMessage = exception.getMessage() + "아이디 혹은 비밀번호를 확인해주세요.";
ObjectMapper objectMapper = new ObjectMapper();
String encodedErrMsg = URLEncoder.encode(errorMessage, "utf-8");
response.sendRedirect("/user/login?error=" + encodedErrMsg);
// 아래 방식으로 하다가 6시간이 날아갔습니다 선생님. 아래 방식은 왜 안되는건가요?.....
// request.setAttribute("LoginFailMessage", "아이디 또는 비밀번호가 일치하지 않습니다.");
// request.getRequestDispatcher("/user/login/" + errorMessage).forward(request,response);
// System.out.println(exception.getMessage());
}
// else if(exception instanceof AuthenticationServiceException) {
// request.setAttribute("LoginFailMessage", "죄송합니다. 시스템에 오류가 발생했습니다.");
// }
// else if(exception instanceof DisabledException) {
// request.setAttribute("LoginFailMessage", "현재 사용할 수 없는 계정입니다.");
// }
// else if(exception instanceof LockedException) {
// request.setAttribute("LoginFailMessage", "현재 잠긴 계정입니다.");
// }
// else if(exception instanceof AccountExpiredException) {
// request.setAttribute("LoginFailMessage", "이미 만료된 계정입니다.");
// }
// else if(exception instanceof CredentialsExpiredException) {
// request.setAttribute("LoginFailMessage", "비밀번호가 만료된 계정입니다.");
// }
// else request.setAttribute("LoginFailMessage", "계정을 찾을 수 없습니다.");
// response.sendRedirect("/users/login");
}
/login
)으로 시작되는 지 체크하며, 요청 정보와 불일치 시 2-1 chain.doFilter로 넘기고, 일치 시 Authentication 객체를 생성하여 Authentication Manager에게 넘긴다.