서블릿?
Dynamic Web Page를 만들 때 사용되는 자바 기반 웹 애플리케이션 프로그래밍 기술
Reqeust, Response를 간단한 메소드 호출로 다룰 수 있게 해주는 기술
서블릿은 자바 기반 컨테이너
과정
1. 사용자 URL 입력, HttpRequest 가 서블릿 컨테이너로 전송
2. 요청 받은 서블릿 컨테이너는 HttpRequest를 HttpServletRequest, HttpServletResponse 객체 생성
3. Web.xml 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 탐색
4. 해당 서블릿에서 service() 호출
5. 클라이언트의 Get, Post여부에 따라 doGet(), doPost() 호출
6. doGet(), doPost() 메소드는 동적 페이지를 생성
7. HttpServletResponse객체에 응답을 담아 전송
8. 응답 종료 시 HttpServletRequest, HttpServletResponse 객체 소멸
※ web.xml : 서블릿을 작성했다면, 해당 서블릿을 사용자가 요청한 경로와 맵핑시켜야 WAS에서 맵핑된 정보를 읽어서 브라우저에서 해당 URL로 HTTP요청 시 해당 서블릿으로 요청을 전달 가능
톰캣을 예로 들면 웹 어플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server디렉터리의 web.xml
서블릿 예시
public class FirstServlet extends HttpServlet {
@Override
public void init() {
...
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
...
}
@Override
public void destroy() {
...
}
}
특징
- 사용자 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- 기존 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 기능 제공
- Java 스레드 이용하여 동작
- MVC패턴에서 Controller로 동작
- 컨테이너에서 실행
- 쉽게 보안 적용 가능
- javax.servlet.http.HttpServlet 클래스 상속
- UDP보다 속도 느림
- HTML 변경 시 Servlet 재컴파일 필요
서블릿 생명주기
1. Servlet Request, Servlet Response 객체 생성
2. 설정 파일 참고하여 매핑할 서블릿 확인
3. 해당 서블릿 인스턴스 존재 유무 확인, 없을 경우 init() 메소드 호출하여 생성
4. 서블릿 컨테이너에 스레드 생성하고 service() 실행
5. 응답 처리 후 destroy() 호출하여 Servlet Request, Servlet Response 객체 소멸
(init(), destroy() 메소드는 오버라이딩하여 초기화, 소멸 시의 동작 구현 가능)
init()
서블릿이 처음 요청 될 때 초기화 하는 메소드
초기화된 서블릿은 싱글톤으로 관리되어 다음에 한번 더 호출 시, 기존에 생성된 서블릿 클래스 호출
service()
서블릿 컨테이너가 요청을 받고 응답을 줄때 필요한 메소드
Servlet interfatce를 구현한 HttpServlet 클래스의 doGet(), doPost() 와 같은 메소드 호출
destory()
더이상 사용되지 않는 서블릿 클래스는 서블릿 컨테이너가 주기적으로 destory() 메소드 호출하여 제거
제거된 서블릿은 service메소드들에 해당하는 모든 스레드가 종료되거나, 타임아웃 된 경우에는 이 클래스 다시 사용 위해 init() 재필요
서블릿 설정파일
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet> //서블릿 클래스를 서블릿으로 등록
<servlet-name>myServlet</servlet-name> //해당 서블릿을 참조할 때 사용할 이름
<servlet-class>controller.MyServlet</servlet-class> //서블릿으로 사용할 서블릿 클래스의 FullName
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name> //매핑할 서블릿의 이름
<url-pattern>/myServlet</url-pattern> //매핑할 URL 패턴
</servlet-mapping>
</web-app>
서블릿 작성 시, 해당 서블릿을 사용자 요청 경로와 매핑해야 WAS에서 그 정보로 HTTP요청 시 해당 서블릿으로 요청 전달 가능
서블릿 컨테이너?
문자 그대로 서블릿을 담고 관리하는 컨테이너
구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리
사용자 요청 시 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체 생성
Post, Get 여부에 따라 동적인 페이지 생성하여 응답 리턴
HttpServletRequest
Http프로토콜의 Request 정보를 서블릿에게 전달하기 위한 목적으로 사용
Header 정보, 파라미터, 쿠키, URI, URL등의 정보를 읽는 메소드와 Body의 Stream을 읽는 메소드 존재
HttpSejrvletResponse
요청을 보낸 사용자에게 응답을 보내기 위한 HttpServletResponse 객체 생성 후 서블릿에 전달
이 객체를 활용하여 Content type, 응답 코드, 응답 메시지 등을 전송
서블릿 컨테이너의 주요 기능
1. 생명주기 관리
서블릿의 생명주기 관리
서블릿 컨테이너가 실행되는 순간 서블릿 클래스를 로딩해서 인스턴스화, 초기화 메소드 호출
Request가 오면 적절한 서블릿 메소드를 찾아서 동작
서블릿 생명이 다하는 순간 가비지 컬렉션을 통해 메모리에서 제거
2. 통신 지원
사용자의 Request를 받고 Response를 보낼 수 있게 웹 서버와 소켓을 만들어 통신
(소켓 생성, 포트 리스닝, 연결 요청 시 Stream 생성 후 요청 수용 등의 과정을 서블릿 컨테이너가 대신)
listen, accept 등의 기능을 API로 제공하여 복잡한 과정을 생략하고 비즈니스 로직에 집중할 수 있게 해줌
3. 멀티스레딩 관리
Rquest를 받고 해당 서블릿의 요청이 들어오면 스레드를 생성해 작업 수행
HTTP service() 메소드 호출, 실행 후 스레드 소멸
동시에 여러 요청이 와도 멀티스레딩 환경으로 동시다발적인 작업 관리 가능
+ 메모리에 올라간 스레드는 다시 생성할 필요 X >> 메모리 관리에 효과적
4. 선언적인 보안관리
서블릿 컨테이너는 보안 관련 기능 지원
개발자는 보안 관련 내용을 서블릿이나 자바 클래스에 구현하지 않아도 됨
일반적으로 XML 배포 서술자에 보안관리를 기록하므로, 보안에 대해 수정할 일이 생겨도 자바코드를 수정하는 일 X
>> 수정마다 재컴파일 불필요
'끄적 > BE' 카테고리의 다른 글
Spring Security (0) | 2023.07.18 |
---|---|
TCP UDP (0) | 2023.02.05 |
JPA vs MyBatis (0) | 2023.01.11 |
JPA N+1 (0) | 2023.01.11 |
Spring / Spring Boot (0) | 2023.01.09 |