저번 포스팅에서 Servlet의 문제점으로
- 각 Servlet의 service() 메서드에서 중복되는 부분이 많다.
- Servlet에 종속적인 구조를 가진다.
- 이후, 각 컨트롤러에서 공통으로 처리해야하는 로직이 생기면 중복이 발생한다.
이렇게 3가지의 문제점이 있다고 말했다.
어떻게 이 문제점을 해결할 수 있을까?
그전에 Front Controller패턴에 대해서 알아 볼 필요가 있다.
▶Front Controller란?
클라이언트 요청을 받는 최앞단에 모든 요청을 받을 수 있도록 컨트롤러를 하나 만들고
이곳에서 각 요청별로 처리하는 로직을 찾아서 이를 전달해
요청을 수행하도록 하는 방법이다.
Front Controller 패턴을 활용한 구조를 통해서
매 요청마다 각각의 서블릿을 사용하는 것이 아닌
하나의 서블릿을 통해 요청을 수행할 수 있게 되었고
이로 인해 요청의 진입점이 같게되어, 관리가 훨씬 수월하게 된다.
또한 각 서블릿마다 가지고 있는 중복되는 공통 요청들을
Front Controller 단 한곳에서만 사용하기 때문에 중복로직을 제거하게된다는 장점을 가지면서
1번, 2번의 문제를 해결하게 되었다.
▷Front Controller가 하는 일
- 클라이언트 - 서버 연결
- 각 요청에 맞는 Controller를 매핑하여 정보를 보관
- 요청이 들어오면 매핑 정보를 찾아 해당 컨트롤러 호출
- 전달할 결과를 생성
- 결과를 사용자에게 반환
음..Front Controller가 하는일이 너무 많은데?
각각의 수행 역할별로 상황을 분리해보자...!!!
▷ 각각의 역할 분리
하나하나 살펴보자면
1. 핸들러 검색 역할을 분리
요청별로 각각의 역할을 수행하는 핸들러를 찾기위한 핸들러 검색 역할을 분리
2. Controller 분리
프론트 컨트롤러는 객체를 만들어 요청의 정보를 넘기고
전달을 받을 모델까지 함께 넘긴다.
여기서 하나 알아야 할것은 기존처럼 서블릿 객체가 매개변수로 전달되는것이 아니라
자바객체가 전달된다는 점이다!
->컨트롤러가 서블릿에 종속적인 문제를 해결할 수 있게 됨.
3. View 분리
프론트 컨트롤러로 넘어온 전달할 뷰의 이름에 대해서 viewResolver 객체를 통해서
원본 View의 URI를 알아낸 후, Custom View라는 객체에 랜더링 역할을 맡기도록 역할을 분리하면
하나의 웹 요청이 끝나게 된다.
이렇게 역할을 분리하면서 수행하는 책임을 분리하게 되었고
서블릿에 종속되지 않게 하면서 보다 객체지향적인 개발이 가능하도록 설계되었다.
그리고 이러한 과정들을 바탕으로하여서
만들어진 프레임워크가 바로!
Spring Web MVC이다!
▶Spring Web MVC
위 설명과 달라진 점은 Front Controller이 Dispatcher Servlet으로 바뀌었다는 것과
컨트롤러 또는 핸들러를 호출하기 전에 중간에 어댑터 역할을 수행해주는 Handler Adapter라는 기능을 통해서
다양한 종류의 핸들러를 호출할 수 있는 기능을 추가하여 보다 확장성 있는 기능을 개발할 수 있게 변경 되었다.
▷Spring Web MVC를 사용할 때 이점은?
DispatcherServlet은 보통 두가지로 구분이 된다.
1. Servlet WebApplicationContext
- 기존과 같이 웹 요청을 담당하는 객체들이 들어가서 관리됨.
2. Root WebApplicationContext
- Service계층이나 Repository등 독립적인 빈이 들어가서 관리되게 된다.
그리고 웹 요청시 필요한 부분들을 DispatcherServlet이 알아서 주입하는 구조로
웹 요청이 동작되게 된다.
즉, 우리는 설정만 잘 작성하고 이를 등록해주면
그 설정대로 생성된 객체가 스프링 컨테이너 내부에서 관리되고필요한 부분에 주입을 받아서 DispatcherServlet이
스스로 사용될 수 있게 된다.
DispatcherServlet의 요청 처리 뿐만 아니라
컨트롤러를 포함한 어플리케이션 단에서도
Spring Web MVC를 활용하여 필요한 부분에 적용할 수 있게 된다.
정리하자면 , 개발자는 이러한 Spring Web MVC에서 제공되는 DispatcherServlet 웹 요청 처리 관련 구현체들을 사용하면서
개발자들이 실제로 작성해야 하는 핸들러, 즉 비지니스 로직에만 집중 할 수 있는 환경을 만들어준다.
▶Dispatcher Servlet 작동 방식
- 먼저 front-controller의 역할을 하는 DispatcherServlet이 request를 받는다.
- DispatcherServlet은 적절한 controller를 선택하는 일을 HandlerMapping에게 요청한다.
- HandlerMapping은 적합한 controller를 선택한다.
- DispatcherServlet은 선택된 controller의 비즈니스 로직 실행 작업을 HandlerAdapter에게 위임한다.
- HandlerAdpater가 controller의 비즈니스 로직을 호출하고 결과를 ModelAndView 객체에 담아서 DispatcherServlet이 에게 return한다.
- DispatcherServlet이 ViewResolver를 이용하여 결과를 보여줄 View를 가져온다.
- View 객체에게 DispatcherServlet이 응답 결과 생성을 요청한다.
'BackEnd > Spring Boot🍃' 카테고리의 다른 글
[Spring] ApplicationContext란? ApplicationContext Interface를 구현하고 있는 대표적인 클래스들, Bean 등록 방식 (0) | 2024.04.06 |
---|---|
[Spring]Spring MVC 요청에서 응답까지의 흐름, @Controller와 @RequestMapping 원리 (0) | 2024.03.24 |
[Spring] Servlet과 Spring Web MVC(1) (0) | 2024.03.23 |
[Spring Boot] 스프링부트 개념정리 (1) | 2024.02.24 |
[Spring Boot] 코드프레소님 Spring Boot 강의 정리(유데미){2} (1) | 2024.02.24 |