MVC 패턴이란?
사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 사용되는 디자인 패턴이다.
소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있다.
애플리케이션의 개발 영역을 MVC (Model, View, Controller)로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식이다.
이런 관심사 분리는 더 나은 유지보수성을 제공한다.
- Model : 데이터와 비즈니스 로직을 관리
- 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업을 한다.
- 처리한 데이터를 클라이언트에게 응답해야 하는데,
이 때 클라이언트에게 응답해주는 데이터를 Model이라고 한다.
- View : 레이아웃과 화면 처리
- Model을 이용하여 화면에 보이는 리소스(Resource)를 제공하는 역할을 한다.
ex) HTML 페이지 출력, PDF나 Excel 등의 문서 형태로 출력,
XML, JSON 등 특정 형식의 포맷으로 변환
- Model을 이용하여 화면에 보이는 리소스(Resource)를 제공하는 역할을 한다.
- Controller : 모델과 뷰로 명령을 전달
- 요청을 전달받는 엔드포인드로 Model과 View의 중간에서 상호작용을 해주는 역할을 한다.
- 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면 이 Model 데이터를 View로 전달하는 역할을 한다.
MVC 패턴 사용 이유
사용자가 보는 페이지, 데이터처리, 그리고 이 2가지를 중간에서 제어하는 컨트롤러,
이 3가지로 구성되는 하나의 애플리케이션을 만들면 각각 맡은 역할에만 집중을 할 수 있게 된다.
관심사를 분리하여 각자의 역할에 집중하게 개발하면,
유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코드가 사라진다.
Spring MVC 패턴 탄생 과정
Spring MVC패턴은 MVC1과 MVC2의 형태에서 발전된 패턴이다.
MVC1
MVC1 패턴의 경우 View와 Controller를 모두 JSP가 담당하는 형태를 가진다.
즉, JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽습니다.
단순한 프로젝트에는 괜찮겠지만, 내용이 복잡해지고 프로젝트가 커질수록 이 패턴의 장점은 사라지게 된다.
JSP 하나에서 MVC 가 모두 이루어지다보니 재사용성도 매우 떨어지고, 읽기도 힘들어집니다.
MVC2
요청을 하나의 컨트롤러(Servlet)가 먼저 받기 때문에 MVC1과는 다르게 Controller과 View가 분리되어 있다.
즉, 역할이 분리되어 MVC1패턴에서의 단점을 보완할 수 있습니다.
MVC1패턴 보다는 구조가 복잡해질 수 있지만,
수정할 부분이 있다면 그 파트만 수정하면 되기 때문에 유지보수성에도 큰 이점을 가진다.
Spring MVC
DispatcherServlet
1. 유저의 요청을 받는 DispathcerServlet이 핵심이며, Front Controller의 역할이 된다.
Front Controller는 유저의 모든 요청을 받는다.
7. ViewReslover에서 반환받은 View의 처리 결과를 사용자에게 보여주도록 요청한다.
HandlerMapping
2. DisPatcherServlet에서 받은 요청을 전달받고, 전달받은 요청을 처리하는 담당 컨트롤러를 찾고 반환한다.
HandlerAdapter
3. DispatcherServlet에서 찾은 컨트롤러를 동작시킨다.
5. 컨트롤러의 동작 결과인 Model과 View 반환한다.
Handler(Controller)
4. 개발자가 작성하는 클래스이며, 실제 요청을 처리하는 비즈니스 로직을 작성한다.
View에 전달해야 하는 데이터를 Model에 담아서 전달한다.
ViewResolver
6. DispatcherServlet이 호출하며 Controller가 반환한 View 이름을 기반으로 View를 찾아 반환.
View
8. 실제 응답 보내야 하는 데이터를 jsp나 json 형식 등을 이용해서 생성한다.
'스프링' 카테고리의 다른 글
Spring - ComponentScan(feat. Autowired) (0) | 2024.04.18 |
---|---|
Spring - Spring Container와 Dependency Injection (1) | 2024.04.11 |
스프링 시큐리티 defaultSecurityFilterChain (1) | 2023.12.20 |
스프링 시큐리티 내부 흐름 (1) | 2023.12.18 |
스프링 DI (0) | 2023.12.17 |