영보의 SystemOut.log

[Spring] Spring MVC구조 / MVC 패턴 본문

Spring

[Spring] Spring MVC구조 / MVC 패턴

영보로그 2020. 10. 8. 17:37
반응형

# MVC : Model View Controller

 - M(Model) : 비지니스 영역의 상태 정보를 처리한다

        일반 자바  데이터 읽기 사용자 요청처리

 - V(View) : 비지니스 영여에 대한 프레젠테이션 뷰를 담당한다

        Controller로 부터 결과값을 전송 받아서  화면에 출력  JSP'

 - C(Controller) : 사용자의 입력 및 흐름제어를 담당한다.

        사용자 요청 → Model을 연결해서 데이터를 가지고 온다  JSP로 전송 (스프링에서 지원)  JSP/Sevlet == Servlet(화면출력(x),연결,보안)

 

 

 

# MVC 패턴

  - Controller → Model Controller → View 

  - Spring이 Controller가 하는 일을 분산시켜준다.

 

 

# Spring

- 클래스를 묶어서 관리해줌 (인터페이스 기반)

- 하나로 묶어줌 - 연결해줌 → 인터페이스가 해주는 역할 : 관련된 여러개의 클래스를 통합해줌

 

 

# Controller가 하는 일

 - 컨트롤러가 무너지면 MVC구조가 다 무너기 때문에 한번 만들어 놓으면 고정시켜야됨

     => DAO랑 JSP만 만들면 되기 때문에 결합도 낮아지고 응집도 높아짐

※ 좋은 프로그램은 응집도가 높고, 결합도는 낮은 프로그램

 

 

 

# Controller.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.sist.controller;
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// XML => Annotation
import java.util.*;
import com.sist.model.*;
 
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;
    /*
     *     매칭 => ListModel == list.jsp (list.jsp)
     *           DetailModel == detail.jsp(detail.jsp)
     * 
     *  클라이언트 ==============>
     *           요청(request)
     */
    private Map clsMap=new HashMap();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 요청을 받는다 ==> list, detail
        // 2. http://localhost/OnLineStudy15_MVC(list).do
        // 3. http://localhost/OnLineStudy15_MVC(detial).do
        // 4. http://localhost/OnLineStudy15_MVC(Controller?com=list
        String cmd=request.getRequestURI(); //OnLineStudy15_MVC/(list).do
        // URI ==> /OnLineStudy15_MVC/list.do(?page=2) => request에 따로 저장
        System.out.println(cmd);
        cmd=cmd.substring(request.getContextPath().length()+1);
        // request.getContextPath():/OnLineStudy15_MVC/
        // 사용자가 요청한 요청내용 확인
        // 클래스를 찾기 시작
        Model model=(Model)clsMap.get(cmd);
        // 요청처리 ==> 메소드
        String jsp=model.handlerRequest(request);
        // 결과 값을 받은 request ==> jsp로 전송
        RequestDispatcher rd=request.getRequestDispatcher(jsp);
        rd.forward(request, response);
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
        clsMap.put("board/list"new ListModel());
        clsMap.put("detail"new DetailModel());
    }
}
cs

 

# ListModel.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.sist.model;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
public class ListModel implements Model{
    @Override
    public String handlerRequest(HttpServletRequest request) {
        List<String> list=new ArrayList<String>();
        list.add("홍길동");
        list.add("심청이");
        list.add("박문수");
        list.add("춘향이");
        list.add("이순신");
        
        request.setAttribute("list", list);
        return "board/list.jsp";
    }
}
cs

 

# list.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <center>
      <h1>이름목록</h1>
      <c:forEach var="name" items="${list }">
      ${name }<br>
      </c:forEach>
   </center>
</body>
</html>
cs

- Controller 하나 만들고 jsp-model 하나씩 대응시켜서 만들면 유지보수/관리에 용이하다.

반응형