Burninghering's Blog
article thumbnail

DispatcherServlet이란? - 스프링 MVC의 요청 처리 과정

역할 1)

입력/처리/출력을 하는 서블릿들(왼쪽 3개)

에서도 

입력 부분같은 공통된 처리 부분을 앞으로 따로 빼내서

컨트롤러들의 공통 부분을 제거하는 것이 역할이다.

 

각 서블릿이나 컨트롤러가 해야될 공통된 부분을 디스패처서블릿이 앞에서 전처리를 해주는 것이다.

 

 

역할 2)

요청이 오면 디스패처서블릿이 요청을 해당 컨트롤러의 메소드를 호출하고 그 결과로 뷰 이름을 받는다.

그 뷰 이름으로 해당 뷰를 찾아서 뷰가 응답한다.

 

디스패처서블릿이 핸들러매핑과 연결되어 있는데,

핸들러매핑은 key-value로 URL-메소드를 매핑시켜놓는다.

그 정보를 저장하고 있다가 요청이 왔을 때 요청을 어떤 메소드와 연결시키면 좋을 지 핸들러매핑에게 물어본다.

핸들러매핑은 맵을 뒤져서, 해당 URL과 일치하고 있는 메소드(HandlerMethod객체)를 반환한다.

그럼 디스패처서블릿이 그 메소드를 호출한다.

디스패처 서블릿이 전부 관리하기 보단, 핸들러매핑이라는 별도의 기능을 분리해놓고 메소드에 대한 정보를 얻는 식으로 관심사의 분리를 하는 것이다.

 

디스패처서블릿이 컨트롤러를 직접 호출하는 것이 아니라

핸들러어댑터를 통해 호출한다.(RequestMappingHandler)

핸들러어댑터의 종류가 여러 개 있을 수 있고 다른 종류의 객체들도 호출가능하다.

핸들러매핑이 알려준 메소드를 어떤 핸들러어댑터가 처리할 수 있는 지 알아보고, 그 핸들러 어댑터에게 넘겨준다.

그 핸들러어댑터는 어떤 컨트롤러를 처리할 수 있는 지 알아보고, 컨트롤러를 호출한다.

그 결과를 디스패처 서블릿에게 전달한다.

디스패처서블릿이 직접 컨트롤러를 호출하는 것보다,

핸들러어댑터를 둠으로써 느슨한 결합이 되는 것이다. -> 변경에 유리 / 유연하다

디스패처서블릿이 핸들러어댑터를 통해 컨트롤러 뿐만 아니라 서블릿도 호출 가능하다.

 

뷰리졸버는 종류가 여러가지 있는데 우리는 인터널리소스뷰리졸버를 알아보았다.

뷰 이름을 주면, 이름을 접두사와 접미사를 붙여서 

/WEB-INF/vies/abc.jsp

실제 뷰 이름을 알려준다.

이 역할을 하는 것이 인터널리소스뷰리졸버이다.

 

실습사진1
실습사진2

 

컨트롤러가 뷰 이름을 반환하면 핸들러어댑터를 거쳐서 디스패처서블릿으로 가는데 그 뷰이름의 실제 이름이 무엇인지 뷰 리졸버에게 물어본다.

뷰 리졸버는 실제 이름을 반환하고 디스패처서블릿이 해당 뷰를 호출하고 

뷰에 모델을 전달해줄 것이다.

jsp파일이 모델 정보를 이용해서 응답결과를 만든 뒤 클라이언트에 응답한다.

(중간에 뷰 인터페이스를 거치는데, JstlView가 있는 이유는 느슨한 결합때문이다. 변경에 유리하기 때문에)


DispatcherServlet의 소스 분석

기본 전략이라 함은 디스패처서블릿이 기본적으로 사용하는 클래스를 의미함 - 전략패턴이라는 디자인패턴에서 따온 말

 

주요 메서드는 디스패처서블릿이 가지고 있는 메서드들이다.

실습사진3
기본 전략들


DispatcherServlet의 과정 직접 실습

코드를 멈추고 브라우저에서 /login을 보내면 어떤 과정을 통해 loginForm 메소드가 실행되는지 볼 수 있을 것이다.


서블릿에서는 필터가 전처리&후처리를 맡는데,

서블릿 앞에 필터를 세워놓고 

요청하는 것은 전처리 과정,

응답하는 것은 후처리 과정이라고 한다.

 

이것이 스프링에서는 인터셉터이다.


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.