본문 바로가기
Back-end/java spring

Servlet에 대한 개념 정리

by kkkdh 2023. 3. 1.
728x90

Servlet (서블릿) 이란?

서블릿은 웹 서버에서 가동되는 자바 기반 프로그램이며, HTTP 기반 통신에서 client와 server 사이의 request와 response를 다루기 위해 설계되었습니다.

 

서블릿은 client의 request에 기반한 동적인 HTML 페이지나, json, xml 형태의 데이터들을 만들기 위해 사용되며, 이 뿐만 아니라 cookie, session 등을 다뤄 stateless한 HTTP 통신에서 상태 정보를 다룰 수 있도록 돕습니다.

(출처: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의)

위 그림을 보면, HTTP 통신에 따라 client - server간에 request를 보내고 response를 받아오는 과정에서 진행해야할 작업이 굉장히 많음을 파악할 수 있습니다.

 

여기서 핵심적인 비즈니스 로직 구현을 제외한 다른 부분을 Servlet이 담당함으로써, 웹 애플리케이션 개발에만 집중할 수 있도록 지원합니다.

 

정확하게는 나머지 작업들은 서블릿을 지원하는 WAS(Web Application Server)가 담당합니다. (ex. Tomcat)

 

WAS (Web Application Server)를 간단하게 정리하자면, 기존의 정적인 resources 제공의 역할만 담당하는 web server에 프로그램 코드를 실행할 수 있는 기능이 가미되어, 사용자 요청에 따라 동적인 resources를 제공할 수 있는 서버를 의미 한다고 볼 수 있습니다.

 

마지막으로 서블릿을 요약하면!

  • 자바 웹 애플리케이션 프로그램을 만들기 위해 사용하는 자바 기반의 기술이다.
  • HTTP 기반 통신에서 비즈니스 로직을 제외한 반복적인 작업을 편리하게 처리해준다.
  • 즉, request, response를 처리하는 중간 과정에 대한 처리를 도맡아 해준다고 볼 수 있다!

입니다.


Servlet Container (서블릿 컨테이너)

WAS에서 서블릿을 다룬다는 것은 앞서 살펴본 바가 있습니다.

 

이번에는 WAS 안에서 서블릿을 어떻게 다루는지 그림과 함께 일련의 과정을 살펴볼까 합니다.

 

바로 그림부터 보겠습니다.

간단하게 그려봤습니다.

Client가 WAS에게 Request를 보내면, WAS는 Servlet container라는 것을 운영하면서, 요청에 알맞은 servlet를 찾아 Request에 따른 Response를 만들어냅니다.

 

이렇게 만들어낸 Response는 WAS에 의해 만들어진 Response 객체를 이용한 것이며, client가 해당 Response를 전달받게 되는 방식으로 HTTP 기반 통신이 이루어집니다.

 

다시 서블릿 컨테이너를 설명해 보자면, WAS안에 위치하여 서블릿의 생명주기를 관리하고, client의 request에 따른 서블릿을 선택하고, 그에 따른 response를 client에게 전달하는 과정을 담당합니다.

 

그러니깐 개발자가 서블릿을 코드로 짜는 작업만 진행하면, WAS의 서블릿 컨테이너가 client - server 간의 일련의 통신 과정을 담당한다고 볼 수 있습니다.


Spring MVC에서의 서블릿 활용 방식

Spring MVC를 활용하면, 서블릿 객체를 싱글톤으로 관리합니다.

  • client의 요청이 들어올때 마다 계속 객체를 생성하는 것은 비효율 적이기 때문에
  • 최초 로딩 시점에서 서블릿 객체를 만들고 이것을 재활용합니다.
  • 따라서 모든 client는 같은 서블릿 객체에 접근하며, 다만 request, response handling을 위한 객체는 매번 생성

싱글톤으로 관리하기 때문에, 이전에 공부한 싱글톤 타입 빈에서 살펴봤던, 공유 변수 사용에 주의해야 한다는 점 등을 조심해야 합니다.

  • JSP도 서블릿으로 변환되어 사용된다고 하며,
  • WAS는 동시 요청을 위한 멀티 쓰레드 처리를 지원합니다.

간단한 코드를 작성해 보자!

직접 코드로 서블릿을 어떻게 다루는지 확인하기 위해서 간단하게 스프링 프로젝트를 만들어봤습니다.

 

물론 스프링은 사용되지 않지만, tomcat 서버를 스프링 부트가 내장하고 있다는 장점을 이용하기 위해 스프링 부트 프로젝트를 만들었습니다.

 

우선 servlet을 직접 등록해서 사용하기 위해서는 @ServletComponentScan 어노테이션을 이용해서 서블릿을 스캔할 수 있도록 해줘야 합니다.

main application class위에 @ServletComponentScan 어노테이션을 추가

그리고 각 서블릿을 등록하기 위해서 @WebServlet 어노테이션을 사용합니다.

어노테이션에 name, urlPatterns 속성을 작성할 수 있는데, 각각 서블릿의 이름을 부여하고, 서블릿에 맞는 URL을 매핑하기 위해서 사용합니다.

 

그리고 서블릿으로 만들 클래스는 HttpServlet 인터페이스를 상속 받아야 합니다.

 

 서블릿 컨테이너에 의해 알맞은 서블릿이 선택되면 service method를 실행하게 되고, HttpServlet 인터페이스를 상속 받은 클래스는 service를 overriding 할 수 있습니다.

service method가 인자로 HttpServletRequest, HttpServletResponse 객체를 입력 받는 것을 확인할 수 있는데, 이 두가지 객체가 WAS에 의해 client의 request에 따라 생성되는 두 가지 객체입니다.

 

이 두 개의 객체를 이용해서 client와 server간의 통신 과정에서 비즈니스 로직을 제외한 불필요한 과정을 효율적으로 처리할 수 있게 됩니다.

두 객체는 interface로 구현되어 있으며, WAS에 따라 표준에 따른 구현체를 구현해 사용하는 방식을 따른다고 합니다. (스프링에 의해 DI되는 것 같습니다.)

다시 코드로 돌아와서 getParameter라는 method를 살펴보겠습니다.

잘 전달된다.

해당 메서드를 활용하면, request에서의 query parameter로 "username"이라는 key로 전달된 value에 손쉽게 접근할 수 있습니다.

 

뿐만 아니라 setContentType method를 이용해 response message의 message body의 content-type을 지정하거나 encoding type을 지정하는 등, 다양한 기능을 서블릿을 사용해 추상화할 수 있게 됩니다.

728x90

'Back-end > java spring' 카테고리의 다른 글

[Spring MVC] MVC 패턴에 대해서  (0) 2023.03.20
[Spring MVC] HttpServletRequest, HttpServletResponse  (0) 2023.03.06
[JPA] JPQL 2 - 중급 문법 정리  (0) 2023.02.24
[JPA] JPQL 1 - 기본 문법 정리  (0) 2023.02.22
[JPA] 값 타입  (1) 2023.02.18

댓글