[JAVA/Spring] 07. MVC 패턴 (추가 예정)
MVC 패턴이 나오게 된 배경
- 기존에 Servlet과 JSP으로 개발할 당시, Servlet으로 개발할 때는 뷰(View)화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡하고, JSP로 개발할 때는 절반은 비지니스 로직이고, 나머지 절반은 HTML로 보여주기 위한 뷰 영역이었다.
- 이후에 MVC Model 1이 적용되면서 서블릿이나 JSP로 처리하던 것을 서블릿을 컨트롤러로 사용하고, JSP를 뷰로 사용해서 컨트롤러 / 뷰 라는 영역으로 역할을 나누었다.
- 그러나, MVC Model 1은 컨트롤러에 비지니스 로직을 두었지만 이렇게 되면 컨트롤러가 너무 많은 역할을 담당하게 되었고, 몇 가지 단점들도 존재하게 되었다.
1. MVC Model 1의 단점1 - ViewPath와 포워드 중복
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response)
2. MVC Model 1의 단점2 - 사용하지 않는 코드
다음 코드들을 사용할 때도 있고, 사용하지 않을 때도 있다.
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
즉, 공통 처리의 어려움이 존재하게 되고, 이 문제를 해결하려면 컨트롤러 호출 전에 공통 기능을 처리해야 하는 무언가가 필요하다.
그래서 이 공통 기능에 대한 처리를 하나로 두는 “프론트 컨트롤러(Front Controller)패턴”을 적용시킨 지금의 MVC 패턴이 등장하게 되었다.
스프링 MVC 구조
프론트 컨트롤러(FrontController)의 특징은 다음과 같다.
- 프론트 컨트롤러 하나로 클라이언트의 요청들을 받고, 요청에 맞는 컨트롤러를 찾아 호출한다. 즉, 요청을 처리하는 입구가 하나가 되기 때문에 공통 처리가 가능하게 된다.
- 프론트 컨트롤러가 서블릿 요청을 전부 다 받기 때문에 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.
- 스프링 웹 MVC의 DispacherServlet이 FrontController패턴으로 구현되어 있다.
그래서 기존에 가지던 문제점들을 보완하여 나온 것이 MVC Model 2 패턴이고, 이 패턴이 스프링 웹 MVC에 적용되어 있다.
아래 이미지가 스프링 MVC 프레임워크의 구조이다.
Dispatcher Servlet이 추가되고, Adapter 패턴이 적용됨으로써 Dispatcher Servlet이 다양한 방식의 핸들러(Controller)를 처리할 수 있게 되었다.
스프링 MVC 프레임워크의 동작 순서는 다음과 같다.
- 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회해서
- 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 찾고,
- 핸들러 어댑터 실행: 핸들러 어댑터를 실행시켜서
- 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행(호출)한다.
- ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
- viewResolver 호출: 뷰 리졸버를 찾고 실행한다. (JSP의 경우: InternalResourceViewResolver 가 자동으로 등록되고, 사용된다.)
- View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.
- 뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다.
MVC 프레임워크로는 Java의 Spring, php의 Laravel, python의 Django, Ruby의 Ruby on Rails, 함수형 언어 Scala의 Play등이 존재한다.
특이하게 몇몇 프레임워크에서는 MVC라고 안하고, MTV(T,Template)라고 한다.
https://youngminieo1005.tistory.com/m/84
[알쓸 IT] MVC 웹 프레임워크
📢 개요 네이버 같은 딱봐도 복잡한 웹사이트는, 요소와 기능들이 많아지고, 구조가 이것저것 얽혀있다는 것이 느껴집니다. 뭔가 거대해지고 복잡해질수록, 특정 기준으로 분리,모듈화해서 접
youngminieo1005.tistory.com
결론적으로 MVC 패턴을 사용하게 될 경우 다음과 같은 이점을 가질 수 있다.
- 동시다발적으로 개발할 수 있다.
- 백엔드와 프론트엔드가 독립적으로 개발할 수 있다. 백엔드는 또 세부적으로 독립적으로 개발할 수 있게 된다.
- 책임 영역이 구분되기에(모델, 뷰, 컨트롤러) 높은 응집도를 가지게 된다.
추가로 참고할만한 사이트
https://velog.io/@ljinsk3/MVC-패턴
MVC 패턴
모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여
velog.io
우아한 테크 -MVC 패턴 리뷰- [레이어, MVC 패턴, 5레이어]
우아한 테크 -MVC 패턴 리뷰- [레이어, MVC 패턴, 5레이어]
발표자료들 범블비(2020) : MVC 패턴에 대한 설명 + MVC 패턴의 역사 제리(2021) : MVC 패턴의 활용성에 대한 원칙 해리&션(2019) : MVC의 Model, Controller, View에 대한 소개. 제이임(2019)의 MVC 패턴 : 미션과 관
murphymoon.tistory.com
*참고*
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com