핸들러 인터셉터란?
핸들러 맵핑에 설정할 수 있는 인터셉터
● 핸들러를 실행하기 전, 후(아직 랜더링 전) 그리고 완료(랜더링까지 끝난 이후) 시점에
부가 작업을 하고 싶은 경우에 사용할 수 있다.
● 여러 핸들러에서 반복적으로 사용하는 코드를 줄이고 싶을 때 사용할 수 있다.
ex) 로그인 체크, 권한 체크 등이 있습니다.
prehandle, posthandle, afterCompletion
서블릿 필터
● 핸들러 인터셉터는 서블릿 보다 구체적인 처리가 가능하다.
● 서블릿은 보다 일반적인 용도의 기능을 구현하는데 사용하는게 좋다.
아래와 같이 핸들러 인터셉터는 이제 URI나 http에 관한내용도 건들수있기때문에 더 디테일하다
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
System. out .println( "preHandle 1" );
return true ;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView modelAndView) throws Exception {
System. out .println( "postHandle 1" );
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) throws Exception {
System. out .println( "afterCompletion 1" );
}
그렇다면 핸들러인터셉터는 핸들러 요청전이나 후에 처리이면 아규먼트리솔버는 언제 호출될가??..
인터셉터는 핸들러 요청전이고 그러면 이제 아규먼트 리솔버는 핸들러 요청시에 이제 필요한 아규먼트를 만들거나 미리만들어놓은것을 넘겨주도록 하는 역할이다. 그런데 아규먼트 리솔버에서 핸들러에서 필요한객체를 봤는데 만약 json으로 요청이온다면 이제 json을 객체로 바꿔주는 httpmessageconverter를 이용해서 바꿔준다.
음 로그인이면 아규먼트 리솔버만 사용해서 현재 로그인찾고 그것을 이제 AOP를이용하는방법
또아니면 request에서 세션정보가져와서 로그인 처리하는방법도있는것같다.
개인적으로 아규먼트 리솔버와 AOP를 통해 로그인검증하는게 더 로직이 작동하는데 맞는것같다..
아규먼트 리졸버 (Argument Resolver)
컨트롤러 메소드에서 자주 사용되는 값이 있을 경우, 아규먼트 리졸버를 만들어서 넘겨주도록 하면 편리하게 사용할 수 있다.
리소스 핸들러는 이미지, 자바스크립트, CSS 그리고 HTML 파일과 같은 정적인 리소스를 처리하는 핸들러
등록하는 방법
등록시에 경로에있는 리소스 들을 캐싱할수있는 기능들을 가짐 그러면 더빨리 렌더링될거같다.
캐싱되어있어서 응답이 304로됨 주로 jsp나 서버사이드렌더링 하는 곳에서 사용할거같다. 캐시응답으로
httpmethod에는 무엇이있을가요
get
post
put : 전체 수정
patch : 일부수정
delete
options : sop정채에서 cross-orgin에서 오는 요청을 막는데 그걸해결해주는게 cors이다 cors사용시 preflight요청시 사용하는거
@RequestBody, @ResponseBody는 Http메시지컨버터를 사용할때 요청을받거나 응답할때 사용한다.
ArgumentResovler : 요청시
Return Value Resolver : 응답시
MEDIATYPE : 핸들러가 요청과 응답을 보낼때 특정 타입에만 응답하도록 만들수 있다.
request에는 consumes, response에는 produces를 통해서 가능하다.
@Validated
스프링 MVC 핸들러 메소드 아규먼트에 사용할 수 있으며 validation group이라는 힌트를
사용할 수 있다. @Valid 애노테이션에는 그룹을 지정할 방법이 없다.
@Validated는 스프링이 제공하는 애노테이션으로 그룹 클래스를 설정할 수 있다.
@SessionAttributes
event라는 이름에해당하는 mdoel.addattribute에는 세션에 자동으로 넣어줌
@SessionAttributes와는 다르다.
● @SessionAttributes는 해당 컨트롤러 내에서만 동작.
○ 즉, 해당 컨트롤러 안에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용. ●
@SessionAttribute는 컨트롤러 밖(인터셉터 또는 필터 등)에서 만들어 준 세션 데이터에
접근할 때 사용한다. 인터셉터에서 visitTime이라고 세션에 추가하면 그것을 사용가능 컨트롤러에서도 범위가넓음
ResourceLoader 를 이용하면 정적파일을 읽어올수있다.
ResponseEntity
● 응답 상태 코드
● 응답 헤더
● 응답 본문
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachement; filename=\""
+ resource.getFilename() + "\"")
.header(HttpHeaders.CONTENT_TYPE, type)
.header(HttpHeaders.CONTENT_LENGTH, String.valueOf(file.length()))
.body(resource);
@RequestBody & HttpEntity : HttpEntity는 @RequestBody와 비슷하지만 추가적으로 요청 헤더 정보를 사용할 수 있다.
@RequestBody는 @Valid 또는 @Validated를 사용해서 값을 검증 할 수 있다.
@ResponseBody
● 데이터를 HttpMessageConverter를 사용해 응답 본문 메시지로 보낼 때
사용한다. ● @RestController 사용시 자동으로 모든 핸들러 메소드에 적용
된다.
ResponseEntity
● 응답 헤더 상태 코드 본문을 직접 다루고 싶은 경우에 사용한다.
예외처리핸들러 (예외는 우리가 따로만드는게 최고겠지)
@ExceptionHandler
REST API의 경우 응답 본문에 에러에 대한 정보를 담아주고, 상태 코드를
설정하려면 ResponseEntity를 주로 사용한다.
갑자기 헷갈리는게 컨트롤러에서 서비스를 호출하는데 예외가 터지면 컨트롤러에서 예외를 처리해야하는구나.
핸들러니까...
전역 컨트롤러: @(Rest)ControllerAdvice
예외 처리, 바인딩 설정, 모델 객체를 모든 컨트롤러 전반에 걸쳐 적용하고 싶은
경우에 사용한다.
● @ExceptionHandler
● @InitBinder
● @ModelAttributes
즉 하나의 컨트롤러인데 이제 특정컨트롤러들로 지정할수도있지만 그냥쓰면 모든컨트롤러에서 만약 @ExceptionHandler를 추가시켜놓으면 거기서 정한 내가 @ExceptionHandler에 적용시킨 예외가 터진다면 전역컨트롤러로 들어와서 처리하게 되는것 주로 전역 예외처리에 사용됨.
적용할 범위를 지정할 수도 있다.
● 특정 애노테이션을 가지고 있는 컨트롤러에만 적용하기
● 특정 패키지 이하의 컨트롤러에만 적용하기
● 특정 클래스 타입에만 적용하기