멈재

[JAVA/Spring] 07. MVC 패턴 (추가 예정) 본문

JAVA & Spring & JPA

[JAVA/Spring] 07. MVC 패턴 (추가 예정)

멈재 2022. 10. 17. 00:06
728x90

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)의 특징은 다음과 같다.

  1. 프론트 컨트롤러 하나로 클라이언트의 요청들을 받고, 요청에 맞는 컨트롤러를 찾아 호출한다. 즉, 요청을 처리하는 입구가 하나가 되기 때문에 공통 처리가 가능하게 된다.
  2. 프론트 컨트롤러가 서블릿 요청을 전부 다 받기 때문에 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.
  3. 스프링 웹 MVC의 DispacherServlet이 FrontController패턴으로 구현되어 있다.

그래서 기존에 가지던 문제점들을 보완하여 나온 것이 MVC Model 2 패턴이고, 이 패턴이 스프링 웹 MVC에 적용되어 있다.

아래 이미지가 스프링 MVC 프레임워크의 구조이다.

Dispatcher Servlet이 추가되고, Adapter 패턴이 적용됨으로써 Dispatcher Servlet이 다양한 방식의 핸들러(Controller)를 처리할 수 있게 되었다.

스프링 MVC 프레임워크의 동작 순서는 다음과 같다.

  1. 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회해서
  2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 찾고,
  3. 핸들러 어댑터 실행: 핸들러 어댑터를 실행시켜서
  4. 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행(호출)한다.
  5. ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  6. viewResolver 호출: 뷰 리졸버를 찾고 실행한다. (JSP의 경우: InternalResourceViewResolver 가 자동으로 등록되고, 사용된다.)
  7. View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.
  8. 뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다.

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

이미지 출처: https://m.blog.naver.com/it-edu/221537311702

결론적으로 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

 


*참고*

https://inf.run/Mgnc

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com