본문 바로가기
Spring/Spring MVC

[Spring MVC] 2. Servlet

by Kloong 2022. 11. 23.
더보기

Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.

 

GitHub - Kloong1/TIL: Today I Learned.

Today I Learned. Contribute to Kloong1/TIL development by creating an account on GitHub.

github.com

Servlet

만약 WAS를 바닥부터 전부 구현한다면...?

사용자의 POST 요청을 받아서 DB에 저장하는 WAS를 바닥부터 전부 구현한다고 가정해보자.

 

  • WAS를 구현하기 위해서 좌측의 동작을 전부 수행하는 프로그램을 작성해야 한다.
  • 하지만 실제 의미있는 비즈니스 로직(사용자가 보낸 정보를 DB에 저장)은 초록색 네모 쳐진 부분 뿐이다.
  • 나머지는 모든 WAS(혹은 웹 서버)가 동일하게 수행하는 작업이다.
    • 모든 WAS 개발자가 해당 코드를 작성해야 한다면 너무 비효율적이다.

 

  • 서블릿을 사용한다면 WAS 개발자는 실제로 의미있는 비즈니스 로직만 구현하면 된다.
  • 나머지 모든 WAS에서 동일하게 동작하는 부분들은 서블릿이 알아서 해준다.

Servlet

  • HttpServlet을 상속 받아서 비즈니스 로직만 작성하면 된다.
  • HttpServletRequest 객체를 사용하면, 잘 파싱 된 HTTP 요청 정보에 접근할 수 있다.
  • HttpServletReponse 객체를 사용하면 HTTP 응답 메시지를 쉽게 만들 수 있다.
  • 즉 Servlet을 통해서 HTTP 스펙에 맞는 코드를 편리하게 작성할 수 있다.

Servlet 동작 방식

  1. 웹 브라우저에서 HTTP request가 들어온다.
  2. WAS에서 요청 메시지를 기반으로 HttpServletRequest 객체와 HttpServletReponse 객체를 만든다.
  3. 서블릿 컨테이너에 있는 helloServlet 에 만든 객체를 넘겨준다.
  4. helloServlet 이 비즈니스 로직을 실행한다.
  5. 비즈니스 로직 실행이 끝나면, WAS가 helloServlet 이 비즈니스 로직을 실행하며 조작한 HttpServletReponse 를 기반으로 응답 메시지를 만들어 브라우저에게 전달한다.

즉 정리하면,

  • WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.
  • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용할 수 있다.
  • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력할 수 있다.
  • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.

Servlet Container

  • Tomcat처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 개발자가 작성한 서블릿 클래스의 객체를 생성, 초기화, 호출, 관리해주는 역할을 한다.
  • 서블릿 객체는 싱글톤으로 관리된다.
    • 최초 로딩 시점에 서블릿 객체를 미리 만들어 두고 계속 재사용한다.
    • 동일한 타입의 요청은 동일한 서블릿 객체가 처리한다.
    • 객체가 하나만 존재하기 때문에, 멤버 변수 값이 모든 요청에 대해 공유된다. 이 것 때문에 문제가 생기지 않게끔 주의해야한다.
    • 서블릿 컨테이너가 종료되면 사라진다.
  • JSP도 서블릿으로 변환 되어서 사용된다.
  • 서블릿 컨테이너는 동시 요청을 위한 멀티 스레드 처리를 지원한다.

댓글