디자인 패턴이란 객체 지향 프로그래밍 설계에서 자주 발생하는 문제들을 피하기 위해 사용되는 일반적인 해결책, 즉 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 의사소통의 일종으로 개발에 있어서 조금 더 쉽고 편리하게 사용할 수 있도록 만들어 놓은 특정한 방법들이라 할 수 있다.
MVC 패턴은 소포트웨어 디자인 패턴의 한 종류로 Model-View-Controller의 약자이다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세 가지 역할로 구분한 패턴이다. MVC 패턴은 소프트웨어를 구성하는 요소들을 분리함으로써 코드의 재사용성과 유지보수성을 높이고, 개발자들 간의 협업을 용이하게 한다.
Model은 데이터와 비지니스 로직을 담당한다. DB와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행한다.
Model 규칙
1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야한다.
2. 뷰와 컨트롤러에 의존하지 않아야한다.
(모델 내부에 뷰와 컨트롤러 관련 코드가 없어야한다.)
View는 사용자 인터페이스를 담당한다. 사용자가 보는 화면, 버튼, 폼 등을 디자인하고 구현한다.
View 규칙
1. 모델에만 의존 가능하고, 컨트롤러에 의존 불가능하다.
2. 모델로부터 데이터를 받을 때, 사용자마다 다르게 보여줘야하는 데이터에 대해서만 받아야한다.
3. 모델로부터 데이터를 받을 때, 컨트롤러를 통해 받아야한다.
Controller는 Model과 View 사이의 상호작용을 조정하고 제어한다. 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트한다.
Controller 규칙
1. 모델과 뷰에 의존 가능하다.
2. 모델과 뷰의 변경을 모니터링해야한다.
Spring Web MVC는 Servlet API를 기반으로 구축된 독창적인 웹 프레임워크로 스프링 프레임워크에 포함되어 있다. 중앙에 있는 DispatcherServlet이 HTTP 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어 있으며 유연하고 다양한 워크플로우를 지원한다. 쉽게 말해 Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다.
서블릿이란 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양이다.
사용자가 (HTTP)API를 요청했을 때 서버의 서블릿 동작 과정
1. 사용자가 Client(브라우저)를 통해 서버에 API를 요청
2. 요청 받은 서블릿 컨테이너는 request, response 객체 생성
3. 설정된 정보를 통해 어떤 서블릿에 대한 요청인지 찾음
4. 해당 서블릿에서 service 메서드를 호출한 뒤, 브라우저의 요청 메서드에 따라 doGet 혹은 doPost 등의 메서드 호출
5. 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한뒤 response 객체에 응답을 담아 브라우저에 반환
6. 응답이 완료되면 생성한 response, request 객체 소멸
모든 API 요청을 위의 서블릿 동작 방식에 맞춰 구현한다면 무수히 많은 서블릿 클래스를 구현해야 한다. spring은 이를 효율적으로 처리하기 위해 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 동작한다.
Front Controller 패턴의 동작과정
한 개의 클래스에서 너무 많은 코드가 작성되면 코드의 가독성이 떨어지게 된다. 또한 코드가 복잡해질수록 코드의 변경이 어려워진다. 이러한 문제점들을 해결하기 위해 서버 개발자들은 서버에서의 처리 과정을 크게 Controller, Service, Repository 3개로 분리하였다. 이 구조는 위에서의 MVC 패턴에서 파생되었다.
Controller는 클라이언트의 요청을 받고 처리 완료된 결과를 다시 클라이언트에게 응답해준다. 요청에 대한 로직 터리는 Service에 전담한다.
Serivce는 사용자의 요구사항을 즉 비지니스 로직을 처리한다. DB 저장 및 조회가 필요할 때는 Repository에 요청한다.
Repository는 DB를 관리(연결, 해제, 자원 관리)한다. 또한 CRUD 작업을 처리한다.