# 변경 전
"/auth?action=member-detail&email=" + email;
# 변경 후
"/auth/member-detail?email=" + email;
Filter 대신에 사용!
Handler Interceptor (인터페이스)에 정의되어 있음
주요 메서드:

각각의 동작 위치를 알면 구분 쉽다!

web.xml을 통한 전역 처리
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
기본적으로 /error에 연결 → /error.jsp로 forward
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(request,
getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
HttpStatus status = getStatus(request);
if (status == HttpStatus.NO_CONTENT) {
return new ResponseEntity<>(status);
}
Map<String, Object> body = getErrorAttributes(request,
getErrorAttributeOptions(request, MediaType.ALL));
return new ResponseEntity<>(body, status);
}
}
파일 업로드는 공식처럼 외우기!
<form action="${root}/fileupload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="text" name="desc">
<button>전송</button>
</form>
properties에 제약사항 추가
@RequestParam MultipartFile file로 받아서 사용