[Spring] DispatcherServlet과 Spring MVC의 핵심 흐름 분석

2024. 10. 7. 21:51·Spring

이전 글 이어서 ..

https://yn98.tistory.com/88

 

[Spring] DispatcherServlet, ViewResolver , DI 방식 정리

이번 포스팅에서는 DispatcherServlet과 ViewResolver의 역할, 의존성 주입 방식, 그리고 JSP에서 스프링으로 넘어가는 과정에 대해 다루려고 한다. DispatcherServlet의 기본 구조 DispatcherServlet은 스프링 프레

yn98.tistory.com

앞선 글에서, DispatcherServlet에 알아봤다. 

다시 DispatcherServlet에 대해 정리하자면, 앞에 글의 DispatcherServlet는 진짜 DispatcherServlet이 아니라 이해를 위해 임의로 코드를 작성한 것이다.

실제 DispatcherServlet은 Spring MVC에서 실제로 동작하는 핵심 Servlet으로, 클라이언트로부터 요청(request)을 받아 Controller에 전달하고 응답(response)을 처리하는 역할을 담당한다. (request-response)

아래의 web.xml은, 서블릿 컨테이너( == 톰캣)에게 주는 설정 사항이다.

web.xml에서는 Spring의 DispatcherServlet을 설정하기 위해 <servlet>과 <servlet-mapping> 태그를 사용한다.

<servlet>
    <servlet-name>ds</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ds</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

 

이 설정은 서블릿 컨테이너(톰캣)가 DispatcherServlet을 인식하고, 지정된 URL 패턴을 가진 요청을 해당 서블릿으로 전달하게끔 하는 역할을 한다.

여기서 DispatcherServlet을 설정하고 Mapping까지 해주면,

서버가 구동될 때 서블릿 컨테이너는 web.xml을 읽고 “Spring의 DispatcherServlet을 쓰네?”라고 판단한다.

그리고 ds-servlet.xml 파일을 찾아서 스프링 컨테이너가 개입을 시작한다.

중요한 것은 여기서 DispatcherServlet은 servlet-name과 연관이 있다는 것이다.

 

DispatcherServlet은 본인의 의존성을 주입하려고 하고,

그걸 위해 handlerMapping과 viewResolver 같은 것이 필요하다.

그래서 다음과 같은 설정을 넣어준다.

 

Spring에서는 DispatcherServlet이 구동되면, 해당 서블릿의 이름을 기준으로 [서블릿명]-servlet.xml 파일을 필요로 한다. 여기서 서블릿 이름이 ds라면 ds-servlet.xml을 읽어 Spring의 설정을 로드하게 된다.

위의 web.xml 코드를 보면, servlet-name 태그에 의해, 아래 코드의 파일명은 반드시 ds-servlet.xml로 작성해야한다.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
            	<!-- 필요한 Mapping 설정 추가-->
				<prop key="/login.do">login</prop>
				<prop key="/main.do">main</prop>
				<prop key="/board.do">board</prop>
			</props>
		</property>
	</bean>

 

여기서 id를 따로 넣지 않는 이유는 init 과정에서 이미 설정되어 있기 때문이다.

SimpleUrlHandlerMapping은 실습용이라 property를 사용하지만, 보통은 생성자 주입 방식이 많이 쓰인다.

스프링에서 제공하는 Controller(interface)도 있다.

인자로는 request와 response를 받고, ModelAndView handleRequest() 메서드를 사용한다.

기존의 String execute(HttpServletRequest request, HttpServletResponse response) 코드를 ModelAndView로 옮겨가면서 사용하면 된다.

여기서 ModelAndView는  페이지 이동을 할 때 주로 쓰인다.

 

기존의 코드) -  Action.java 인터페이스

package controller.common;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public interface Action {
	ActionForward execute(HttpServletRequest request, HttpServletResponse response);
}

 

 

아래는 ModelAndView의 사용 예시이다.

// ModelAndView 객체 생성
ModelAndView mav = new ModelAndView();

// V 이름을 "login"으로 설정
mav.setViewName("login");

// 만약 memberDTO가 null이 아닐 경우 (== 회원 정보가 있을 경우)
if (memberDTO != null) {
    // Model에 userId 값을 추가 (memberDTO에서 가져온 사용자 ID를 전달)
    mav.addObject("userId", memberDTO.getMember_id());
    
    // V 이름을 "main.do"로 변경 (로그인 성공 시 메인 페이지로 이동)
    mav.setViewName("main.do");
}

// 설정된 View와 데이터(Model)를 반환 (Controller에서 return 시 페이지 이동)
return mav;

 

이렇게 사용하면 페이지 네비게이션이 가능해진다.

 

 

서블릿을 상속받은 애들이 바로  Filter와 Listener이다. 기본적으로 서블릿은 무겁다.

하지만 서블릿의 일부 기능을 가져다 쓰는 애들이 있는데, 그게 request, session, response 같은 것들이다.

이들은 JSP의 내장 객체로도 활용된다.

완전히 가벼운 POJO라고 보기는 힘들지만, 어느 정도 서블릿의 기능을 갖고 있는 것이다.

 

정리하자면, 스프링은 최대한 가볍게 돌리는 걸 목표로 한다.

session은 필연적으로 무거운 개념이다. Spring은 이를 최소화하기 위해 노력하는 프레임워크다.

'Spring' 카테고리의 다른 글

[Spring] 스테레오타입 어노테이션과 @RequestMapping  (0) 2024.10.09
[Spring] ViewResolver  (1) 2024.10.09
[Spring] DispatcherServlet, ViewResolver , DI 방식 정리  (0) 2024.10.07
[Spring] Spring DI와 비즈니스 로직  (2) 2024.10.06
[Spring] Spring에서의 객체 관리: XML 설정 파일 vs 어노테이션 기반 DI  (4) 2024.10.04
'Spring' 카테고리의 다른 글
  • [Spring] 스테레오타입 어노테이션과 @RequestMapping
  • [Spring] ViewResolver
  • [Spring] DispatcherServlet, ViewResolver , DI 방식 정리
  • [Spring] Spring DI와 비즈니스 로직
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    aop
    티스토리챌린지
    상속
    html
    codeup 4891 : 행복
    Spring
    ViewResolver
    2-layered 아키텍처
    java
    생성자
    recoverabledataaccessexception
    MVC
    jsp
    정보처리기사
    어노테이션
    수제비
    이벤트 스케줄러
    오블완
    스프링 프레임워크
    객체지향
    정처기 실기
    정보처리기사 실기
    @repository
    오버로딩
    @service
    Di
    @Component
    DispatcherServlet
    멘토씨리즈 자바
    정처기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
[Spring] DispatcherServlet과 Spring MVC의 핵심 흐름 분석
상단으로

티스토리툴바