Servlet(서블릿)
자바를 이용한 웹 프로그래밍을 위한 기술
클라이언트가 어떠한 요청을 하면 그에 대한 처리를 수행하는 역할을 한다.
특징
클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
Java Thread 기반으로 동작
MVC 패턴에서 Controller 역할을 수행
HTTP 프로토콜 서비스를 지원하는
javax.servlet.http.HttpServlet
클래스를 상속 받음
동작 방식
사용자가 HTTP Request를 Servlet Container에 전달
요청을 받은 Servlet Container에서
HttpServletRequest
와HttpServletResponse
객체를 생성web.xml 기반으로 사용자가 요청한 서블릿 탐색
해당 서블릿에서
service()
메소드 호출service()
메소드에서 HTTP Method에 따라doGet()
,doPost()
등의 메소드 호출doGet()
,doPost()
등의 메서드에서 동적 페이지 생성생성한 동적 페이지를
HttpServletResponse
객체에 응답을 전송전송이 완료되면
HttpServletRequest
,HttpServletResponse
객체 소멸
Servlet Container
서블릿을 실행시키고 관리하는 역할을 하는 컴포넌트
서블릿 컨테이너는 클라이언트의 요청을 받아주고 응답할 수 있게 웹 서버와 소켓을 만들어 통신을 한다.(ex. tomcat)
Servlet Container의 역할
웹서버와 통신 지원
서블릿과 웹서버가 통신하기 위해 필요한 기능을 제공
통신을 하기 위해
listen
,accept
등을 사용해야하지만 서블릿 컨테이너에서 이러한 기능을 API로 제공하여 생략 가능
서블릿 생명주기 관리
서블릿의 생성, 초기화, 호출, 소멸 등의 생명주기를 관리
서블릿 클래스를 인스턴스화하여 초기화 메서드를 호출하고, 그 외에 요청이 들어오면 적절한 서블릿 메서드를 호출
서블릿이 더 이상 필요하지 않을 때 Garbage Collection을 수행
서블릿 객체를 싱글톤으로 관리
요청이 올 때마다 새로운 객체를 생성하는 것이 아니라, 미리 생성해둔 객체를 사용
최초 로딩 시점에 서블릿 객체를 생성하고, 요청이 올 때마다 새로운 스레드를 생성하여 서블릿 객체의 메서드를 호출
멀티 스레드 지원 및 관리
서블릿은 스레드로 동작하기 때문에 요청이 올 때마다 스레드 가져와 처리
멀티 스레드 부분을 관리하고, 스레드 풀을 사용하여 스레드를 재사용
개발자가 스레드를 직접 관리할 필요가 없이 싱글 스레드 프로그래밍 하듯이 편하게 개발 가능
선언적인 보안 관리
서블릿에 대한 보안을 관리를 해주어 보안 관련 코드를 작성하지 않아도 됨
Servlet Life Cycle
서블릿 클래스 로딩 및 인스턴스 생성
클라이언트 요청이 들어왔을 때 컨테이너에서 해당 서블릿이 메모리에 로딩되어 있는지 확인
없는 경우,
init()
메서드를 호출(init()
메서드는 서블릿이 최초로 요청되었을 때 한 번만 호출)
서블릿 서비스 메서드 호출
service()
메서드는 클라이언트의 요청 방식에 따라doGet()
,doPost()
등의 메서드를 호출
서블릿 소멸
컨테이너가 서블릿에 종료를 명령하면
destroy()
메서드를 호출
서블릿과 스레드 풀
요청이 많아지게 되면 스레드를 생성하고, 요청이 끝나면 스레드를 종료하는데 이 과정에서 많은 비용이 발생한다. 이러한 문제를 해결하기 위해 스레드를 미리 생성해두고, 요청이 들어오면 스레드를 가져오는 스레드풀 기법을 사용한다.
스레드 풀 기능을 사용하여 스레드를 풀 안에 미리 생성해두고 요청이 들어오면 풀에서 스레드를 가져와 사용하고, 사용이 끝나면 다시 풀에 반환
쓰레스 생성하고 종료하는 비용을 절약되고, 미리 생성해둔 스레드를 사용하는 것이기 때문에 응답 시간이 빨라짐
만약 최대 스레드를모두 사용하더라도, 요청을 거절하거나 대기시키는 정책을 사용하여 안전하게 처리 가능
특히 실무에서는 스레드 풀의 최대 스레드 수(max thread)를 적절하게 설정하는 것이 중요(적절한 스레드 수는 성능 테스트를 통해 확인)
참고자료
Last updated
Was this helpful?