본문 바로가기
웹 개발 언어/Spring+eGovFrame

MVC 패턴 Model3 으로 프로젝트 구조 만들기 - FrontController 부분

by 0725 2022. 4. 22.

MVC Model3의 기본구조이다.

 

 

 

MVC3 프로젝트에 위와 같은 파일을 생성해준다.

 

 


FrontController 패키지에 있는 것부터 코드를 입력해보자

 

▶ViewResolver

package kr.board.frontcontroller;

public class ViewResolver {

	public static String makeView(String viewname) {
		return "WEB-INF/views/"+viewname+".jsp";
	}
}

다른 파일에서 ViewResolver라는 메소드를 선언하지않아도 바로 사용할 수 있도록

static을 지정해준 makeView라는 메소드를 만든다.

이 메소드는 어떤 jsp파일로 갈지에 대한 이름만 String형식인 매개변수로 지정하면,

jsp파일로 가는 경로를 리턴한다.

 

 


▶HandlerMapping

package kr.board.frontcontroller;

import java.util.HashMap;

import kr.board.controller.BoardInsertController;
import kr.board.controller.BoardListController;
import kr.board.controller.Controller;

public class HandlerMapping {
	private HashMap<String, Controller> mappings;
	public HandlerMapping() {
		mappings = new HashMap<String, Controller>();
		mappings.put("/boardList.do", new BoardListController());
		mappings.put("/boardInsert.do", new BoardInsertController());
	}
	
	public Controller getController(String reqURL) {
		return mappings.get(reqURL);
	}
}

HandlerMapping은 Frontcontroller에서 요청이 오면 어떤 Controller로 이동할지 알려주는 역할을 한다.

Frontcontroller에서 온 요청을 검색하면 원하는 Controller값이 나와야 한다는 의미이다.

이 검색 작업을 빠르게 할 수 있도록 하는 형태가 HashMap이다.

mappings라는 Hashmap을 선언해준다.

 

HandlerMapping이라는 메소드에는

어떤 Key(String)에 어떤 Value(Controller)가 있는지를 mapping이라는 HashMap에 넣는다.

 

getController라는 메소드에는 받은 String을 해당하는 Controller를 리턴한다.

 

 


FrontController

 

FrontColtroller는 클라이언트가 요청을 했을때, 어떤 경로로 이동해야하는지를 봐야하는 만큼,

getRequestURI()이라는 메소드가 어떤 역할을 하는지부터 살펴보았다.

getRequestURI()는 클라이언트가 요청한 정보를 가져오는 메소드이다.

 

/web/boardList.do라는 결과값을 출력한다.

 

 

package kr.board.frontcontroller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.controller.Controller;

@WebServlet("*.do")
public class BoardFrontController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// 1. *.do : 클라이언트의 요청을 분석하는 일
		// 클라이언트가 요청한 정보를 가져오는 메소드
		String reqUrl = request.getRequestURI();
		System.out.println(reqUrl);
		
		// /web 출력
		String ctx = request.getContextPath();
		System.out.println(ctx);
		
		// /boardList.do 출력
		String command = reqUrl.substring(ctx.length()); 
		System.out.println(command);
		
		// 2. HandlerMapping에게 POJO를 리턴받는다
		HandlerMapping mappings = new HandlerMapping();
		Controller controller = mappings.getController(command);
		
		// 3. Controller(POJO)에게 일을 시킨다
		String nextView = controller.requestHandler(request, response);
		
		// 4. JSP -> forward / POJO -> redirect 결정
		// nextView == boardList or redirect:/boardList.do
		if(nextView!=null) {
			// :/라는 문자를 포함하고 있을 때
			if(nextView.indexOf(":/")!=-1) {
				//nextView라는 문자열을 :/이라는 문자를 기준으로 나누고 ;/의 뒤에있는 문자만 가져온다
				response.sendRedirect(nextView.split(":/")[1]);
				
			// :/라는 문자를 포함하고 있지 않을 때
			}else {
				RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.makeView(nextView));
				rd.forward(request, response);
			}
		}
	}

}

 

 

- String.substring(start) : 문자열 start 위치부터 끝까지 문자열 가져오기

- indexOf() : 값을 찾고 없으면 -1, 있으면 index를 반환

 

 

만약 들어온 요청이 Controller로 보내져야해서 :/이라는 문자를 포함하고있다면 

sendRedirect를 통해 :/뒤에 명시된  Controller로 보내준다

ex)  redirect:/boardList.do라는 요청일때, response.sendRedirect(boardList.do);

 

포함하고있지 않다면 ViewResolver를 통해 jsp로 가는 경로를 지정해주고 forward 해준다.

ex)  boardList일 때, WEB-INF/views/boardList.jsp

댓글