05AM

[Spring] MVC 패턴 본문

1 week 1 conquer/Spring

[Spring] MVC 패턴

_05AM 2023. 4. 20. 21:36

MVC (Model-View-Controller)

사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다.
소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있다. 이러한 "관심사 분리"는 더 나은 업무의 분리와 향상된 관리를 제공한다.
[참고] MVC - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN

1. Model

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

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

-  변경이 일어나면 일반적으로 View에게 알려 화면을 변경하거나, 다른 로직 처리를 위해 Controller에게 알리기도 한다.

2. View

UI 요소. 앱의 데이터를 보여주는 방식을 정의한다.

-  표시할 데이터를 Model로부터 받는다.

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

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

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

3. Controller

앱의 사용자로부터의 입력에 대한 응답으로 Model 및 View를 업데이트하는 로직을 포함하며 Model과 View를 통제, 연결하는 역할을 한다.

-  Model 또는 View에 대한 정보를 알아야 한다.

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

 

MVC 패턴은 MVC1 패턴과 스프링이 채택한 MVC2 패턴으로 나눌 수 있다.

MVC1

클라이언트로부터 요청이 들어오면 DB로부터 필요한 데이터를 받은 Model 객체 Java Bean을 View, Controller의 역할을 하는 JSP 페이지에 담아 응답으로 보내는 패턴이다. 즉 JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도가 쉽다.

하지만 JSP가 View와 Controller를 모두 담당하는 이 패턴은 프로젝트가 커지고 코드가 복잡해질수록 단순함이라는 장점을 잃게 된다. 코드의 재사용성도 매우 떨어지고, 읽기도 어려워진다. 즉 유지보수에 있어서 문제가 발생하게 된다.

 

MVC2

MVC2 패턴은 표준으로 사용되는 패턴이다. 요청을 하나의 컨트롤러(Servlet)가 먼저 받는다 즉 MVC1과는 다르게 Controller, View가 분리되어 있어 MVC1의 단점 보완이 가능하다. 독립성이 강화되어 유지보수에 있어서도 이점을 가진다.

 

Spring의 MVC

https://iri-kang.tistory.com/4

 

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

 

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

 

3.

(1) 컨트롤러는 해당 요청을 처리할 Service(서비스)를 받아 비즈니스로직을 서비스에게 위임한다.
(2) Service(서비스)는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야한다면 DAO에 요청하여 처리를 위임 한다.
(3) DAO는 DB정보를 DTO를 통해 받아 서비스에게 전달한다.
(4) 서비스는 전달받은 데이터를 컨트롤러에게 전달한다.
(5) 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View(뷰) 정보를 담아 DispatcherServlet에게 전송한다.

 

4.

(1) DispatcherServlet는 ViewResolver에게 전달받은 View정보를 전달한다.
(2) ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.

 

5.

(1) DispatcherServlet는 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.
(2) DispatcherServlet는 클라이언트에게 Rendering된 뷰를 응답하며 요청을 마친다.

Controller로 View 반환

[Spring] @Controller와 @RestController 차이 - MangKyu's Diary (tistory.com)

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.

2. DispatcherServlet이 요청을 처리할 대상을 찾는다.

3. HandlerAdapter을 통해 요청을 Controller로 위임한다.

4.Controller는 요청을 처리한 후에 ViewName을 반환한다.

5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.


Controller가 반환한 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링한다.

Controller로 Data 반환하기

컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다. 이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.

 

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.

2. DispatcherServlet이 요청을 처리할 대상을 찾는다.

3. HandlerAdapter을 통해 요청을 Controller로 위임한다.

4. Controller는 요청을 처리한 후에 객체를 반환한다.

5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

 

데이터를 반환하는 RestController와 View를 반환하는 Controller를 분리하여 작성하는 것이 좋다.

참고

https://iri-kang.tistory.com/4
https://ss-o.tistory.com/160
https://chanhuiseok.github.io/posts/spring-3/
https://developer.mozilla.org/ko/docs/Glossary/MVC

[Spring] @Controller와 @RestController 차이 - MangKyu's Diary (tistory.com)

'1 week 1 conquer > Spring' 카테고리의 다른 글

[Spring] Spring의 4가지 특징  (0) 2023.04.21
Comments