개발..너... 2022. 6. 16. 10:14
MVC1과 MVC2의 차이

           

  Model Controller View
MVC1 a.jsp b.jsp c.jsp
MVC2 a.jsp b.java c.jsp

 

MVC1은 모두 jsp파일로만 이루어지는 반면에 MVC2는 컨트롤러 부분을 java로 빼서 관리한다.

 

 

프론트 컨트롤러

 

프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받는다.

프론트 컨트롤러가 클라이언트의  요청에 맞는 컨트롤러를 찾아 호출해 준다. 

그래서 컨트롤러에 대한 공통 로직에 대한 처리가 가능하며 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.

 

 

 

URI가지고오기

 

*doing.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <a href="do1.do">링크1</a>
    <a href="do2.do">링크2</a>
    <a href="do3.do">링크3</a>
</body>
</html>
cs

 

*DoFrontController.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.koreait.servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("*.do")
public class DoFrontController extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        doProcess(req, resp);
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        doProcess(req, resp);
    }
 
    protected void doProcess(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
        System.out.println("URI: " + req.getRequestURI());
 
        String requestURI = req.getRequestURI();
        String responseURI = null;
        if (requestURI.equals("/frontcontroller/do1.do")) {
 
       
            responseURI = new Do1().execute(req, resp);
            
 
        } else if (requestURI.equals("/frontcontroller/do2.do")) {
 
            req.setAttribute("result""do2으로 요청보내기!");
            req.getRequestDispatcher("do2.jsp").forward(req, resp);
            
          else if (requestURI.equals("/frontcontroller/do3.do")) {
        
            req.setAttribute("result""do3으로 요청보내기!");
            req.getRequestDispatcher("do3.jsp").forward(req, resp);
            
        }
        
        req.getRequestDispatcher(responseURI).forward(req,resp);
    }
}
 
cs

 

*do1.java/ do1.jsp

 

 

point1)

 

 

(" *.do") 를 어노테이션 안에 기입함으로서 모든 .do로 끝나는 href의 링크들은 DoFrontController 로 오게끔 설정한다.

 

 

point2)

 

 

그렇게 do로 끝나는 href들은 모두 doProcess 메서드로 모이게되는데 이때 여러곳에서 온 do들을 파싱하는 기준이 바로 URI이다. URI은 do들이 서로 모두 다름으로 syso으로 URI을 먼저 출력시키고 해당 값을 이에 적절한 if문 안에 넣어 로직을 처리해준다.

 

 

sysi 출력값

 

point3)

 

 

빨간박스와 파란박스는 둘 다 동일한 기능을 하는데도 불구하고 코드가 다르다. 

빨간박스는 업무처리에 대한 부분을 java파일로 넘겨주었고 파란박스는 본인이 가지고 있기 때문이다.

해당 예제는 연습용 예제로 몹시 간단한 로직을 수행한다.

그렇기에 파란박스처럼 코드를 작성해도 큰 문제는 없지만 실무에 나가면 로직이 길어지면서 코드가 지저분해지게된다. 그래서 빨간박스처럼 해당 업무처리 부분을 java파일로 따로 꺼내는것이 정석이다.

그리고 그 java파일이 do1.java파일이다.

 

point4)

 

 

정리하자면 우리는 do1 빨간박스처럼 코딩을 해야한다.

do2와 do3은 아직 모든 코드가 DoFrontController에 들어가있는것인데 초록색과 주황색은 Do2.java/Do3.java파일로 옮긴다. 그럼 빨간박스처럼 Do1()이라는 객체를 만들어서 req와 resp를 불러오며 이 값은 맨 밑의 파란박스에 의해서 가지고 오는 형태이다.