개발 일기

[Spring Boot] Spring MVC - 구조 이해 본문

Back-End/Spring

[Spring Boot] Spring MVC - 구조 이해

개발 일기장 주인 2024. 5. 2. 01:33

MVC란?

  • MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴 중 하나이다.
  • 애플리케이션의 개발 영역을 MVC(Model, View, Controller)로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식이다.
  • MVC 패턴을 도입하면서 UI 영역과 도메인(비즈니스 로직) 영역으로 구분되어 서로에게 영향을 주지 않으면서 개발과 유지보수가 가능하다.

Model

Model은 애플리케이션의 데이터와 상태를 담당한다. 예를 들어, 사용자 정보를 저장하는 User 클래스가 Model에 해당합니다.

Controller에서 사용자 입력(DTO)을 받아 User 객체를 생성하고, 이 객체를 View에 전달하여 화면에 표시할 수 있다.

또한 Model에는 데이터베이스 연동을 위한 DAO(Data Access Object) 클래스도 포함될 수 있다. DAO 클래스는 User 객체를 데이터베이스에 저장하거나 조회하는 기능을 제공한다.

View

View는 사용자 인터페이스를 담당한다. 예를 들어, 사용자 정보를 입력받는 HTML 폼이 View에 해당한다. 사용자가 이름, 나이, 주소, 전화번호를 입력하면 이 정보가 Controller로 전달된다. 또한 Controller에서 전달받은 User 객체의 데이터를 화면에 표시하는 JSP 페이지도 View에 해당한다. View는 사용자와 직접 상호작용하며, 사용자 입력을 받고 결과를 출력하는 역할을 한다.

Controller

Controller는 사용자 요청을 처리하고, Model과 View를 연결하는 역할을 한다.
예를 들어, 사용자가 이름, 나이, 주소, 전화번호를 입력하면 Controller가 이 정보를 받아 User 객체를 생성하고 생성된 User 객체를 DAO 클래스를 통해 데이터베이스에 저장한다. 이후 View에 User 객체를 전달하여 사용자 정보를 화면에 표시합니다. 또한 사용자가 특정 URL을 요청하면 Controller가 이를 받아 적절한 View를 선택하여 응답을 생성한다.

즉, Model 데이터를 View로 전달한다.

 

Spring MVC 구조

위와 같은 MVC 디자인 패턴이 어디에 적용됐는가?

바로 Dispatcher Servlet(디스패처 서블릿)의 요청 처리 과정에 MVC 디자인 패턴이 적용됐다.

사용자가  HTTP 요청을 보내게 되면 Dispatcher Servlet이라는 프론트 컨트롤러로 들어가게 된다.

  1. DispatcherServlet은 요청 URL을 기반으로 HandlerMapping을 통해 적절한 핸들러(컨트롤러)를 조회하고 HandlerMapping은 요청 URL과 매핑된 컨트롤러 메서드를 찾아 DispatcherServlet에 반환한다.
  2. DispatcherServlet은 찾은 컨트롤러를 실행할 수 있는 HandlerAdapter를 조회한다.
    HandlerAdapter는 컨트롤러의 실행 방식을 추상화하여, DispatcherServlet이 컨트롤러를 일관된 방식으로 호출한다.
  3. DispatcherServlet은 찾은 HandlerAdapter를 통해 컨트롤러를 실행한다.
  4. HandlerAdapter는 컨트롤러의 메서드를 호출하여 실제 핸들러를 실행시킨다.
  5. HandlerAdapter는 컨트롤러가 반환한 결과를 ModelAndView 객체를 Dispatcher Servlet으로 반환한다.
  6. DispatcherServlet은 ModelAndView 객체에 포함된 뷰 이름을 기반으로 ViewResolver를 호출한다.
    JSP의 경우 InternalResourceViewResolver가 자동으로 등록되어 사용된다.
  7. ViewResolver는 Model을 기반으로 논리적인 뷰 이름을 물리적인 뷰 이름으로 변환하고 Dispatcher Servlet으로 렌더링 역할을 담당하는 뷰 객체를 반환한다. JSP의 경우 InternalResourceView(JstlView) 를 반환한다.
  8. 반환 받은 뷰를 통해서 뷰를 렌더링 한다.

위의 구조 보다는 아래의 구조가 내가 앞으로 주로 활용할 구조도이다.