╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Spring Boot

[Spring Boot] Spring MVC Architecture 개념

재안안 2022. 7. 14. 05:59

Spring MVC Architencure란?

Spring에서 제공하는 web module로 

Spring MVC Architecture는 Front Controller Design Pattern을 토대로 MVC Design Pattern을 반영하여 만들어졌다.

 

Front Controller Design Pattern이란?

HttpServlet을 상속한 Front Controller가 웹 어플리케이션에서 모든 요청을 담당하는 구조를 말한다.

 

MVC Design Pattern이란?

웹 어플리케이션의 구현을 3개의 레이어로 나눈 구조를 뜻한다.

웹 어플리케이션의 응답에있어서 구조를 Model, View, Controller로 나누어서 구현 및 관리 하는 것이다.

 

하나의 Servlet이 모든 request를 담당하고 model, view, controller가 명확하게 구분되어 있는 것이  Spring MVC Architecture이다.

 

Spring MVC Architecture

 

이미지 출처: https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:spring_mvc_architecture

 

이해를 위해 Client로 부터 요청이 들어왔을 때 어떤 일이 발생하는지 흐름을 먼저 알아보겠다.

만약 Client가 페이지를 로드하기 위해 Get요청을 하였다고 가정하자. (간단한 접속)

 

페이지 로드를 위한 Get request가 들어오면 response를 만드는 과정 

 

1. Client로 부터 어떠한 url로 Http Request가 들어온다.

 

2. Dispatcher Servlet가 Handler Mapping으로 부터 해당 url이 유효한지 확인하고

    유효하다면 HandlerMapping은 해당 url에 mapping되는

    메소드를 갖고있는 Controller의 경로를 반환한다.

    (url과 mapping된 class)

 

3. Dispatcher Servlet은 반환된 Controller의 경로로 찾아가서

    Controller 내부의 해당 메소드를 호출한다.

 

4. 메소드가 호출되면 Dispatcher Servlet은 메소드의 반환 값(view name : "index")을

    받아서 View Resolver에게 넘겨준다.

    이때 사실 Controller는 ModelAndView라는 객체를 넘겨준다.

    그냥 데이터와 view경로를 wrapping하는 객체이다.

    지금 요청은 간단한 페이지 로딩이니 특별한 데이터(Model)은 필요 없다고 가정한다.

 

5. View Resolver는 미리 갖고있던 prefix와 suffix를 사용해

    완성된 View 파일의 경로를 다시 Dispatcher Servlet에게 넘겨준다.

    (prefix + viewName + suffix == "templates/index.html")

 

6. Dispatcher Servlet은 완성된 View 파일의 경로를 통해

    View에서 파일을 불러온 후 forward해 준다.

 

7. Client는 요청에 대한 응답으로 html 파일을 받아와서 페이지가 로드된다.

 

 

지금까지 서버로 Get요청이 들어오면 어떤 일이 일어나는지 알아보았다.

이제는 각각의 박스가 무엇인지를 알아볼 것이다.

 

 

Dispatcher Servlet

Spring MVC Architecture에서 Dispatcher Servlet이 모든 요청을 담당한다. (Get, Post)

그런데 이때 Dispatcher Servlet은 요청을 담당'만'한다.

 

위에서 본거와 같이 요청에 대한 로직 수행은 MVC가 한다.

MVC에게 요청을 전달하고 MVC가 로직을 수행한 결과를 가지고 response를 하는 것이다.

 

그리고 Dispatcher Servlet는 HttpServlet을 상속 받는다.

그래서 마지막에 forawrd를 해줄 수 있는 것이다. (JSP의 경우)

 

 

HandlerMapping

HandlerMapping은 Dispatcher가 전달해준 request의 url과 mapping되는 handler를 선택하는 역할을 한다.

HandlerMapping은 url과 mapping되는 Controller의 정보를 저장하는 테이블을 갖고있는데

이 테이블을 통해 url이 유효한지, 유효하다면 어떤 클래스 또는 메소드를 호출해야 하는지 알려준다.

 

 

Controller

Controller가 데이터를 다루는 비즈니스 로직을 수행한다. (Business Layer)

요청에 대한 데이터를 받아 들이고 도메인(DB)에 접근하여 데이터를 가져오기도 한다.

요청에 따라 데이터(ex: JSON)를 반환하기도 하고 view의 경로(String)을 반환하기도 한다.

이때 파일 경로는 완전하지 않다. String만 반환한다. ex) "index"

 

 

Controller는 요청 작업 처리후 ModelAndView 객체를 반환하는데 ModelAndView는

데이터(JSON)와 파일경로(String)를 모두 담는 객체이다.

 

 

View Resolver

View Resolver는 Controller가 반환한 view name을 완전한 경로로 만들어 준다.

JSP를 공부할 때 보았듯이 forward 하려면 파일의 완전 경로가 필요하다.

완전 경로는 "root경로/index.html"과 같은 형식으로 되어있다.

그런데 이때 Controller는 "index"만 반환한다. (viewName을 반환했다면)

 

View Resolver가 갖고있는 prefix와 suffix를 사용해 Controller가 반환한 String을 완전한 파일 경로로 만들어 준다.

해당 예제에서는 prefix는 "templates/" suffix는 ".html"이다.

말그대로 prefix + viewName + suffix의 반환 값을 Dispatcher Servlet에게 전달 하는 것이다.

 

이때 만약 Controller가 viewName을 반환한 것이 아니라면 Dispatcher Servlet은 애초에 View Resolver를 찾지 않는다.

 

 

View

Client에게 제공하는 UI이다. (Presentation Layer)

HTML, JSP와 같은 Client에게 render 또는 foward할 문서들을 말한다.

 

Thymleaf, Groovy, Freemarker 등 여러 Template Engine이 있다.

프로젝트에서 templates가 View의 root 폴더이다.

 

 

Domain

이외에도 Domain Layer는

Controller -> Service -> DAO -> Domain으로 접근한다.