programming/Spring & WEB

Spring) Spring MVC 동작 구조

코딩하는 핑가 2021. 10. 6. 10:36
반응형

* https://iri-kang.tistory.com/4 , https://junu0516.tistory.com/92를 참고하여 재작성했음을 밝힙니다.

* Spring MVC 동작에 대한 설명입니다.

* 오탈자 및 잘못된 정보는 댓글로 알려주시기 바랍니다.

* 본 포스팅을 무단 복제하시거나 배포하지 마시기 바랍니다.

( 게시글 최상단에 본 블로그 출처를 밝히시면 포스팅은 가능합니다. )


1. MVC 란

MVC는 Model-View-Controller의 약자이며, 어플리케이션을 구성하는 요소를 역할에 따라 세 가지 모듈로 나누어 구분한 패턴이다.

 

1. Model(모델)

 

어플리케이션의 데이터이며, 모든 데이터 정보를 가공하여 가지고 있는 컴포넌트이다.

 

- 사용자가 이용하려는 모든 데이터를 가지고 있어야하며, View(뷰) 또는 Controller(컨트롤러)에 대해 어떠한 정보도 알 수 없어야 한다.

- 변경이 일어나면 처리 방법을 구현해야한다.

 

2. View(뷰)

 

시각적인 UI 요소를 지칭하는 용어이다.

 

- Model(모델)이 가지고 있는 데이터를 저장하면 안된다.

- Model(모델)이나 Controller(컨트롤러)에 대한 정보를 알면 안되며 단순히 표시를 해주는 역할을 가지고 있다.

- 변경이 일어나면 처리 방법을 구현해야한다.

 

3. Controller(컨트롤러)

 

Model(모델)과 View(뷰)를 연결해주는 역할을 한다.

 

- Model(모델) 또는 View(뷰)에 대한 정보를 알아야한다.

- Model(모델) 또는 View(뷰)의 변경을 인지하여 대처를 해야한다.

 

2. MVC1 

우리가 흔히 사용하고 있는 MVC 패턴은 사실 MVC1, MVC2 아키텍쳐에서 발전된 패턴이다.

MVC1 패턴이란,

브라우저(사용자)로부터 요청이 들어오면 DB로부터 필요한 데이터를 받은 Model 객체(Java Bean)를 JSP 페이지(View)에 담아 응답으로 보내는 패턴이다.

출처 : https://junu0516.tistory.com/92

위의 구조를 봤을 대 JSP가 View와 Controller 역할을 모두 담당하기 때문에 JSP Page내에 너무 많은 코드가 들어가 가독성도 떨어질 뿐만 아니라 복잡해질 가능성이 생긴다.

이러한 점은 보완해 Controller 역할을 하는 servlet(서블릿)이 추가된 MVC2 패턴이 나오게 됐다.

 

2. MVC2 

출처 : https://junu0516.tistory.com/92
MVC2 패턴의 서블릿은 요청에 대한 비즈니스 로직을 처리한 후, 이를 JSP 파일에 반영하는 역할을 수행한다.

 

3. Spring MVC

출처 : https://junu0516.tistory.com/92
spring framework에서 MVC2 모델을 좀 더 발전시켜 Spring MVC가 나왔으며 이는 MVC2 모델이 기반인 웹 모듈이다.

 

위 사진의 구조와 역할을 간단히 살펴보면,프론트 컨트롤러(Front Controller)가 우선적으로 클라이언트로부터 모든 요청을 받게 되며, 실제 요청의 처리는 개별 컨트롤러 클래스로 위임을 한다.( 일종의 중앙처리장치와 같은 것으로 요청이 들어오면 WAS가 개별 서블릿에 해당 요청에 대한 처리를 위임하는 논리와 비슷하다 )

 

개별 컨트롤러 클래스는 핸들러(Handler)라고도 하며, DI를 통해 생성해둔 Bean을 통해 비즈니스 로직 처리 결과를 Model에 담아 다시 프론트 컨트롤러로 보낸다. 프론트 컨트롤러는 받은 Model을 알맞은 View 템플릿으로 전달하여 받영시키고, 최종적으로 클라이언트로 보낼 화면을 응답 결과로 전송하는 것이다.

 

4. Spring MVC 실제 동작 구조

https://junu0516.tistory.com/92

* DispatcherServlet

출처 : https://junu0516.tistory.com/92
- 사용자의 모든 요청을 받아 처리한다. - 프론트 컨트롤러에 해당하는 역할을 수행하며 Request를 각각의 Controller에게 위임한다.- DispatcherServlet을 Front Controller로 가능하도록 설정하기 위해서는 이를 web.xml에 명시하거나 org.springframework.web.WebApplicationnlnitializer 인터페이스를 구현하는 두 가지 방식을 사용할 수 있다.
eGov web.xml

* HandlerMapping

- 요청을 직접 처리할 컨트롤러를 탐색한다.- 구체적인 mapping은 xml파일이나 java config 관련 어노테이션 등을 통해 처리할 수 있다.

 

* HandlerAdapter

- 매핑된 컨트롤러의 실행을 요청한다.

 

* Controller

- 직접 요청을 처리하며, 처리 결과를 반환한다.- 여기서 결과가 반환되면 HandlerAdapter가 ModelAndView 객체로 변환되며, 여기에는 View Name과 같이 응답을 통해 보여줄 View에 대한 정보와 관련된 데이터가 포함되어 있다.

 

* View Resolver

- View Name을 확인한 후, 실제 컨트롤러로부터 받은 로직 처리 결과를 반영할 View 파일(jsp)을 탐색한다.

 

* View

- 로직 처리 결과를 반영한 최종 화면을 생성한다.

 

4. MVC 패턴 동작 순서

1. 클라이언트가 서버에 요청을 하면, front controller인 DispatcherServlet 클래스가 요청을 받는다.

2. DispatcherServlet은 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 메핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리할 메소드로 이동한다.

3. 컨트롤러는 해당 요청을 처리한 Service(서비스)를 받아 비즈니스 로직을 서비스에게 위임한다.

4. Service(서비스)는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야한다면 DAO에 요청하여 처리를 위임한다.

5. DAO는 DB정보를 DTO를 통해 받아 서비스에게 전달한다.

6. 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.

7. 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View(뷰) 정보를 담아 DispatcherServlet에게 전송한다.

8. DispatcherServlet은 ViewResolver에게 전달받은 View 정보를 전달한다.

9. ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.

10. DispatcherServlet은 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.

11. DispatcherServlet은 클라이언트에게 Rending된 뷰를 응답하며 요청을 마친다.

반응형