4월 25일(1)

SJY0000·2022년 4월 25일
0

Springboot

목록 보기
22/24

오늘 배운 것

  • Spring MVC

Spring MVC

Filter

요청과 응답시 필터링 하는 기능이다.

서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.

또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.

보통 web.xml에 등록하고, 일반적으로 (한글)인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.

Dispatcher Servlet

Dispatcher-Servlet 이란?

Dispatcher-Servlet의 dispatch는 "보내다"라는 뜻을 가지고 있습니다. 그리고 이러한 단어를 포함하는 Dispatcher-Servlet은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 Controller에 위임해주는 Front Controller라고 정의할 수 있습니다.

Client로부터 어떠한 요청이 오면 Tomcat과 같은 서블릿 컨테이너가 요청을 받게 됩니다. 그리고 이 모든 요청을 Front Controller인 Dispatcher-Servlet이 가장 먼저 받게 됩니다. 그러면 Dispatcher-Servlet은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 Controller를 찾아서 작업을 위임합니다.

여기서 Front Controller라는 용어가 사용되는데, Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 Client의 모든 요청을 받아서 처리해주는 Controller로써, MVC 구조에서 함께 사용되는 디자인 패턴입니다.

Dispatcher-Servlet의 장점

Spring MVC는 Dispatcher-Servlet이 등장함에 따라 web.xml의 역할을 상당히 축소시켜주었습니다. 과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, Dispatcher-Servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 상당히 편리하게 이용할 수 있게 되었습니다. 우리는 Controller를 구현해두기만 하면 Dispatcher-Servlet가 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었습니다.

정적 자원(Static Resources)의 처리

Dispatcher-Servlet이 요청을 Controller로 넘겨주는 방식은 효율적으로 보입니다. 하지만 Dispatcher-Servlet이 모든 요청을 처리하다보니 이미지나 HTML/CSS/JavaScript 등과 같은 정적 파일에 대한 요청마저 모두 가로채는 까닭에 정적자원(Static Resources)을 불러오지 못하는 상황도 발생하곤 했습니다. 이러한 문제를 해결하기 위해 Controller에 대한 요청을 탐색하고 없으면 정적자원(Static Resources)에 대한 요청으로 처리

Intercept

요청에 대한 작업 전/후로 가로챈다고 보면 된다.

필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.

하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.

스프링의 모든 빈 객체에 접근할 수 있다.

인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리

  • preHandle

컨트롤러 실행 전 수행한다. 반환 값이 true일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않는다. Object handler는 진입하려는 컨트롤러의 클래스 객체가 담겨있다.

  • postHandle

컨트롤러 실행 후 View가 랜더링 되기 전에 수행한다.

  • afterCompletion

컨트롤러 실행되고 view가 랜더링 된 후에 실행된다.

  • afterConcurrentHandlingStarted

비동기 요청 시 PostHandle과 afterCompletion이 수행되지 않고 afterConcurrentHandlingStarted가 수행된다

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HttpInterceptor())
                .addPathPatterns("/*")
                .excludePathPatterns("/board"); // 해당 경로는 인터셉터가 가로채지 않는다.
    }
}
@Component
@Log
public class HttpInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("[preHandle]");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("[postHandle]");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
        log.info("[afterCompletion]");
    }
}
@Controller
@Log
public class HomeController {

    @GetMapping("/user")
    public String user() {
        log.info("user");
        return "/user";
    }

    @GetMapping("/board")
    public String board() {
        logger.info("board");
        return "/board";

실행결과

localhost:8080/user

[preHandle]

user

[postHandle]

[afterCompletion]

localhost:8080/board

board

Interceptor : 특정 URI로 요청했을 때 컨트롤러로 가는 요청을 가로챔

spring security : 인증,권한,보안 기능을 제공하는 Spring의 하위 프레임워크

interceptor vs spring security가 아니라

spring securiy를 쓰지 않는다면

interceptor와 같은 기능을 사용해서 인증,보안 기능을 직접 개발자가 구현

시큐리티를 사용한다면 개발자 입장에서 난이도 높은 보안 관련 코딩을 직접하지 않아도 된다는 장점이 있지만 사용할려면 여러가지 설정및 관련 내용을 익혀야 한다.


0개의 댓글