티스토리 뷰

Web/정리글

Spring MVC Architecture 정리

구름뭉치 2021. 7. 27. 00:05

MVC Architecture 정리

MVC architecture란 무엇일까?

  • Model, View, Controller를 분리한 디자인 패턴을 말한다.

Controller

컨트롤러는 데이터와 사용자 인터페이스 요소를 이어주는 중간 다리 역활을 한다. 사용자가 데이터를 수정하는 등 '이벤트'를 처리해야 함을 의미한다.

  • Servlet (service)
  • 요청 객체를 찾는 흐름 : Controller -> Service -> Dao -> DB

[요구사항]

  • 모델이나 뷰에 대해서 알고 있어야 한다.
    • View와 Model 사이의 인터페이스 역활을 한다.
    • 모델과, 뷰는 서로의 존재를 모른체 변경을 외부로 알리고, 수신하는 방법만 알고 있으므로 이를 컨트롤러가 중재해야한다.
    • 컨트롤러는 뷰와 모델에 명령을 보낼 수 있다. (회원 생성 시 DB에 넣고, 화면도 변경되게 함)
  1. 모델이나 뷰의 변경을 모니터링 해야한다.
    • 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성요소에 알려줘야 한다.

Model

Application의 정보, 상태 (Data)를 나타낸다. 또한 이런 데이터, 정보들의 가공을 책임지는 컴포넌트이다.

  • java Beans

[요구사항]

  1. 사용자가 편집하길 원하는 모든 데이터를 갖고 있어야한다. (이 데이터에 변화가 발생하면 통지할 의무가 있다.)
  2. 뷰나 컨트롤러에 어떤 정보도 알지 않아야 한다.
  3. 모델이 관리하는 데이터에 변경이 발생하면 변경 통지에 대해 처리방법을 구현해야한다.
    • 모델상태에 변경이 생기면 뷰, 컨트롤러에 알려야 한다. 이런 통보를 통해서 뷰는 최신 결과를 보여주고 컨트롤러는 변화에 맞춰서 적용가능한 명령을 추가, 제거, 수정할 수 있다.
      (자신이 댓글이 추가하면 댓글을 삭제하거나 수정하는 로직이 추가될 수 있다.)

View

뷰는 사용자가 볼 결과물을 생성하기 위해서 Model로 부터 정보를 얻어오고 이를 기반으로 프레젠테이션을 완성한다.

  • JSP, Thymeleaf 등

JSP와 Servlet을 모두 이용하는 모델 (MVC 모델 2)

참고) MVC 모델 1

- Controller를 구체적으로 구현하지 않고, View와 Model로만 이뤄진 구조이다. JSP가 요청을 받으면 Model 영역을 선택해서 호출하는 구조로 View가 컨트롤러의 역활을 겸업하고 있다고 할 수 있다. 이 JSP가 클라이언트에게 보내줄 UI를 생성하므로 View 역활을 수행한다.

MVC 모델 2구조가 일반적인 MVC패턴 구조이다.

  • 1) Client -> Controller
    • @WebServlet 또는 web.xml의 url-pattern에 해당하는 Servelt으로 부터
  • 2) Controller -> Service
    • 사용자가 입력한 Form Data를 Service에 인자로 넘겨준다.
  • Service
    • DAO와 DB를 거쳐서 결과값을 가져온다.
    • Business Logic을 처리한다. (회원가입, 회원 목록 조회 등)
  • 3) Service -> Controller
    • 결과값을 Bean 객체에 저장한다.
  • Controller
    • Request 객체에 결과값(Bean)을 저장한다.
    • @PostMapping("/items/Book/{itemId}/edit")
      public String updateBookItem(
      		@PathVariable("itemId") Long itemId,
      		@ModelAttribute("form") @Valid BookForm form,
      		BindingResult binding) {
      
      	if (binding.hasErrors()) {
      		return "items/book/updateBookForm";
      	}
      
      	itemService.updateItem(itemId, form.getName(), form.getPrice(), form.getStockQuantity());
      
      	return "redirect:/items";
      }
  • 4) Controller -> View
    • 적절한 JSP 페이지로 전달하고, JSP에서 Bean객체로 부터 원하는 Data를 추출해서 Output을 생성한다.
  • View
    • 적절한 동적인 페이지를 만들어서 반환한다.
  • 5) View -> Client
    • 브라우저에 전달해서 보여준다.

Spring FrameWork가 제공하는 Class

  • DispatcherServlet
    • spring Framework가 제공하는 Servelt 클래스이다
    • 사용자의 요청을 받는다.
    • Dispatcher가 받은 요청은 HandlerMapping으로 넘어간다
     
  • HandlerMapping
    • 사용자의 요청을 처리할 @Controller를 찾는다. (Controller URL Mapping)
    • 요청 URL에 해당하는 Controller 정보를 저장하는 table을 갖고 있어서 맞춰서 반환해준다.
    • 테이블에는 @RequestMapping("/url")을 통해 매핑한다.
    • 	@RequestMapping("/")
      	public String home() {
      		log.info("home controller");
      		return "home";
      	}
  • ViewResolver
    • Controller가 반환한 View이름에 prefix, suffiex를 붙여서 반환해준다. (경로를 포함한 풀네임)
    • 이후 View에서 적절한 페이지를 만들어서 반환해준다.
    • home.html
      
      <!DOCTYPE HTML>
      <html xmlns:th="http://www.thymeleaf.org">
      <head th:replace="fragments/header :: header">
          <title>Groom Book-store</title>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      </head>
      <body>
      <div class="container">
          <div th:replace="fragments/bodyHeader :: bodyHeader" />
          <div class="jumbotron">
              <h1>HELLO</h1>
          </div>
          <div th:replace="fragments/footer :: footer" />
      </div>
      </body>
      </html>
반응형

'Web > 정리글' 카테고리의 다른 글

JPA 정리  (0) 2021.08.04
Servlet 정리  (0) 2021.07.28
DAO, DTO 정리  (0) 2021.07.18
Junit Test 환경  (0) 2021.07.12
Junit5 테스트  (0) 2021.07.12
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday