본문 바로가기
Framework/Spring

[Spirng/개념] 스프링 MVC 구조

by wo__ongii 2024. 10. 16.
728x90
반응형

스프링 MVC(Spring Model-View-Controller)는 스프링 프레임워크의 핵심 모듈 중 하나로, 웹 애플리케이션을 설계할 때 사용하는 MVC 디자인 패턴을 기반으로 한다. 스프링 MVC는 애플리케이션의 로직, 데이터 처리, 그리고 사용자 인터페이스를 분리하여 유지보수성과 확장성을 높여주는 강력한 웹 개발 도구이다.

 

1. MVC 패턴이란?

MVC는 Model-View-Controller의 약자로, 애플리케이션을 모델(Model), 뷰(View), 컨트롤러(Controller) 세 가지 구성 요소로 분리하여 개발하는 패턴이다. 이 방식은 코드를 명확하게 분리하고 각 부분이 독립적으로 동작할 수 있도록 설계되어 있다.

1) 목적

  • 모듈화: 애플리케이션을 구성하는 요소를 명확히 구분하여 각각의 역할에 집중할 수 있다.
  • 유지보수성 향상: 각 컴포넌트가 분리되어 있어 코드 변경 시 다른 부분에 영향을 주지 않아 유지보수가 용이하다.
  • 확장성: 각 요소의 독립성이 높아 애플리케이션을 쉽게 확장할 수 있다.

2) MVC 구성 요소

  • Model
    애플리케이션의 데이터와 비즈니스 로직을 처리하는 역할을 담당한다. 데이터베이스와 상호작용하여 데이터를 가공하고, 이 데이터를 뷰나 컨트롤러에 전달한다.
    • 모든 데이터 정보를 포함하고 있어야 한다.
    • VIew나 Controller에 대해 의존성을 가지면 안된다.
    • 재사용 가능하도록 설계되어야 하며, 다른 인터페이스에서도 변경 없이 사용 가능해야 한다.
  • View
    사용자에게 보여지는 화면을 담당한다. Model이 제공한 데이터를 사용하여 결과를 출력하며, UI를 구성하는 역할을 한다.
    • 데이터를 저장하지 않고, 단순히 화면에 표시하는 역할만 수행해야 한다.
    • Model이나 Controller에 대한 어떠한 정보도 알 수 없어야 한다.
    • 재사용 가능하도록 설계해야 하며, 다양한 정보를 쉽게 표시할 수 있어야 한다.
  • Controller
    사용자의 입력 요청을 처리하고, Model과 View 간의 상호작용을 관리하는 역할을 담당한다. 클라이언트 요청을 받아 필요한 비즈니스 로직을 수행하고, 그 결과를 Model에 저장하여 View에 전달한다.
    • 애플리케이션의 메인 로직을 담당한다.
    • Model과 View에 대한 정보를 알아야 하며, 그 사이에서 중개 역할을 해야 한다.
    • Model과 View의 변경 사항을 인지하고 적절히 대처해야 한다.

2. 스프링 MVC의 발전 과정

우리가 흔히 사용하고 있는 MVC 패턴은 사실 MVC1, MVC2 아키텍처에서 발전된 패턴이다.

 

1) MVC1 아키텍처

MVC1 패턴은 사용자로부터 요청이 들어오면 DB에서 필요한 데이터를 받은 Model 객체(Java Bean)을 JSP 페이지(View)에 담아 응답으로 보내는 패턴이다. 

구조를 보게 되면 JSP가 뷰(View)와 컨트롤러(Controller) 역할을 모두 수행하는 방식이다. 페이지의 흐름이 단순하고 구조가 간단하여 중소형 프로젝트에 적합하지만 JSP에 비즈니스 로직과 UI 코드가 함께 포함되어 코드가 복잡해지고 유지보수가 어려워 웹 규모가 커질수록 복잡해진다는 단점이 있었다. 이러한 점을 보완해 Controller 역할을 하는 Servlet 이 추가된 MVC2 패턴이 나오게 된다.

 

2) MVC2 아키텍처

MVC2 패턴은 JSP와 Servlet을 분리하여, Servlet이 컨트롤러 역할을 맡고 JSP는 View 역할만 담당하도록 개선한 방식이다. 

구조를 보게 되면 사용자로부터 요청이 들어오면 Controller가 해당 요청을 처리한다. Controller는 요청에 대한 비즈니스 로직 처리를 Model에 요청을 전달하고, Model은 처리된 결과를 View에게 전달한다. 마지막으로 View는 사용자에게 요청된 결과를 응답으로 제공하게 된다. 이 패턴을 통해 로직과 UI 코드가 분리되어 더 나은 유지보수가 가능해졌다.

 

스프링은 MVC2 패턴을 기반으로 한 스프링 MVC를 발전시켜 더욱 효율적인 웹 애플리케이션 개발을 지원하고 있다.

3. 스프링 MVC의 구조와 역할

스프링 MVC는 프론트 컨트롤러 패턴을 사용한다. 스프링 MVC에서는 이 역할을 DispatcherServlet이 수행한다. 클라이언트로부터 들어온 모든 HTTP 요청은 DispatcherServlet이 먼저 처리한 후, 필요한 개별 컨트롤러로 요청을 전달하는 방식이다.

 

💡 프론트 컨트롤러 패턴(Front Controller Pattern)

- 웹 애플리케이션에서 클라이언트의 모든 요청을 단일 진입점인 하나의 컨트롤러로 집중시키는 디자인 패턴입니다. 즉, 모든 요청을 하나의 프론트 컨트롤러(Front Controller)가 받아들이고, 그 요청을 적절한 핸들러(Controller)나 뷰(View)로 전달하는 방식
- 중앙 집중식 관리가 가능해 코드 중복을 줄이고, 로깅, 인증, 보안 등의 공통 기능을 하나의 컨트롤러에서 처리할 수 있어 유지보수성이 높아진다.

1) DispatcherServlet

  • 스프링의 프론트 컨트롤러로, 요청부터 응답까지의 전반적인 처리 과정을 중앙에서 통제하는 중요한 역할을 한다.
  • 요청을 처리할 핸들러(Controller)를 결정하고, 그 결과를 다시 View로 전달하는 역할을 한다.
✔️ DispatcherServlet을 Front Controller로 설정하는 방법
- web.xml 파일에 명시한다.
- org.springframework.web.WebApplicationInitializer 인터페이스를 구현하여 설정한다.

 

2) HandlerMapping

  • 요청 URL을 기준으로 어떤 컨트롤러가 해당 요청을 처리할지를 결정하는 역할을 한다.
  • 구체적인 매핑은 xml 파일이나 Java Config 관련 어노테이션 등을 통해 처리할 수 있다.

3) HandlerAdapter

  • HandlerMapping에 의해 선택된 컨트롤러를 실행시키고, 그 결과를 DispatcherServlet으로 반환한다.

4) Controller

  • 클라이언트 요청을 직접 처리하는 역할을 한다. 비즈니스 로직을 수행한 후, 처리 결과를 Model에 저장하여 DispatcherServlet에 반환한다.
  • 요청 결과가 반환되면 HandlerAdapter 가 ModelAndView 객체로 변환되며, 여기에는 View Name과 응답을 통해 보여줄 View에 대한 정보와 관련된 데이터가 포함되어 있다.

5) ModelAndView

  • 컨트롤러가 반환한 Model과 View 정보를 담고 있는 객체로, 최종적으로 DispatcherServlet을 통해 View에 전달된다.

6) View Resolver

  • 반환된 View Name을 기반으로 실제 Controller로부터 받을 로직 처리 결과를 반영할 View 파일(JSP 등)을 찾아 클라이언트에게 렌더링할 화면을 준비한다.

7) View

  • 최종 사용자에게 보여질 화면을 생성한다. Model에 저장된 데이터를 활용하여 화면을 렌더링하고 클라이언트에게 응답한다.

4. 스프링 MVC의 동작 과정

  1. 클라이언트가 서버에 요청을 보내면, 프론트 컨트롤러인 DispatcherServlet이 그 요청을 받는다.
  2. DispatcherServlet은 servlet-context.xml 파일에 등록된 @Controller 어노테이션을 통해 요청을 처리할 컨트롤러를 찾습니다. 이 때 매핑된 컨트롤러가 있으면, 해당 컨트롤러의 @RequestMapping 메소드로 요청을 전달한다.
  3. 컨트롤러는 요청을 처리하기 위해 서비스(Service)를 호출하고, 비즈니스 로직을 처리할 작업을 서비스에 위임한다.
  4. 서비스(Service)는 필요한 작업을 수행하며, 데이터베이스에 접근이 필요할 경우 DAO에 요청을 전달한다.
  5. 서비스(Service)는 처리된 데이터를 다시 컨트롤러에 전달한다.
  6. 해당 컨트롤러는 그 결과 데이터를 Model에 담아 DispatcherServlet에 전달한다.
  7. DispatcherServlet은 ViewResolver를 통해 요청에 맞는 View를 찾는다.
  8. View는 Model의 데이터를 사용하여 화면을 생성한 후, DispatcherServlet을 통해 클라이언트에게 최종 응답을 보낸다.

 

 

 

 

 

[이미지 출처:

https://velog.io/@postrel63/spring-DTO-%EC%82%AC%EC%9A%A9-%EB%B3%80%ED%99%98-%EC%9C%84%EC%B9%98

https://blog.naver.com/PostList.naver?blogId=kksssii,

https://aridom.tistory.com/61]

728x90
반응형

'Framework > Spring' 카테고리의 다른 글

[Spring/개념] 기본 구조  (1) 2024.10.14
[Spring/개념] 스프링 프레임워크(Spring Framework)란?  (0) 2024.10.14