Table of Contents
MVC
MVC는 Model-View-Controller의 약자이며, 어플리케이션을 구성하는 요소를 역할에 따라 세 가지 모듈로 나누어 구분한 패턴이다. MVC의 핵심은 각 구성요소를 독립시킴으로써 각 팀으로 하여금 맡은 부분의 개발에만 따로 집중 할 수 있게하여 개발의 효율성을 높힐 뿐만 아니라, 개발 완료 후에도 유지보수성과 확장성을 보장한다.
- View에서 이벤트 수행
- Controller에서 수행할 메소드를 Model에 전송
- Model에서 메소드를 수행하고 결과물을 Controller에 반환
- Controller에서 반환받은 내용을 View로 변환
- View에서 이벤트 결과 확인
1. Model (모델)
어플리케이션의 데이터이며, 모든 데이터 정보를 가공하여 가지고 있는 컴포넌트이다.
- 컨트롤러에서 수행할 내용을 받아 자바코드, SQL을 수행하고 결과물을 Controller로 반환한다.
- 비즈니스 영역의 로직을 처리
- 사용자가 이용하려는 모든 데이터를 가지고 있어야하며, View(뷰) 또는 Controller(컨트롤러)에 대해 어떠한 정보도 알 수 없어야 한다.
2. View (뷰)
시각적인 UI 요소를 지칭하는 용어이다.
- 비즈니스 영역에 대한 프레젠테이션 뷰(즉, 사용자가 보게 될 화면, 대표적으로 JSP)를 담당
- JSP화면에서 버튼을 누르거나 하는 이벤트를 수행하면 해당 정보가 Controller로 넘어가 메소드를 수행하고 난 뒤 결과물을 View로 가져와 수행한 내용을 확인하게 된다.
3. Controller (컨트롤러)
Model(모델)과 View(뷰)를 연결해주는 역할을 한다.
- View에서 버튼 클릭 등의 이벤트를 수행했을 경우 Model에서 수행할 메소드와 파라미터를 보낸 뒤 Model에서 수행한 결과를 가져오면 그 내용을 View로 반환 하게 된다
4. Spring MVC
HandlerMapping
- 요청을 직접 처리할 컨트롤러를 탐색한다.
- 구체적인 mapping은 xml파일이나 java config 관련 어노테이션등을 통해 처리할 수 있다.
HandlerAdapter
- 매핑된 컨트롤러의 실행을 요청한다.
Controller
- 직접 요청을 처리하며, 처리 결과를 반환한다.
- 결과가 반환되면 HandlerAdapter가 ModelAndView 객체로 변환되며, 여기에는 View Name과 같이 응답을 통해 보여줄 View에 대한 정보와 관련된 데이터가 포함되어 있다.
View Resolver
- View Name을 확인한 후, 실제 컨트롤러부터 받은 로직 처리 결과를 반영할 View 파일(jsp)을 탐색한다.
View
- 로직 처리 결과를 반영한 최종 화면을 생성한다.
MVC 패턴 동작 순서
- 클라이언트가 서버에 요청을 하면 front controller인 DispatcherServlet 클래스가 요청을 받는다.
- DispatcherServlet은 프로젝트 파일 내의 servlet-context.xml 파일의 @Controller 인자를 통해 등록한 요청 위임 컨트롤러를 찾아 메핑(mapping)된 컨트롤러가 존재하면 @RequestMapping을 통해 요청을 처리 할 메소드로 이동한다.
- 컨트롤러는 해당 요청을 처리한 Service(서비스)를 받아 비즈니스 로직을 서비스에게 위임한다.
- Service(서비스)는 요청에 필요한 작업을 수행하고, 요청에 대해 DB에 접근해야한다면 DAO에 요청하여 처리를 위임한다.
- DAO는 DB정보를 DTO를 통해 받아 서비스에게 전달한다
- Service는 전달받은 데이터를 컨트롤러에게 전달한다
- 컨트롤러는 Model(모델) 객체에게 요청에 맞는 View(뷰) 정보를 담아 DispatcherServlet에게 전송한다.
- DispatcherServlet은 ViewResolver에게 전달받은 View 정보를 전달한다.
- ViewResolver는 응답할 View에 대한 JSP를 찾아 DispatcherServlet에게 전달한다.
- DispatcherServlet은 응답할 뷰의 Render를 지시하고 뷰는 로직을 처리한다.
- DispatcherServlet은 클라이언트에게 Rending된 뷰를 응답하며 요청을 마친다.