[Spring] MVC 프레임워크 구조

EB·2021년 6월 7일
0

MVC프레임워크 구조

클래스기능
DispatchServlet유일한 서블릿 클래스로서 모든 클라이언트의 요청을 가장 먼저 처리하는 FrontController
HandlerMapping클라이언트의 요청을 처리할 Controller 매핑
Controller실질적인 클라이언트의 요청 처리
ViewResolverController가 리턴한 View 이름으로 실행될 JSP 경로완성

Spring MVC 수행 흐름

  1. 클라이언트로 부터 모든 ".do" 요청을 DispatcherServlet 이 받음
  2. DispatcherServlet HandlerMapping 을 통해 요청을 처리할 Controller검색
  3. DispatcherServlet 은 검색된 Controller를 실행하여 클라이언트 요청 처리
  4. Controller 는 비즈니스 로직 수행 결과로 얻어낸 Model 정보와 Model을 보여줄 View 정보를
    ModelAndView 객체에 저장하여 리턴
  5. DispatcherServlet 은 ModelAndView로부터 View 정보 추출, ViewResolver 을 이용하여 응답으로 사용할 View를 얻어냄
  6. DispatcherServlet은 ViewResolver 를 통해 찾아낸 View를 실행하여 응답 전송.

💡DispatchServlet

package com.springbook.view.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

/**
 * Servlet implementation class DispatcherServlet
 */
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private HandlerMapping handlerMapping;
	private ViewResolver viewResolver;
	
	public void init() throws ServletException{
		handlerMapping = new HandlerMapping();
		viewResolver = new ViewResolver();
		viewResolver.setPrefix("./");
		viewResolver.setSuffix(".jsp");
	}
       

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		process(request,response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		process(request,response);
	}
	
	private void process(HttpServletRequest request, HttpServletResponse response) throws IOException{
		//1.클라이언트 요청 path 정보를 추출
		String uri= request.getRequestURI();
		String path=uri.substring(uri.lastIndexOf("/")); // 마지막의 "/"를 기준으로 자르겠다. ex)xxx.do
		
		
		//2.HandlerMapping을 통해 path에 해당하는 Controller 검색
		//HandlerMapping에 맞는 controller를 ctrl에 담아서 실행한다.
		Controller ctrl = handlerMapping.getController(path);
		
		//3.검색된 Controller 실행
		//실행한다음 결과에 맞는 페이지는 viewName에 담는다.
		String viewName = ctrl.handleRequest(request, response);
		
		
		//4. ViewResolver를 통해 viewName에 해당하는 화면 검색.
		//viewName에  . do가 포함되지 않았다면 /xx.do로 보내고
		String view=null;
		if(!viewName.contains(".do")) {
			view = viewResolver.getView(viewName);
			//.login.do
		}else {
			//붙어있다면 그대로  view에 담는다.
			view = viewName;
		}
		
		//5.검색된 화면으로 이동
		response.sendRedirect(view);
		//로그인 성공시 getboardlist.do로 실행
		//.do로 호출시 dispatcher로 와서 request로 받아들여 doGet함수로 이동 
	
		
	}
}

💡HandlerMapping

package com.springbook.view.controller;

import java.util.HashMap;
import java.util.Map;

import com.springbook.view.board.DeleteBoardController;
import com.springbook.view.board.GetBoardController;
import com.springbook.view.board.GetBoardListController;
import com.springbook.view.board.InsertBoardController;
import com.springbook.view.board.UpdateBoardController;
import com.springbook.view.user.LoginController;
import com.springbook.view.user.LogoutController;

public class HandlerMapping {
	private Map<String, Controller> mappings;
	
	public HandlerMapping() {
		mappings = new HashMap<String,Controller>();
		mappings.put("/login.do", new LoginController());
		mappings.put("/getBoardList.do", new GetBoardListController());
		mappings.put("/getBoard.do", new GetBoardController());
		mappings.put("/insertBoard.do", new InsertBoardController());
		mappings.put("/updateBoard.do",new UpdateBoardController());
		mappings.put("/deleteBoard.do",new DeleteBoardController());
		mappings.put("/logout.do", new LogoutController());
		
		//ex) {login.do : LoginController} ...
	}
	
	public Controller getController(String path) {
		return mappings.get(path);
		
		//ex) login.do가 path로 들어오게 되면 handlerMapping의 path에 맞는 controller를 가져와서 리턴해준다.
	}

}

💡ViewResolver

package com.springbook.view.controller;

public class ViewResolver {
	public String prefix;
	public String suffix;
	
	public void setPrefix(String prefix) {
		this.prefix=prefix;
	}
	
	public void setSuffix(String suffix) {
		this.suffix= suffix;
	}
	
	public String getView(String viewName) {
		return prefix + viewName + suffix;
		//prefix : "./" , suffix : ".do" 
        //들어온 viewName을 ./viewName.do 으로 만들어준다.
	}

}

💡Controller

package com.springbook.view.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

public interface Controller {
	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);

}

참고 : Spring Quick Start

profile
👩‍💻✨junior developer

0개의 댓글