이 글은 토비의 스프링의 내용을 정리한 것입니다.
Spring
스프링은 집착에 가까울 정도로 모든 기능을 다양한 방법으로 확장하도록 설계되어 있다.
스프링이 제공하는 유연하고 확장성이 뛰어난 구조를 이용해서 각 프로젝트에 맞는 최적화된 구조를 만들어내고, 관례를 따라 빠르게 개발 가능한 스프링 기반의 프레임워크를 만들어서 사용해야한다.
스프링은 특정 기술이나 방식에 매이지 않으면서 웹 프레젠테이션 계층의 각종 기술을 조합, 확장해서 사용할 수 있는 매우 유연합 웹 애플리 케이션 개발의 기본 틀을 제공해준다.
DispatcherServlet과 MVC 아키텍처
DispatcherServlet은 스프링의 웹 기술을 구성하는 다양한 전략을 DI로 구성해서 확장하도록 만들어진 스프링 서브릿/MVC의 엔진과 같은 역할을 한다.
MVC 아키텍처의 구성요소는
- 모델 : 구성요소 정보
- 뷰 : 화면 출력 로직
- 컨트롤러 : 제어 로직
으로 이루어져있다. 이 세가지 요소가 서로 협력해서 하나의 웹 요청을 처리하고 응답을 만들어낸다.
MVC 컨트롤러는 프론트컨트롤러(Front Controller) 패턴과 함께 사용된다. 프론트 컨트롤러는 중앙집중형 컨트롤러를 프레젠테이션 계층의 제알 앞에 둬서 서버로 들어오는 모든 요청을 먼저 받아서 처리하게 만든다.
(1) DispatcherServlet의 HTTP 요청 접수
자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청 정보를 DispatcherServlet에 전달한다.
만약 모든 요청에 대해 공통적으로 진행해야하는 전처리 작업이 있다면 DispatcherServlet는 이를 먼저 수행한다.
- 요청 정보 전달
- 전처리 작업 수행
(2) DispatcherServlet에서 컨트롤러로 HTTP 요청 위임
DispatcherServlet은 URL이나 파라미터 정보, HTTP 명령 등을 참고로 해서 어떤 컨트롤러에게 작업을 위임할 지 결정한다. 이때, 핸들러 매핑 전략을 이용한다.
또한 DispatcherServlet은 어댑터를 이용해서 어떤 종류의 오브젝트라도 컨트롤러로 사용할 수 있게한다.
- 작업을 위임할 컨트롤러 결정(핸들러 매핑 전략)
- 어떤 종류의 오브젝트라도 컨트롤러로 사용할 수 있음(어댑터 이용)
(3) 컨트롤러의 모델 생성과 정보 등록
- 컨트롤러의 작업
1. 사용자 요청 해석
2. 실제 비즈니스 로직을 수행하도록 서비스 계층 오브젝트에게 작업 위임
3. 결과를 받아서 모델 생성
4. 어떤 뷰를 사용할지 결정
컨트롤러는 DispatcherServlet에게 모델과 뷰의 정보를 돌려준다.
- 모델 생성 및 정보 등록
(4) 컨트롤러의 결과 리턴 : 모델과 뷰
뷰의 논리적인 이름을 리턴해주면 DispatcherServlet의 전략인 뷰 리졸버가 이를 이용해 뷰 오브젝트를 생성해준다.
- 뷰 리졸버가 뷰 오브젝트 생성
(5) DispatcherServlet의 뷰 효출과 (6) 모델참조
뷰 오브젝트에게 모델을 전달해주고 클라이언트에게 돌려줄 최종 결과물을 생성해달라고 요청한다.
- 모델 전달 및 최종 결과물 생성 요청
(7) HTTP 응답 돌려주기
DispatcherServlet은 등록된 후처리기가 있는지 확인하고, 있다면 후처리기에서 후속 작업을 진행한 뒤에 뷰가 만들어준 DispatcherServlet에 담긴 최종 결과를 서블릿 컨테이너에게 돌려준다.
- 후속 작업 및 최종 결과 리턴