1) main.jsp
main.jsp에서 뷰와 컨트롤러의 역할을 전부 수행
<%
if(요청 메서드가 post일때){
vo에 사용자가 form에 작성한 데이터를 매핑해서 setter 하는 코드;
}
DB와 연동할 수 있는 코드;
%>
<form>
</form>
2) main.jsp + ctrl.jsp
.jsp 컨트롤러 파일로 뷰의 요청 수행
<form action="ctrl.jsp?action=insert">
</form>
<jsp:useBean vo>
<jsp:setProperty vo>
<%
if(요청한 기능이 ㅁㅁㅁ일때){
DB와 연동할 수 있는 코드;
}
%>
3) main.jsp + FrontController.java(서블릿) => MVC2
서블릿 컨테이너에게(==톰캣, 웹서버) *.do 요청에 대해서 FrontController 서블릿으로 올 수 있도록 매핑 설정을 함
-> web.xml or @WebServlet("*.do")
<form action="insert.do">
</form>
4) 3번의 MVC2의 과정을 스프링으로 구현
FrontController 역할을 하는 서블릿을 DispatcherServlet이라 한다.
DS는 Action 역할을 수행하는 Controller 들을 호출해서 사용자의 요청을 처리 하지만
자신이 직접 C들을 호출하지 않고, HandlerMappinmg을 통해서 호출한다.
C의 수행 결과로 다음 View의 경로를 반환(ActionFoward)하는데,
이 경로정보는 ViewResolver(어떻게 가야 하는지를 잘 처리해 줄 수 있는 객체)에게 전달되어
사용자에게 View 화면을 제공한다.
HM: 의존관계로 존재한다. - mappings
mappings에 생성자 주입 방식으로 DI(의존성 주입)을 한다.
HandlerMapping 예시
package com.kim.biz.controller;
import java.util.HashMap;
import java.util.Map;
public class HandlerMapping { // 싱글톤 패턴이 유지됨 (객체의 무분별한 생성을 막을 수 있음)
// input: 어떤 요청에 대해 == String
// output: 무슨 Controller 객체를 제공해야하는지 == Controller
private Map<String,Controller> mappings; // 의존관계 -> DI => 생성자 주입
public HandlerMapping() {
mappings=new HashMap<String,Controller>();
mappings.put("/login.do", new LoginController());
mappings.put("/main.do", new MainController());
mappings.put("/mypage.do", new MypageController());
mappings.put("/signin.do", new SigninController());
mappings.put("/logout.do", new LogoutController());
mappings.put("/update.do", new UpdateController());
}
public Controller getController(String command) {
return mappings.get(command);
}
}
ViewResolver 예시
package com.kim.biz.controller;
public class ViewResolver {
public String prefix; // 의존관계 -> DI => setter 주입
public String suffix; // 의존관계 -> DI => setter 주입
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public String getView(String viewName) {
return prefix+viewName+suffix;
}
}
DispatcherServlet 예시
package com.kim.biz.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DispatcherServlet
*/
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 의존관계
private HandlerMapping handlerMapping;
private ViewResolver viewResolver;
// init() 통해서 DI
public void init() throws ServletException{
handlerMapping = new HandlerMapping();
viewResolver = new ViewResolver();
viewResolver.setPrefix("./");
viewResolver.setSuffix(".jsp");
}
public DispatcherServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doAction(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doAction(request,response);
}
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String command=request.getRequestURI();
command=command.substring(command.lastIndexOf("/"));
System.out.println(command);
Controller ctrl = handlerMapping.getController(command);
String viewName = ctrl.handleRequest(request, response);
String view = null;
System.out.println(viewName);
if(viewName.contains(".do")) {
view = viewName;
}
else {
view = viewResolver.getView(viewName);
}
response.sendRedirect(view);
}
}
요청 순서
사용자의 요청 --> *.do --> DS -> HM -> C 호출 -> 경로정보를 반환 -> VR -> 사용자에게 화면을 제공
스프링 사용 장점
1) 메모리를 불필요하게 사용하던 객체들이 현저히 줄어든다.
2) 하드코딩이 줄어들고(코드의 불필요한 반복 패턴이 줄어듦) 코드가 간결해진다.
3) 결합도가 낮아지고 응집도가 높아진다 => 유지보수 용이
'Spring' 카테고리의 다른 글
| Spring MVC2 .xml 설정 어노테이션으로 변경 (0) | 2022.09.22 |
|---|---|
| Spring MVC2 DispatcherServlet.xml 설정 (0) | 2022.09.21 |
| 스프링 JDBC 설정 (0) | 2022.09.19 |
| [AOP] .xml 설정을 @(어노테이션)으로 변경하는법 (0) | 2022.09.18 |
| [AOP] JoinPoint와 바인드 변수 (0) | 2022.09.17 |