HTTP와 서블릿, 서블릿 컨텍스트 - (3). 서블릿 컨텍스트(ServletContext)

Shiba·2023년 11월 9일
1

📝정리 노트

목록 보기
3/4
post-thumbnail

이제 마지막 관문인 서블릿 컨텍스트에 대하여 알아보도록 하자.

❓ 서블릿 컨텍스트란 무엇일까?

서블릿 컨텍스트란 서블릿과 서블릿 컨테이너가 통신하기위해 사용하는 메소드를 지원하는 인터페이스를 말한다

앞서 서블릿에 대해 알아볼 때, 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse 객체를 생성한 후, web.xml을 통해 사용할 서블릿을 매핑한다고 하였다. 여기서, web.xml으로 서블릿을 매핑하는 메소드를 지원하는 것이 바로 서블릿 컨텍스트라는 것이다. 즉 서블릿 컨텍스트는 다음과 같이 정리할 수 있다.

서블릿 컨텍스트는 서블릿 컨테이너와 서블릿이 통신하기위한 메소드를 지원하는 인터페이스

서블릿 컨텍스트가 어떤 일을 하는지 알았으니 앞서배운 것과 연결하여 정리해보자.
서블릿 컨텍스트까지 포함된 클라이언트와 서버는 다음과 같이 그려볼 수 있을 것이다.

그림을 보면서 지금까지 배웠던 내용을 연결시켜보자.

  1. 웹 서버가 클라이언트의 요청을 받는다.
  2. 웹 서버는 서블릿 컨테이너에게 해당 요청을 위임한다.
  3. 서블릿 컨테이너가 요청을 받으면 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  4. HttpServletRequest에 받은 요청을 담는다.
  5. 서블릿 컨텍스트의 메소드를 호출하여 web.xml과 같은 설정파일을 통해 해당 요청을 처리 할 서블릿을 매핑한다.
    5-1. 매핑된 서블릿에 HttpServletRequest와 HttpServletResponse를 전달.
  6. 매핑된 서블릿은 service()메소드를 호출한다.
    6-1. GET, POST 여부에 따라 doGet() or doPost()메소드를 호출한다.
    6-2. 응답 결과를 HttpServletResponse에 담는다.
  7. HttpServletResponse를 웹 서버를 통해 클라이언트로 보내고 응답을 끝낸다.
  8. 응답이 끝난 후, HttpServletRequest, HttpServletResponse를 소멸시킨다. (서블릿 또한 필요없다면 destroy()를 통해 소멸시킴)

기본적인 과정은 다음과 같이 정리할 수 있을 것 같다. 중간과정이 이해가 안된다면 이전 글을 읽어보도록하자. (혹시나 틀렸다면 댓글로 알려주시면 감사하겠습니다)

⁕ 서블릿 편에서 톰캣은 서블릿 컨테이너라고 하지않았나요? 라고 질문할 수 있다. 톰캣은 WAS중에서도 서블릿 컨테이너를 포함하는 것이다. 그래서 포괄적으로 본다면 톰캣은 WAS라고 보아도 상관은 없다. 그러나 톰캣은 J2EE 스펙을 전부 구현하고 있지는 않기 때문에 서블릿 컨테이너라고 하는 편이다.(스프링 부트 기준 'WAS ≒ 서블릿 컨테이너')

🌲 스프링 MVC와 연결시켜보기

서블릿 컨텍스트가 무엇을 하는지 알아보았으며 알게된 내용을 토대로 이전에 정리했던 http와 서블릿이 하는 일과 연결하여 정리까지 해보았다. 이제 스프링 MVC가 어떻게 움직이는지 다시 한 번 살펴보고 이해해보도록하자.

스프링 MVC의 동작 과정을 토비의 스프링 제 3장 스프링 웹 기술과 MVC에서 정리하였었다.


📌 서버가 브라우저나 여타 HTTP 클라이언트로부터 HTTP 요청을 받기 시작해서 다시 HTTP로 결과를 응답해주기까지의 과정을 살펴보자

(1) DispatcherServlet의 HTTP 요청 접수

자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청이 스프링의 DispatcherServlet에 할당된 것이라면 HTTP 요청정보를 DispatcherServlet에 전달

(2) DispatcherServlet에서 컨트롤러로 HTTP 요청 위임

DispatcherServlet은 URL이나 파라미터 정보, HTTP 명령 등을 참고로 하여 어떤 컨트롤러에게 작업을 위임할지 결정
- DispatcherServlet의 핸들러 매핑 전략을 이용
-- 사용자 요청을 기준으로 어떤 핸들러에게 작업을 위임할지를 결정해주는 것
- 작업을 위임하기 위해 어떤 컨트롤러든 사용이 가능함
-- 어댑터 패턴을 사용하여 특정 컨트롤러를 호출할 때 중간이 끼여서 호출

(3) 컨트롤러의 모델 생성과 정보 등록

컨트롤러가 보통 맵의 담긴 정보인 '모델'을 생성하고 모델에 정보를 등록한다.
- MVC 패턴의 장점이 모델과 뷰가 분리된다는 점이다!
- 모델은 이름과 오브젝트 값의 쌍으로 만들어진다

(4) 컨트롤러의 결과 리턴: 모델과 뷰

컨트롤러가 뷰의 논리적인 이름을 리턴해주면 DispatcherServlet의 전략인 뷰 리졸버가 이를 이용해 뷰 오브젝트를 생성
- 뷰 오브젝트와 뷰 템플릿이 결합해서 최종적으로 사용자가 보게 될 HTML 생성

(5) DispatcherServlet의 뷰 호출과 (6) 모델 참조

DispatcherServlet이 컨트롤러로부터 모델과 뷰를 받은 뒤뷰 오브젝트에게 모델을 전달해주고 클라이언트에게 돌려줄 최종 결과물을 생성해달라고 요청

(7) HTTP 응답 돌려주기

DispatcherServlet이 등록된 후처리기가 있는지 확인하고, 있다면 후처리기에서 후속 작업을 진행한 뒤에 뷰가 만들어준 HttpServletResponse에 담긴 최종 결과를 서블릿 컨테이너에게 돌려줌. 서블릿 컨테이너가 HttpSerlvetResponse에 담긴 정보를 HTTP응답으로 만들어 사용자의 브라우저나 클라이언트에게 전송하고 작업을 종료

위 과정이 익숙해질 때까지 보도록 하자. 그렇지 않으면 스프링 MVC 코드와 설정을 이해하기가 힘들다. - 익숙해지기만 하고 정확히 이해가 되지않았었다.


따라서, 위의 정리를 http, 서블릿, 서블릿 컨텍스트를 정리하며 알게된 내용을 넣어 더욱 세밀하게 작성해보도록하자.

  1. 웹 서버가 클라이언트의 요청을 받는다.
  2. 웹 서버는 서블릿 컨테이너에게 해당 요청을 위임한다.
  3. 서블릿 컨테이너가 요청을 받으면 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  4. web.xml을 기준으로 요청이 스프링의 DispatcherServlet에 할당된 것이라면 HTTP 요청정보를 DispatcherServlet에 전달
  5. DispatcherServlet은 URL이나 파라미터 정보, HTTP 명령 등을 참고로 하여 어떤 컨트롤러에게 작업을 위임할지 핸들러 매핑전략을 이용하여 매핑
    5-1. HttpServletRequest에 받은 요청을 담는다.
    5-2. 매핑된 컨트롤러에 HttpServletRequest와 HttpServletResponse를 handleRequest()의 파라미터를 통해 전달.
  6. 컨트롤러가 보통 맵의 담긴 정보인 '모델'을 생성하고 모델에 정보를 등록한다.
  7. DispatcherServlet의 전략인 뷰 리졸버가 컨트롤러가 리턴해준 뷰의 논리적인 이름을 이용해 뷰 오브젝트를 생성
  8. DispatcherServlet컨트롤러로부터 모델과 뷰를 받은 뒤뷰 오브젝트에게 모델을 전달해주고 클라이언트에게 돌려줄 최종 결과물을 생성해달라고 요청
  9. DispatcherServlet이 등록된 후처리기가 있는지 확인하고, 있다면 후처리기에서 후속 작업을 진행한 뒤에 뷰 오브젝트가 만들어준 HttpServletResponse에 담긴 최종 결과를 서블릿 컨테이너에게 돌려줌.
  10. 서블릿 컨테이너가 HttpSerlvetResponse에 담긴 정보를 HTTP응답으로 만들어 사용자의 브라우저나 클라이언트에게 전송하고 작업을 종료
  11. 응답이 끝난 후, HttpServletRequest, HttpServletResponse를 소멸시킨다.

많이 길지만 그만큼 상세하게 정리해보았다. (틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다.) 웹서버가 요청을 받는 것을 시작으로 차례대로 서블릿 컨테이너, DispatcherServlet, 컨트롤러를 거쳐서 모델과 뷰를 만든 후, 이것을 다시 웹서버가 클라이언트에게 보내는 작업이라고 간단히 정리할 수 있겠다.


마치며..

스프링 MVC의 동작과정이 이해가 잘 되지않아 시작한 정리였지만 스프링 MVC 외에도 알아야할 것들에 대해 복기하는 시간을 가진 것과, 거기서 끝나지않고 궁금했던 부분들을 새로 알게되어 책을 읽고 정리하는 것과는 또 다른 보람을 느낄 수 있어 좋았던 것 같다. 앞으로도 모르는 것이 있다면 그림과 함께 정리하여 흐름자체를 이해할 수 있도록 공부해야겠다.


📚 참고자료

[스프링] 서블릿 컨텍스트 ServletContext

ServletContext,ApplicationContext,WebApplicationContext

profile
모르는 것 정리하기

0개의 댓글