티스토리 뷰
반응형
Spring MVC?
- Model / View / Controller로 역할을 나누는 패턴이다.
- MVC 패턴의 목적은 Business Logic과 Presentation Logic을 분리하는 것이다.
- Business Logic : 어떤 특정한 값을 얻기 위해 데이터 처리를 수행하는 응용프로그램의 일부 (즉, 원하는 값을 얻기 위해 백엔드에서 일어나는 각종 처리)
- Presentation Logic : 화면상의 디자인 구성을 위한 처리 (즉, 화면을 보여주기 위한 처리)
- 역할 별로 코드를 분리하여 하나의 파일에 코드가 모이는 것을 방지하기 때문에, 가독성과 코드 재사용이 증가한다.
- 단점으로 View와 Model 사이의 높은 의존성 때문에 애플리케이션이 커질수록 복잡해지고 유지보수가 어렵다.
Model
- Controller에서 View로 전달되는 데이터 객체이다.
- Key-Value 형태를 가지며, 하나의 (Key-Value) 객체를 Model Attribute라고 한다.
Controller
- View와 Model 사이의 인터페이스 역할을 수행한다.
- Request에 따라 적절한 결과를 Model에 담아 View에 전달한다.
- 즉, View Name과 View에 출력할 Model을 반환한다.
View
- Model 데이터의 렌더링을 담당하며, HTML Output을 생성한다.
- 여러가지 템플릿 엔진이 존재한다. (ex. JSP, Thymleaf, Freemarker, ...)
Spring MVC의 흐름
- Client 요청 (Request) 이 들어오면 Filter를 거치고, Dispatcher Servlet으로 온다.
- Dispatcher Servlet은 받은 요청을 Handler Mapping에게 전달하고, Handler Mapping은 요청 URL을 분석하여 적절한 Controller 정보를 찾아 Dispatcher Servlet에게 반환한다.
- 적절한 Controller 정보를 받은 Dispatcher Servlet은 Handler Adapter를 호출하고, 전달 받은 Controller 중 요청한 URL에 맞는 적절한 Method를 찾아준다.
- 호출된 Controller는 Business Logic을 처리하고 나온 결과를 View에 전달할 수 있도록 Model 객체에 저장한다.
- 그 후, 호출된 Controller는 Dispatcher Servlet에게 View Name을 반환한다.
- Dispatcher Servlet은 View Resolver를 호출하여 View Name을 전달하고, View Resolver는 View Name을 바탕으로 적절한 View 객체를 결정한다.
- View 객체는 적절한 View (ex. JSP, Thymeleaf) 를 호출하고, View는 화면 표시에 필요한 데이터를 Model 객체에서 가져와 화면 표시를 처리한다.
- 렌더링된 View 화면을 Client에게 Response 한다.
구성 요소
Dispatcher Servlet
- Spring Framework가 제공하는 Servlet 클래스로, Front Controller를 담당하고 있어 모든 HTTP 요청을 받는다.
Handler Mapping
- Request URL에 해당하는 Controller 정보를 저장하는 테이블을 가진다.
- 테이블에 저장된 정보에 따라 Request를 처리할 Method에 매핑한다.
ViewResolver
- Controller가 반환한 View Name을 바탕으로 적절한 View 객체 (Physical View Files) 를 반환한다.
- 예를 들면 아래와 같다.
- View Name: home
- Prefix: /WEB-INF/views/
- Suffix: .jsp
- 즉, "/WEB-INF/views/home.jsp" 위치의 View(JSP) 에 Controller에서 받은 Model을 전달하고, 해당 View에서 Model 데이터를 이용하여 적절한 페이지를 만들고 Client에게 보여준다.
Reference
- https://aridom.tistory.com/61
- https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=semi7623&logNo=100005637337
- https://joont92.github.io/spring/DispatcherServlet-Flow/
- https://gmlwjd9405.github.io/2018/12/20/spring-mvc-framework.html
반응형
'Spring' 카테고리의 다른 글
스프링의 읽기 전용 조회시 성능 향상 (스칼라 타입, org.hibernate.readOnly, @Transactional(readOnly = true)) (0) | 2021.08.13 |
---|---|
스프링 의존성 주입 방식 종류와 차이 (1) | 2021.08.08 |
Spring Boot + ELK 를 이용한 로그 수집 (0) | 2021.02.07 |
댓글