개요
- 서블릿에대한 개념에 대해 이해해 보는 시간을 가져봅시다
서블릿(Servlet) 이란?
- 동적 웹페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 이다
- 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다
- 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹브라우저에 결과를 전송한다
- Ex)
- 서버에서 /login 서블릿 생성
- 컨트롤러가 아님 주의!
- 클라이언트 측에서 /login 경로로 데이터 전송
- /login 서블릿이 이를 감지하고, 매핑되며 데이터등을 수신 가능하다
- 서버에서 /login 서블릿 생성
서블릿의 주요 특징
- 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- 정적 웹 프로그램의 문제점을 보완하여 동적인 여러가지 기능을 제공
- JAVA의 쓰레드를 이용하여 동작
- MVC패턴에서 컨트롤러로 이용됨
- 컨테이너에서 실행
컨테이너란?
- 서블릿과 JSP 같은 웹 컴포넌트를 관리하고 실행하는 Java 애플리케이션 서버의 일부
- 웹서버와 Java 애플리케이션 사이에서 동작하며, 서블릿의 생명주기와 요청-응답처리 담당
- 클라이언트의 요청시, 필터처럼 바로 처리되는게 아니라 컨테이너 안에 들어온후 서블릿에 의해 처리되는 개념
- 보안 기능을 적용하기 쉬움
서블릿의 동작과정
- 대략적인 흐름은 아래와 같다
- 클라이언트 요청
- HttpServletRequest, HttpServletResponse 객체 생성 (컨테이너 내부에서)
- Web.xml이 어느 서블릿에 대한 요청인지 탐색
- 해당하는 서블릿에서 service() 메서드 호출
- doGet() or doPost() 호출
- 동적 페이지 생성후 HttpServletResponse 객체에 응답 전송
- HttpServletRequest, HttpServletResponse 객체 소멸
Web.xml?
- 서블릿을 작성하였다면 해당 서블릿을 사용자가 요청한 경로와 매핑시켜야한다
- 그래야 WAS에서 맵핑된 정보를 읽어서 브라우저에서 해당 URL로 HTTP요청시 보내 줄 수 있다
- 톰켓을 예로 들면 웹 애플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server 디렉토리의 Web.xml에 있다
서블릿의 생명주기
- 대략적인 흐름은 아래와 같다
- 클라이언트 요청
- 컨테이너는 서블릿이 메모리에 있는지 확인
- 존재함
-> init() 과정 생략 - 존재하지 않음
-> init() 메서드를 호출하여 메모리에 적재 - 실행중 서블릿이 변경될경우, 기존 서블릿을 destory()하고, init()을 통해 새로운 내용을 다시 메모리에 적재
- 존재함
- 컨테이너 내부에서 HttpServletRequest, HttpServletResponse 객체 생성
- 클라이언트의 HTTP요청에 따라 doGet(), doPost() 등으로 분기처리 된다 (각 분기처리로 넘어갈때 기존에 만들어진 HttpServletRequest, HttpServletResponse 두 객체가 넘어간다)
- doGet()
- doPost()
- doPut()
- doDelete()
- doOptions()
- ... 등등
- 요청에 대한처리가 완료되고 클라이언트에게 응답이 반환되었다면, 컨테이너는 관련된 HttpServletRequest, HttpServletResponse 객체를 소멸합니다
- 애플리케이션 종료와같은 이유로 서블릿 객체가 더이상 필요로 하지않을때, 컨테이너는 서블릿에게 종료 요청을하여 destory()를 통해 서블릿 객체를 제거합니다
( 서블릿 객체 자체는 싱글톤으로서 모든 요청,응답에 대해 공유하지만 HttpServletReqeust,Response는 각 요청,응답에 대해 고유하게 하나로만 존재한다)
서블릿 컨테이너
- 구현되어 잇는 servlet 클래스의 규칙에 맞게 서블릿을 담고 관리해주는 컨테이너
- 클라이언트에서 요청하면 컨테이너는 HttpServletReqeust,Response 두 객체를 생성하여준다 (이걸 서블릿이 만드는게 아니라 컨테이너가 만들고 넘겨주는거였군)
웹서버와의 통신 지원
- 서블릿과 웹서버가 손쉽게 통신할 수 있게 해준다
- 일반적으로 소켓을 만들고 listen, accpet등을 해야하지만 이러한 기능을 API로 제공하여 편리하게 이용하게 해준다
서블릿 생명주기 관리
- 서블릿 클래스를 로딩하여 인스턴스화하고, init(),service(),destory() 메서드를 호출한다
- 수명이 다된 서블릿을 적절하게 GC를 활용하여 막아준다
멀티쓰레드 지원 및 관리
- Request가 올때마다 새로운 Java 쓰레드 생성
- 각 요청이 올때마다 새로운 쓰레드가 생겨 독립적으로 실행되는군
- 이러한 연유로 쓰레드가 종료되면 쓰레드 풀로 반환하는 작업, 공유자원의 동기화문제, 시스템 자원의 문제 등등
- 공유자원의 동기화문제?
- 하나의 서버는 하나의 서블릿 객체를 가지고있고, 그 객체는 싱글톤이다
- 따라서 첫번째 요청에서 static으로 선언된 변수를 수정하고 있을때
- 두번째 요청에서 동일한 변수에 접근하게되면서 공유자원의 동기화 문제가 발생 할 수 있다
- 공유자원의 동기화문제?
- 이것들을 서블릿 컨테이너가 관리해준다는 의미
선언적인 보안관리
- 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도된다
- SpringSecurity를 활용하여 일일이 비즈니스 로직에서 인증,검증 로직을 하지않듯이
- 서블릿도 Web.xml파일의 구현을 통하여 가능하다는 의미
오늘 나는 무엇을 알았는가?
- servlet이란?
- 동적인 웹 페이지를 만들때 사용되는 객체
- 클라이언트의 요청 ->
- 서블릿 컨테이너 내부 진입 (HttpServetlReqeust,Response객체 생성) ->
- 메모리에 서블릿 객체가 존재하면 생성,없으면 생략 ->
- HTTP의 요청에 따라 doGet(), doPost()로 분기처리 ->
- 요청 처리후 HttpServletResponse에 응답값을 담아 반환
- HttpServetlReqeust,Response 소멸
- 애플리케이션 종료같은 상황일시, 컨테이너가 서블릿에게요청하여 서블릿 소멸
- 서블릿 컨테이너란?
- 서블릿을 실행하고 환경을 관리하는 Java 웹 애플리케이션의 서버 구성 요소
- init(), doGet(), destory() 등등
참조 문헌
https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80
'SpringBoot' 카테고리의 다른 글
다양한 상황에서의 DB에 저장하는 시간을 알아보자 (0) | 2025.02.26 |
---|---|
Redis에 엔티티 저장중 생긴 순환참조문제 (0) | 2025.01.23 |
JSP 란? (1) | 2025.01.21 |
JPA Cascade ? (2) | 2025.01.20 |
디스패처 서블릿(Dispatcher-Servlet) ? (0) | 2025.01.20 |