자바 탐색일기

Mkim4·2024년 4월 16일

현재 대충 내가 생각하는 요청과 응답의 흐름이다.

요청이 필터를 거쳐 디스패처서블릿에 간다.
디스패처서블릿이 요청을 수행할 컨트롤러로 보낸다.
컨트롤러가 요청을 수행할 서비스로 보낸다.
서비스가 DAO 형태로 모델에 보낸다?... 
모델이 DB에 가서 DAO를 풍성하게 채워주고
다시 서비스로?...
서비스가 다시 디스패처 서블릿으로?..
디스패처서블릿이 뷰로 ?...

공부 후 다시 정리했을 때는 어떨지 한번 같이 살펴보자구요

1. web.xml 에서 필터를 찾았다.

	<!-- 한글 처리를 위해 encoding filter를 등록한다. -->
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

아니 이럴수가,,, web.xml에서 필터 태그를 확인해버리고 말았다.
web.xml을 보니
크게 web-app태그 안에

  • context-param
  • listener
  • servlet, servlet-mapping
  • filter, filter-mapping
    태그로 구현되어 있다는 것을 알았다.

Listener란?
1. 프로그래밍에서 Listener란 특정 이벤트가 발생하기를 기다리다가 실행되는 객체
2. 이벤트란 특정한 사건 발생 ex) 버튼클릭,키보드입력,컨테이너빌드완료,웹어플리케이션시작,HTTP요청수신 등
3. 서블릿 컨테이너에서 발생하는 이벤트 감지
4. web.xml파일에 \ 태그를 이용하여 사용 가능
5. 리스너가 여러 개일 경우 보통 선언된 순서대로 실행되지만 아닌 경우가 있으므로 각각의 리스너는 독립적으로 동작할 수 있도록 설계하는 것이 좋음

그 다음으로 Filter는?
1. 요청과 응답 데이터를 필터링하여 제어, 변경하는 역할
2. 사용자의 요청이 Servlet에 전달되어지기전에 Filter를 거침
3. Servlet으로부터 응답이 사용자에게 전달되어지기 전에 Filter를 거침
4. FilterChain을 통해 연쇄적으로 동작 가능

갑분 Interceptor가 나왔다. 이녀석은 뭐지
HandlerInterceptor를 구현한 것이라 한다.
요청(request)를 처리하는 과정에서 요청을 가로채서 처리하고
접근제어(Auth), 로그(Log)등 비즈니스 로직과 구분되는 반복적이고 부수적인 로직을 처리한다.
총 3가지가 있는데 이렇게 있다.

  • preHandle()
    Controller 실행 이전에 호출하고 true반환하면 계속 지행하고 false를 반환하면 요청을 종료한다고 한다.
  • postHandle()
    Controller 실행 후 호출하고 정상 실행 후 추가 기능 구현 시 사용하며
    Controller에서 예외 발생 시 해당 메서드는 실행되지 않는다고 한다.
  • afterCompletion()
    뷰가 클라이언트에게 응답을 전송한 뒤 실행하고
    Controller에서 예외 발생 시, 네 번째 파라미터로 전달이 된다고 한다.(기본은 null)
    따라서 Controller에서 발생한 예외 혹은 실행 시간 같은 것들을 기록하는 등 후처리 시 주로 사용한다.

Interceptor 등록은 Servlet-context.xml에 한다.

Spring MVC 구성 요소

  1. DispatcherServlet : 클라이언트 요청 처리(요청 및 처리 결과 전달)
  2. HandlerMapping : 요청을 어떤 Controller가 처리할 지 결정
  3. Controller : 요청에 따라 수행할 메서드를 선언하고, 요청처리를 위한 로직 수행(비즈니스 로직 호출)
  4. ModelAndView : 요청처리를 하기 위해서 필요한 혹은 그 결과를 저장하기 위한 객체
  5. ViewResolver : Controller에 선언된 view이름을 기반으로 결과를 반환할 View를 결정
  6. View : 응답화면 생성

Spring MVC - 요청 처리 흐름

  1. 클라이언트 요청이 들어오면 DispatcherServlet이 받는다.
  2. HandlerMapping이 어떤 Controller가 요청을 처리할지 결정한다.
  3. DispatcherServlet은 Controller에 요청을 전달
  4. Controller는 요청을 처리한다.
  5. 결과(요청처리를 위한 data, 결과를 보여줄 view의 이름)를 ModelAndView에 담아 변환
  6. ViewResolver에 의해서 실제 결과를 처리할 View를 결정하고 반환
  7. 결과를 처리할 View에 ModelAndView를 전달
  8. DispatcherServlet은 View가 만들어낸 결과를 응답

아하 Spring MVC는 DispatcherServlet 이라는 큰 틀에 Servlet WebApplicationContext와 Root WebApplicationContext가 안에 들어있고 Servlet WebApplicationContext 안에는 containing controllers, view resolvers, other web-related beans가 있구나
그리고 Root WebApplicationContext 안에는 containg middle-tier services, datasources 등 서비스와 레포지토리들이 있구나

DispatcherServlet 등록하고
servlet-context.xml / root-context.xml 파일을 생성하고

profile
귀요미 개발자

0개의 댓글