1. MVC 정의
2. MVC Model 1 아키텍쳐
3. MVC Model 2 아키텍쳐
4. MVC Model2 발전 형태 (Spring MVC)
5. Spring MVC 구성요소
- DispatcherServlet 이 동작 순서
- DispatcherServlet에서 사용되는 컴포넌트(객체)
1. MVC 정의
Model-View-Controller의 약자입니다.
- Model : View 가 렌더링 하는데 필요한 데이터(사용자가 요청한 상품목록리스트와 같은 객체) 입니다.
- View : Model에서 받아온 데이터를 랜더링하여 를 출력하며 Jsp, HTML 페이지로 결과 표현합니다.
- Controller : 사용자의 요청을 받아 모델 업데이트 및 뷰에 모델에서 받아온 데이터 넘기는 역할을 합니다.
MVC Model이 자바 웹 프로그래밍에서는 두가지 형태로 변형됩니다.
2. MVC Model 1 아키텍쳐
1. Browser가 요청(Request)을 하게 되면 해당 요청을 JSP page 에서 받으며 요청만큼 jsp페이지가 존재합니다.
2. 요청을 받은 JSP page는 java로 만들어진 클래스인 java bean을 이용해서
3. 데이터베이스를 사용하여 필요한 값을 받아옵니다.
4.이 결과를 화면에 출력합니다.(Response)
(여기서 얘기하는 java bean이라고 하는 것은 Dao)
위와같이 처리했을때 문제점은 jsp 자체에 java 코드와 html 코드가 섞여있어 유지보수가 어렵다는 점입니다. 이를 해결하기 위해 나온것이 mvc model2 아키텍쳐입니다.
3. MVC Model 2 아키텍쳐
1. 브라우저에서 넘어온 요청(Request)은 서블릿이 받고
2. 서블릿이 java bean을 이용해서 db에서 꺼내오고
3.이런 결과들을 jsp를 통해서
4.결과를 화면에 보여줍니다(Response)
Servlet(Controller): 뷰단에서 넘어오는 요청을 받고 데이터를 처리하는 컨트롤러의 역할을 수행.
JSP page(View): 모델의 결과를 보여주게 하는 뷰 역할을 수행.
이렇게 해서 로직(java code)과 뷰(html)를 분리하여 유지보수가 MVC Model 1 보다 쉬워졌습니다.
스프링 프레임워크에서 사용하는 MVC 구조는 MVC Model 2 보다 발전한 형태를 사용합니다.
4. MVC Model2 발전 형태 ( Spring MVC )
1. 클라이언트가 보내는 모든 요청은 프론트 컨트롤러라고 하는 서블릿 클래스가 다 받습니다. 서블릿 클래스는 프론트 컨트롤러 딱 하나만 존재하며 모든 요청을 다 받고 실제 요청에 관련된 작업은 처리하지 않고 컨트롤러에 요청을 위임합니다.
2. 이러한 일을 처리하는 컨트롤러를 컨트롤러 클래스 혹은 핸들러 클래스라고 이야기합니다.
서블릿은 관련된 요청을 처리하게에 불편한 구조를 가지고 있어 이런 단점을 해결하기 위해 모든 요청은 서블릿(프론트 컨트롤러)이 받고 그요청의 실제 처리는 컨트롤러 혹은 핸들러라고 불리는 클래스에 위임하여 관련된 URL을 하나의 클래스에서 다 처리할수 있도록 합니다.
3. 이런 컨트롤러는 자바 빈 등을 이용해 결과물을 만들어내고 만들어진 결과를 모델에 담고 프론트 컨트롤러에게 보내면 프론트 컨트롤러는 알맞은 뷰에게 모델을 전달해 그 결과를 출력합니다.
이런 형태가 Spring framework 모듈 중 하나인 Web 모듈에 구현되어있고, 이러한 web 모듈을 보통 spring mvc 라고 합니다.
5. Spring MVC 의 기본 동작 흐름
스프링 mvc는 MVC Model2 아키텍쳐로 구성되어있습니다.
- 위의 이미지에서 색깔별로 살펴보자면 Database라고 되어있는 부분 제외한 파란색 박스들은 모두 스프링 mvc가 제공해주는 것들이라서 개발자가 구현할 필요가 없습니다.
- 보라색 박스들은 개발자가 만들어야 하는 부분입니다.
- 녹색 박스들인 view 는 스프링이 제공해주는 부분고 있고 개발자가 만들어야 되는 부분도 같이 존재합니다.
1. 클라이언트가 요청(Request)을 보내면 DispatcherServlet이라고 하는 서블릿 클래스가 모든 요청을 받습니다.
2. Dispatcher Servlet 은 요청을 처리해줄 컨트롤러와 메서드가 무엇인지 Handler Mapping 에게 물어봅니다.
※ Handler Mapping은 요청에 알맞은 컨트롤러와 메서드가 무엇인지 어떻게 알려줄까?
: 어떤 요청에 어떤 컨트롤러가 동작할지 xml 파일이나 java 파일에 어노테이션으로 설정을 하게 되면 웹 어플리케이션 실행시 handler mapping 객체들이 관리를 한다. 명시적으로 알려주는 파일들이 어노테이션 작성한 java 파일이거나 xml 설정 파일이다. DispatcherServlet 은 그렇게 handler mapping으로부터 지금 들어온 요청에 알맞은 컨트롤러가 무엇인지 해당되는 메서드는 무엇인지에 대한 정보를 알아내게 된다.
3. 위에서 알아낸 정보를 통해 Handler Adapter에게 실행 요청합니다.
4. 실행하기로 결정된 컨트롤러와 해당 메서드가 실행됩니다.
5. 결과를 model에 받아서 DispatcherServlet에게 전달을 하게 되고
6. 이때 DispatcherServlet 은 컨트롤러가 리턴한 view name을 알아내 컨트롤러가 리턴한 view name을 가지고 적절한 view Resolver를 통해서 뷰를 출력하게 됩니다.
7. view Resolver 가 어떤 view 이다는 정보를 정확하게 알려주게 되면 해당 View 로 브라우저에 출력합니다.
Spring MVC 를 이해한다는 것은 DispatcherServlet 이 어떻게 동작하는지를 이해하는것이라고 말할 수 있습니다. DispatcherServlet이 요청을 받아서 결과를 출력하기까지 여러가지 컴포넌트를 사용할건데, DispatcherServlet에서 사용하는 각각의 컴포넌트들을 아래에서 알아보자. 여기까지 이해해도 spring mvc를 간단하게 사용하는데 전혀 문제가 없습니다. 그러나 spring mvc를 좀더 깊이 이해하고 이용해보고 싶다면 아래의 내용도 함께 이해해 주면 좋습니다.
6. Dispatcher Servlet
DispatcherServlet
- 프론트 컨트롤러. 예) 회사 대표번호로 전화걸면 자동응답목소리로 1번 상담원 직접연결, 2번 어느부서 연결.. 이런식으로 요청만 받아 처리를 다른곳으로 넘기는것
- 모든 요청을 다 받아 넘겨주는 것 까지만 동작하며 클라이언트의 모든 요청을 받아서 이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아서 응답 결과를 보여준다.
- 보통 한개만 선언해서 사용한다.
- DispatcherServlet은 여러 컴포넌트들을 이용해 작업을 처리한다.
DispatcherServlet의 내부 동작 흐름
- 이부분은 DispatcherServlet에 내부적으로 이런 코드가 만들어져 있겠구나 라고 생각하면 됩니다.
요청 선처리 작업시 사용된 컴포넌트
컴포넌트명 | 내용 |
org.springframework.web.servlet.LocaleResolver |
|
org.springframework.web.servlet.FlashMapManager |
|
org.springframework.web.context.request.RequestContextHolder |
|
org.springframework.web.multipart.MultipartResolver |
|
요청 전달시 사용된 컴포넌트
컴포넌트명 | 내용 |
org.springframework.web.servlet.HandlerMapping |
|
org.springframework.web.servlet.HandlerExecutionChain |
|
org.springframework.web.servlet.HandlerAdapter |
|
요청 처리시 사용된 컴포넌트
컴포넌트명 | 내용 |
org.springframework.web.servlet.ModelAndView |
|
org.springframework.web.servlet.RequestToViewNameTranslator |
|
예외 처리시 사용된 컴포넌트
org.springframework.web.servlet.handlerexceptionresolver
- 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록한다.
- HandlerExceptionResolver는 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공한다.
뷰 렌더링 과정시 사용된 컴포넌트
org.springframework.web.servlet.ViewResolver
- 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트이다.
- 뷰의 종류에 따라 적절한 뷰 리졸버를 추가로 설정해줄 수 있다.
출처: https://www.edwith.org/boostcourse-web/lecture/16762/