스프링 MVC 컴포넌트

Jayden ·2023년 4월 11일
0

1) WAS, Servlet

  • Servlet : HTTP 프로토콜을 사용하여 데이터를 주고 받는 서버용 프로그래밍 스펙
    javax.servlet.Servlet 인터페이스 형태로 Java API 에서 제공, 이를 구현한 클래스도 서블릿 어플리케이션이라고 한다.
  • WAS(Web Application Server)
    웹 서버(정적 서버) + 서블릿 컨테이너를 포함
    서블릿 컨테이너는 서블릿 애플리케이션을 보관하고 관리하며, 사용자 요청에 따라 적절한 서블릿 애플리케이션을 찾아 실행.

J2EE의 서블릿 스펙을 구현한 WAS는 여러종류가 있는데, 톰캣(Tomcat), 제티(Jetty), 언더토우(Undertow)등이 있다.

이미지 출처 : https://velog.io/@saint6839/Web-Server-Was-Servlet

일반적으로
WAS = WebServer + Servlet Container 로 정의하지만, 일부 도서나 참고 자료는 WAS = Servelet Container로 정의하기도 한다.

서블릿 애플리케이션 내부는 HttpServeltRequest와 HttpServeltResponse 객체를 이용하여 클라이언트의 요청과 응답을 처리한다.

HttpServletRequest

브라우저가 요청한 HTTP 요청정보는 javax.servelet.http.HttpServeltRequest 객체에 포함되고, 서블릿 앱에서 필요한 HTTP 헤더나 쿼리 문자열 등 여러 정보를 참조할 수 있는 메소드를 제공한다.

HttpServletResponse

서블릿 앱은 사용자 요청에 따라 데이터 저장소에서 데이터를 조회하거나 변경하는 작업을 실행한다.
실행결과는 javax.servlet.http.HttpServletResponse 객체에 설정되어 사용자에게 전달된다.


전통적인 서블릿 애플리케이션은 데이터를 다루는 로직과 HTML 코드까지 하나의 클래스에 서로 얽혀 있어 유지 보수가 어렵고, 웹 애플리케이션 기능이 다양해 지거나 데이터를 주고 받는 로직이 포함되면 서블릿 애플리케이션 복잡도는 그에 비례하여 증가한다.

스프링 웹 MVC는 효율적으로 웹 애플리케이션을 개발할 수 있는 방법을 제공한다. 웹 애플리케이션을 제공, 웹 애플리케이션 기능을 세가지로 분류하고 각 역할에 맞게 클래스를 분리하여 동작하는 패턴이 MVC 패턴이다.

2) MVC 패턴

  • Controller : 사용자 요청을 받아 어떻게 처리할지 결정하는 역할로, 사용자 요청을 분석하는 역할 담당. 데이터를 처리하는 데 필요한 쿼리스트링(@RequestParam 사용하여 가져옴), 헤더, 바디 같은 정보를 HTTP 메시지에서 파싱하여 추출.
    적절한 Model이나 요청한 View에 전달하는 역할 담당

  • Model : 컨트롤러에서 전달 받은 사용자 요청 데이터를 가공하거나 데이터 저장소에서 데이터를 처리하는 작업을 담당. 웹 애플리케이션의 비지니스 로직을 처리하는 역할을 담당.

    일부 자료에서는
    Model = 데이터 + 데이터를 처리하는 로직로 설명하기도 함

  • View : 사용자에게 응답하는 화면을 담당. 웹 애플리케이션은 직접 화면을 보여 주는 역할은 하지 않고 사용자가 요청한 Accept 헤더에 적합한 MIME 문서를 전달한다. 그러면 클라이언트는 MIME 문서를 파싱하여 적합한 화면으로 렌더링한다.
    사용자에게 응답하는 메시지 포맷을 결정하거나 Model 데이터를 HTML, XML, JSON 메시지로 만든다.


이미지 출처 : https://www.geeksforgeeks.org/mvc-framework-introduction/

3) Spring MVC 컴포넌트 동작 순서

1) 클라이언트에서 전송된 모든 HTTP 요청 메시지는 가장 먼저 DispatcherServlet이 받아서 처리

2) DispatcherServlet은 요청 메시지의 요청 라인과 헤더들을 파악한 후 어떤 컨트롤러 클래스의 어떤 메서드로 전달할 지 HandlerMapping 컴포넌트의 메서드를 통하여 확인한다.

3) DispatcherServlet은 사용자 요청을 처리하기에 적합한 컨트롤러 클래스에 HTTP 요청 메시지를 전달하기 위해 전달 역할을 하는 HandlerAdapter에게 전달한다.

4) HandlerAdapter는 해당 컨트롤러 클래스에 클라이언트 요청을 전달한다.

5) 컨트롤러 클래스는 개발자가 개발한 비즈니스 로직(service, repository)을 수행하고. 실행된 결과는 컨트롤러 클래스에 전달되고, 컨트롤러 클래스는 이 데이터를 어떤 뷰로 전달할지 결정한다.

6) HandlerAdapter는 처리할 뷰와 뷰에 매핑할 데이터를 ModelAndView 객체에 포함하여 DispatcherServlet에 전달한다.

7) DispatcherServlet은 처리할 뷰 정보를 ViewResolver에 확인한다.

8) DispatcherServlet은 View에 데이터를 전달하고, View는 데이터를 HTML, XML 등 적합한 포맷으로 변환한다.

9) DispatcherServlet은 최종적으로 변환된 데이터를 클라이언트로 전달한다.

이미지 출처 : https://terasolunaorg.github.io/guideline/1.0.1.RELEASE/en/Overview/SpringMVCOverview.html

텍스트 내용 출처 : 스프링 부트로 개발하는 MSA 컴포넌트

profile
J-SONE 프론트엔드 개발자

0개의 댓글